見出し画像

php5アップローダーをECSに配置する(1) - RDSとの接続メイン


これも

今、現状mysql8を使ってローカルにアップロードしている、ってことは最低限RDSが必要ってことだ。

とりあえず1タスクのdockerイメージを動作させることを目指す

ってことはまずはDBとファイルである。このケースの場合1つずつ潰していった方がいいのだが、まずはDBとの接続だ。

RDSの作成

これはdefault vpcのサブネットで非常に雑に作った。ただ、mysqlエンジンにしてバージョンは8にする。ある程度ではあるが無料枠の範囲で作れるからテストはこれで大丈夫だろう。

  • Name: uploader-demo

  • USER: admin

  • PASSWORD: password

という雑極まりない感じで作成している。nameっていっても別にそういう名前のdatabaseが出来るわけじゃないので後で作る



謎にarm64のcpuにしている

ECSの前にまずEC2で接続せよ

どうせメンテナンス用で1つ使うんだし。本当は先に作っておくとRDS作成ウイザードのときに指定できたりもあるんだけどもっていう。今回はdebianを使っているよ。

dbmaintという名前で起動している

必要なパッケージを入れている。まあmysqlコマンドとgitコマンドが使えりゃいい

admin@ip-172-31-10-144:~$ sudo apt update; sudo apt install -y mariadb-client git

ここでdockerを起動して確認してもいいんだが、まああんま意味ないからしない。mariadb-clientを使う事でとりあえずmysqlが使えるようになっているので、接続してみる。エンドポイントはRDSのところから検索してくる


$ mysql -uadmin -ppassword -huploader-demo.cmxstlofflyf.ap-northeast-1.rds.amazonaws.com

としても応答がない


ここではmysqlとかいう3306を開放するセキュリティーグループを作っておいたので、このように開放していく。まあこの辺はあんま解説しませんよ。


接続できた

ただ、

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.005 sec)

DBはまだ出来ていない。まあ作っといてもいいか。ここではuploader_demoとする

MySQL [(none)]> create database uploader_demo;
Query OK, 1 row affected (0.006 sec)

スキーマ入れる

git cloneでソースをひっぱっておいて

$ git clone https://gitlab.com/catatsumuri/old-style-php5-uploader.git
Cloning into 'old-style-php5-uploader'...
remote: Enumerating objects: 32, done.
remote: Counting objects: 100% (32/32), done.
remote: Compressing objects: 100% (22/22), done.
remote: Total 32 (delta 5), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (32/32), 10.60 KiB | 3.53 MiB/s, done.
Resolving deltas: 100% (5/5), done.

こんな感じでいれる

$ mysql -uadmin -ppassword -huploader-demo.cmxstlofflyf.ap-northeast-1.rds.amazonaws.com uploader_demo < init/schema.sql

一応確認しとこか?

MySQL [uploader_demo]> show tables;
+-------------------------+
| Tables_in_uploader_demo |
+-------------------------+
| uploaded_files          |
+-------------------------+
1 row in set (0.003 sec)

MySQL [uploader_demo]> show create table uploaded_files\G
*************************** 1. row ***************************
       Table: uploaded_files
Create Table: CREATE TABLE `uploaded_files` (
  `id` int NOT NULL AUTO_INCREMENT,
  `original_name` varchar(255) NOT NULL,
  `saved_name` varchar(255) NOT NULL,
  `mime_type` varchar(50) DEFAULT NULL,
  `size` int NOT NULL,
  `uploaded_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.002 sec)

本番接続確認用スクリプトを作っておく

特にphpの環境が古いとまず一発で接続できないので、checkdb.phpみたいなのを作ってECRに含めておく。これは最終的に環境変数のチェックにも使えるので多分あった方がいい。

check.php 

<?php
require_once './vendor/autoload.php';


$dsn = 'mysqli://admin:password@uploader-demo.cmxstlofflyf.ap-northeast-1.rds.amazonaws.com/uploader_demo?charset=utf8';

$mdb2 = MDB2::connect($dsn);
if (PEAR::isError($mdb2)) {
    r($mdb2->getDebugInfo());
    exit;
}

$mdb2->setFetchMode(MDB2_FETCHMODE_ASSOC);
r($mdb2->queryAll("SELECT * from uploaded_files"));

まあ何か秒で書いたけど、こんな感じだろう。

ECRの作成

今、手元にdockerイメージがあるが、これをECR用に組み立てなければならない。今docker/php/Dockerfile が存在している

FROM php:5.6-apache

RUN sed -i 's/deb.debian.org/archive.debian.org/g' /etc/apt/sources.list
RUN sed -i '/stretch-updates/d' /etc/apt/sources.list
RUN sed -i '/security.debian.org/d' /etc/apt/sources.list
RUN apt update

# bcmath module
RUN docker-php-ext-install bcmath
# mysql module
#RUN docker-php-ext-install mysql
RUN docker-php-ext-install mysqli

# set timezone
RUN echo 'date.timezone = "Asia/Tokyo"' >> /usr/local/etc/php/conf.d/docker-php-timezone.ini;

# composer
RUN apt install -y unzip
ENV COMPOSER_HOME /composer
ENV PATH $PATH:/composer/vendor/bin
COPY --from=composer:1 /usr/bin/composer /usr/bin/composer


#RUN docker-php-ext-install pdo_mysql


# zip module
#RUN docker-php-ext-install zip

これは開発用としてはいいんだけど、本番用ではちょっとものたりないのでトップにDockerfile.prod なんかを作ってみた 

# プロダクション用Dockerfileの例
FROM php:5.6-apache

# 既存のコマンドを使用
RUN sed -i 's/deb.debian.org/archive.debian.org/g' /etc/apt/sources.list && \
    sed -i '/stretch-updates/d' /etc/apt/sources.list && \
    sed -i '/security.debian.org/d' /etc/apt/sources.list && \
    apt update && \
    docker-php-ext-install bcmath mysqli && \
    echo 'date.timezone = "Asia/Tokyo"' >> /usr/local/etc/php/conf.d/docker-php-timezone.ini && \
    apt install -y unzip


# プロジェクトのソースコードをコピー
COPY . /var/www/html

このようにしてもいいんだけど、イメージに含める必要のないものを.dockerignoreに書いておいてもいい

% ls
Dockerfile.prod  composer.json  config  docker-compose.yml  index.php  logs    templates    vendor
checkdb.php      composer.lock  docker  ecrpush.sh          init       stored  templates_c

パっとみた限り、実は必要なのはconfig, index.php, templates だけだったりすんだねこれが

.dockerignoreの設定

.dockerignore
Dockerfile
Dockerfile.prod
docker-compose*.yml
docker/
init/
.editorconfig
.git/
.gitignore

このようにした。

vendor/ の扱い

今、開発用のvendor/ ディレクトリを全部コピーしているがdocker build時にcomposerを走らせても、もちろんよい。ただ、今のプログラムが化石みたいな感じなので、とりあえずvendorも内包させるようにしている。これは必要に応じて後々チューニングしよう。

ECRにプライベートリポジトリを作る

先にこれやっとこ。

awsコマンドでecrにプッシュできる権限を付けといて。詳しくは以下で

ビルドとプッシュ

ローカルイメージを作る

% docker build -f Dockerfile.prod -t simple_uploader:latest .

タスク定義

とくに語り所もないな.最小構成でdesired countは1とする

DB接続との戦い

ここまできたら、先程書いたcheckdb.php にアクセスできているはずだ(できてますよね?)


はいでました

_doConnect: [Error message: Server sent charset unknown to the client. Please, report to the developers]
[Native code: 2054]
[Native message: Server sent charset unknown to the client. Please, report to the developers]

これは開発環境はconfを弄ったけどRDSはパラメーターグループを調整しないといけない。

パラメーターグループの調整

RDSに移動し、パラメーターグループに移動する

パラメーターグループの作成を行い

mysql8.0を元に自分で作る


これで雛形を全てコピーされている状態なので、この状態を元に弄るという概念だ。ここで編集を押し


charとかで検索すると


諸々現れる。しかし間違えてはいかん。これこのcharacter_set_serverをUTF-8にする


これを保存してこれでRDSに移動し


これを置き換える。すぐに適用すると


「設定」を見ればこんな感じになる。再起動を保留とかいわれたらもう再起動とか何でもかんでもやって


「同期中」になるのを待つ

そうしたら


こんな感じになるんじゃねえかなあ〜

次回は


環境変数からの設定の注入を行っていくよ〜

この記事が気に入ったらサポートをしてみませんか?