
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を使っているよ。

必要なパッケージを入れている。まあ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に移動し

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

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

「同期中」になるのを待つ
そうしたら

こんな感じになるんじゃねえかなあ〜
次回は
環境変数からの設定の注入を行っていくよ〜