Laravel + nginxをFargateにデプロイするまでの記録
■以下ドキュメントを実施し、理解を深める
■以下の記事を参考に、上記で作ったECRイメージをサービスとしてデプロイ実施し、Hello worldされることを確認。
更にこちらの記事を実践し、nginxコンテナデプロイ + index.htmlの中身を書き換えるところまで完了 以下の手順により、nginxのhtmlファイル群を変更しデプロイ実施。
- Dockerfileと同じパスにファイル追加
- Dockerfile編集保存(COPYコマンドでコンテナにファイルコピー)
- ビルド実施
docker build -t nginx-test . - docker runしてローカルで動作確認
docker run -itdp 80:80 nginx-test - docker tag実施
docker tag nginx-test:latest [account_number].dkr.ecr.ap-northeast-1.amazonaws.com/index:[通番] - docker push実施
docker push 845660134338.dkr.ecr.ap-northeast-1.amazonaws.com/index:[通番] - AWSコンソールで
ECS>タスク定義>タスク定義名にチェックを入れて「新しいリビジョンの作成」 -
コンテナ名>イメージで通番変更し保存 -
ECS>クラスター>サービスでサービス名にチェックを入れて「更新」 -
タスク定義>リビジョンで最新の通番を選択し更新実施 - ALBのDNSから飛んで変更反映されていることを確認する
nginxにログインしたい時は
docker exec -it [container_name] /bin/sh
Laravel + nginxコンテナをfargate にデプロイ
こちらの神電子書籍を元に実践
Laravelを更新してタスク更新
基本はこれをなぞる https://zenn.dev/shivashi/scraps/cedf3d71405cca#comment-8b7360e0b171a1
ローカルでビルドしたイメージを確認する時はdocker-compose up
プライベートサブネットにFargate配置
最終目標
コンテナ周りは上記電子書籍、ネットワーク周りはこちらの記事を参考にやってみる
1. ネットワーク構築
まずこれを目指す!
-
VPC作成
10.0.0.0/16のVPCを作成 -
サブネット作成
以下のサブネットを作成名称 IP AZ public-1a 10.0.0.0/24 1a private-1a 10.0.1.0/24 1a public-1c 10.0.2.0/24 1c private-1c 10.0.3.0/24 1c -
IGW作成
作成後VPCをアタッチ -
パブリックサブネット用ルートテーブル作成し、public-1a及びpublic-1cに割り当て
送信先 ターゲット 0.0.0.0 IGWのID -
セキュリティグループ作成
ALB用とFargate用でそれぞれ作成名称 タイプ ソース ALB-sg HTTP、HTTPS 任意の場所 Fargate-sg HTTP ALB-sg -
ALB構築
項目 設定内容 サブネット public-1a, public-1c セキュリティグループ ALB-sg ターゲットの種類 IP プロトコル HTTP
ここまでで一旦パブリックサブネットに踏み台用EC2、プライベートサブネットにWebサーバ用EC2を設置し、ALBのDNSからWebアクセスできることを確認
2. PrivateLink構築
次はこれ
プライベートサブネット内のコンテナについて、インターネットからのWebアクセスはALBのみでOKだが、ECRからイメージをPullするには、コンテナからAWSリソースへアクセスするための別口が必要となる。そのためにPrivateLinkをVPCに設定。
プライベートサブネットにfargateを配置する場合では以下のエンドポイントが必要
| エンドポイント名 | 用途 |
|---|---|
| ecr.dkr | ECR通信用 |
| ecr.api | ECR通信用 ※ |
| s3 | s3通信用(docker imageの実態がS3に保存されているため) |
| logs | CloudWatch用 |
※ecr.apiについてはこちらを参照 ※他にParameterStoreやSecretsMnagerから情報を取得する必要がある場合は別途VPCエンドポイントを設ける必要がある。こちらを参照。 今回はParameterStoreから環境変数を取得したいのでssmエンドポイントも準備します。
- PrivateLink用のセキュリティグループを作成
Fargateを設置するPrivateSubnetからのHTTPSアクセスを許可(インバウンド) -
VPC>エンドポイント>エンドポイントの作成から、上記4つのエンドポイントを作成する。
※ssmエンドポイントも作るので合計5つecr.dkr s3 logs サービスカテゴリ AWSサービス AWSサービス AWSサービス サービス名 com.amazonaws.ap-northeast-1.ecr.dkr com.amazonaws.ap-northeast-1.s3 com.amazonaws.ap-northeast-1.logs タイプ Interface Gateway Interface VPC 作ったやつ 作ったやつ 作ったやつ サブネット private-1a, private-1c - private-1a, private-1c ルートテーブル - private-1a, private-1c - プライベートDNS名有効 ON - ON セキュリティグループ Link用に作ったやつ - Link用に作ったやつ
3. ECR作成
これを元に実施 https://zenn.dev/shivashi/scraps/cedf3d71405cca#comment-34b22c56bb53d7
4. クラスタ作成
『ネットワーキングのみ』を選択し、作成実施。
5. タスク定義
例によりこちらを参考に作成。 https://zenn.dev/shivashi/scraps/cedf3d71405cca#comment-34b22c56bb53d7
jsonファイルからCLIでタスク定義を展開するやり方だが、"image"、"awslogs-group"の名前を実際のものに合わせて変更する(この時にCloudWatchのロググループやParameterStoreの準備がまだな場合、タスク定義コマンド実行前のこのタイミングでもろもろ作っておきます。)
6. サービスの作成
こちらも例の神電子書籍を、、!!
サービス名、VPC、サブネット、LoadBalancerあたりを自分で作ったやつに合わせる。
タスクの数、最小ヘルス率、最大率はデフォルトで(これで常時2タスク、最大4タスクになる)
7.動作確認
ALBのDNS名からアクセス!