【ソース有】【チュートリアル】ECSでlaravel(11)をSQLiteでとり急ぎ動作させる(改訂版) 〜 デプロイ編
完全に前回の続き。ここでは作成したソースコードをgithubから取得し、起動を確認した後これをECSにデプロイしていく。
前回までの制作物は弊githubに置いてある https://github.com/catatsumuri/ecr-ecs-fargate-setup/tree/main/002-laravel-completed
前回の記事を見る必要は無いが、制作課程をご覧になりたい場合は上記リンクを辿っていただけるとよいかと思う。
デプロイ元のEC2を起動
ここでもt4g.small
(ARM64)を起動し、ボリュームに20G
ほどを当てた。ポートは22
と80
を開放しsshする。
ログインして最低限の環境構築
sudo apt update; sudo apt install git docker-compose -y
sudo adduser admin docker
ちゃっちゃと必要環境を入れる。再ログインして作業を開始
$ id
uid=1000(admin) gid=1000(admin) groups=1000(admin),4(adm),20(dialout),24(cdrom),25(floppy),27(sudo),29(audio),30(dip),44(video),46(plugdev),109(docker)
作成済み弊githubからソースを落としてくる
git clone https://github.com/catatsumuri/ecr-ecs-fargate-setup.git
cd ecr-ecs-fargate-setup/002-laravel-completed/
ここでは002を使う
こんな感じの構造だ
.
├── .dockerignore # Dockeイメージに取り込まないファイル
├── README.md
├── srv
│ ├── README.md
│ ├── Dockerfile # nginxとphp-fpmのイメージを作成するDockerfile
│ ├── default.conf # nginxのconfig
├── laravel-app # laravelアプリケーション(breezeを展開しただけ)
│ ├── ....
README.md に書いてあるように、ビルドしていく
docker build -t my-ecs-php-fpm -f ./srv/Dockerfile --target=php-fpm .
docker build -t my-ecs-nginx -f ./srv/Dockerfile --target=nginx .
まあ起動してない段階でdownする必要はないので普通にupすると
docker-comose up
このようにlaravelのトップが表示されるはずで
test@example.com / passwordでログインできる事を確認しておく。
ECRにリポジトリを作る
ここからAWSの操作になる。https://ap-northeast-1.console.aws.amazon.com/ecr/private-registry/repositories?region=ap-northeast-1 この辺のリンクより
リポジトリを作成する
このように practice/my-ecs-nginx
を作る。同様の作業でpractice/my-ecs-php-fpm
も作る
このような形でURIがコピーできるようになっているので、メモっておくとよい
ECRリポジトリにアクセスするためのユーザーおよびキー
実際には、EC2で作業している場合、あえてユーザーを作成する必要は一切なく、EC2に適切なロールを割り当てれば済む話なのであるが、それはいずれやるかもしれないし、やらないかもしれないとして、ここではより汎用的な作業であるAWSキーを使ったイメージ転送作業を行ってみよう。
https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-1#/users ここではecs-practice
という名前のユーザーを作成している
ここでAmazonEC2ContainerRegistryFullAccess
を割り当てている。
ユーザーが作成できたらアクセスキーを作成する
ユースケースはその他とする
ここでこのようにキーが生成されるので、冒頭SSHしてdockerイメージを作成したホストで
aws configure
し
- AWS Access Key ID
- AWS Secret Access Key
- Default region name
をそれぞれ書き込む。Default region name
はap-northeast-1
でいいと思う
- Default output format
はnone(default)でいい
イメージの作成とpush
default.confの問題
ここでは
practice/my-ecs-nginx
practice/my-ecs-php-fpm
の2イメージについてローカルで作成しそれをpushしていくのであるがECSの場合はnginxとphp-fpmの通信はlocalhostで行う必要がある。従ってdefault.confを以下のように書き換える
--- a/002-laravel-completed/srv/default.conf
+++ b/002-laravel-completed/srv/default.conf
@@ -30,7 +30,7 @@ server {
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
- fastcgi_pass php-fpm:9000;
+ fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /srv/public$fastcgi_script_name;
include fastcgi_params;
ただし、もちろんlocalのdocker-composeで起動すると127.0.0.1と通信できないので以下のようになる
ローカルでの環境を修正
ローカルのdocker-composeでは127.0.0.1
ではなくphp-fpm
で通信したい。この場合configを2つ用意して上書きmountする方法とかあるんだけど、設定が2ファイルあるといかにも混乱しやすいので以下のようにdocker-compose.ymlを書き換えて強制的に設定を編集してから起動させるようにしてみた
@@ -16,6 +16,17 @@ services:
- php-fpm
networks:
- app-network
+ environment:
+ - USE_LOCALHOST=false # Docker Compose では php-fpm:9000 にする
+ entrypoint: ["/bin/sh", "-c"]
+ command:
+ - |
+ if [ "$USE_LOCALHOST" = "true" ]; then
+ sed -i 's/fastcgi_pass php-fpm:9000;/fastcgi_pass 127.0.0.1:9000;/g' /etc/nginx/conf.d/default.conf;
+ else
+ sed -i 's/fastcgi_pass 127.0.0.1:9000;/fastcgi_pass php-fpm:9000;/g' /etc/nginx/conf.d/default.conf;
+ fi
+ nginx -g 'daemon off;'
diffしか置いていないが、全文はgithubから必要に応じて参照 (TODO: github...)
回復した事を確認
ECRにpushしていく
ECRにログイン
まず、ログインを確認する。ここまででAWSキーがセットされているので以下のようにしてログインが可能である。
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ****.dkr.ecr.ap-northeast-1.amazonaws.com
ログイン完了
念のため、それぞれビルド
# PHP-FPM のビルド
docker build -t my-ecs-php-fpm -f ./srv/Dockerfile --target=php-fpm .
# Nginx のビルド
docker build -t my-ecs-nginx -f ./srv/Dockerfile --target=nginx .
ビルド完了
転送用にタグを付ける
# PHP-FPM のタグ付け
docker tag my-ecs-php-fpm ****.dkr.ecr.ap-northeast-1.amazonaws.com/practice/my-ecs-php-fpm:latest
# Nginx のタグ付け
docker tag my-ecs-nginx ****.dkr.ecr.ap-northeast-1.amazonaws.com/practice/my-ecs-nginx:latest
タグ付け完了
pushして転送
# PHP-FPM の push
docker push ****.dkr.ecr.ap-northeast-1.amazonaws.com/practice/my-ecs-php-fpm:latest
# Nginx の push
docker push ****.dkr.ecr.ap-northeast-1.amazonaws.com/practice/my-ecs-nginx:latest
pushされた
転送の確認
aws ecr describe-images --repository-name practice/my-ecs-php-fpm --region ap-northeast-1
aws ecr describe-images --repository-name practice/my-ecs-nginx --region ap-northeast-1
digestハッシュが一致しているか見ておくとより万全だ
これでイメージがECRに転送できた
タスク定義の作成
ECSからタスク定義: https://ap-northeast-1.console.aws.amazon.com/ecs/v2/task-definitions?region=ap-northeast-1 とかのurl
新しいタスク定義の作成
ここではlaravel-practice
という名前にした
起動タイプがAWS Fargate
である事を確認し、アーキテクチャーはLinux/ARM64
にしている。これは作成したEC2のアーキテクチャーに合致させること。
- CPU
.25 vCPU
- メモリ
.5 GB
としている
下にスクロールさせ、コンテナ1の設定であるが、ここではnginxの設定から
イメージuriは
****.dkr.ecr.ap-northeast-1.amazonaws.com/practice/my-ecs-nginx:latest
という:lates
tを含む型式で指定しても、しなくてもいいのだがここでは指定している。指定しないとlatest
が使われる
続いてコンテナを追加する
コンテナ2も同様に設定していく。必須コンテナは「はい」
下にスクロールさせ「環境変数」でAPP_KEY
をセットする。ここではdocker-compose.yml
でセットしたものを指定しているが、もちろんartisan key:generate --showで再生成してもよい
なお、こちらはポートマッピングには「何も指定しない」
これでタスク定義は完成
クラスターの配置とサービス
クラスターの作成
今、何もクラスターを作ってないと思うので、とりあえず何か作る。 https://ap-northeast-1.console.aws.amazon.com/ecs/v2/create-cluster?region=ap-northeast-1 より
名前は比較的何でもいい
サービスの作成
クラスターの作成が完了したら中に入ってサービスの作成をする
キャパシティープロバイダー戦略
に「なってない」事を確認
先程設定したタスク定義の名前とリビジョンが「最新」になっている事を確認
サービス名はlaravel-practice-service
とした
なお、ここは非常に重要で、タスクの数が1になっている事を確認
以上で完成
完成したサービスのタスクを確認する
うまく動作すると 1/1 件の実行中のタスク
などとなる。ここでサービスの詳細に入る
タスクタブからタスクの詳細に入っていく
ネットワーキングから当該のグローバルIPをメモって
ブラウザーでアクセス
ログインも確認しておく
確認終了後、タスクの数を0にセットし課金されないように
サービスに戻ってきて「サービスを更新」
必要な数を0にする
以上
何事も問題なくデプロイできた場合以上の手順で出来るはずだ。
本稿のまとめ
- nginxイメージとphp-fpmイメージの通信を
localhost
に変更する- この際docker-composeでの通信がおかしくなるため通信先を強制的に変更
- 作業用EC2を1つ準備した
- ECRリポジトリにアクセスするためのユーザーを作成
- 権限を
AmazonEC2ContainerRegistryFullAccess
にセット - アクセスキーとシークレットを生成
- 準備したEC2に
aws configure
でキーをセット
- 権限を
- ECRにログインしてpushの準備をする
- それぞれ念のためビルド
- それぞれにタグ付け
- それぞれをpush
- pushされたものを
aws ecr describe-images
で確認
- タスク定義で起動設定を行う
- クラスター作る
- サービス作る
- 起動されたタスクを確認する
- タスクカウントを0にセットし課金されないようにして作業終了
とまあ、テスト環境を作るだけで実に作業てんこ盛りなのだが、まだこれ確認作業でproductionには全く使えないので、ここまでさらさらっと出来るようにならないといけない。おそらく、繰り返しやって慣れるしかないんだね、インフラは。
Discussion