📖

【ソース有】【チュートリアル】ECSでlaravel(11)をSQLiteでとり急ぎ動作させる(改訂版) 〜 デプロイ編

2025/02/09に公開

https://zenn.dev/catatsumuri/articles/ae372649d86149

完全に前回の続き。ここでは作成したソースコードをgithubから取得し、起動を確認した後これをECSにデプロイしていく。

前回までの制作物は弊githubに置いてある https://github.com/catatsumuri/ecr-ecs-fargate-setup/tree/main/002-laravel-completed

前回の記事を見る必要は無いが、制作課程をご覧になりたい場合は上記リンクを辿っていただけるとよいかと思う。

デプロイ元のEC2を起動

ここでもt4g.small(ARM64)を起動し、ボリュームに20Gほどを当てた。ポートは2280を開放し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 nameap-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を以下のように書き換える

srv/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を書き換えて強制的に設定を編集してから起動させるようにしてみた

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

という:latestを含む型式で指定しても、しなくてもいいのだがここでは指定している。指定しないと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