AWSコンテナ設計・構築本格入門のおかげでなんとかECSを触れるようになったので、playframeworkを動かすところまで整理。
ECS Fargete1.4
CDK 2.3
です。参考書籍はCloudFormationと一部consoleからの手作業でしたが、CDK & 全部自動化が目標
完成品(仮)はこちら
https://github.com/tky/play-ecs-template
ap-northeast-1に作ると今ある何かとぶつかるんじゃないかと思ってap-northeast-2に作ります。
vpcも10.1.0.0/16で作ります。
自動化できていないところ
- nginxのlocationでLoad BalancerのDNSを手動で設定しないといけない
- fluent-bitで出力するs3 bucketの作成とextra.confの編集
nginxのほうはService Discoveryで解決できそうなのでなんとかしたいところです。
まだやっていないところ
- DBの作成
step1. VPCとか作る
nginxようのsubnet2つ
applicationようのsubnet2つ
Databaseようのsubnet2つ(まだ使ってない。。)
VPC Endpointようのsubnet2つ
管理ようのsubnet1つ(これもまだつかってない。。)
VPC Endpoint作成
と各種セキュリティグループ作ります。
$ cd cdk
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ cdk deploy NetworkStack
step2. playframeworkのclusterを作成
ECR作成
$ cd cdk
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ cdk deploy EcrStack
imageを登録
$ cd application
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ docker image build -f docker/Dockerfile_app_prd -t sample .
$ docker image tag sample ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/sample
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/sample
clusterを作成
$ cd cdk
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ cdk deploy ApplicationStack
Step3. nginxのclusterを作成
nginxのdefault.confのlocationをstep2で作ったELBに書き変える。
(このあたりService Discovery使えればいいんでしょうが。。)
https://github.com/tky/play-ecs-template/blob/master/nginx/default.conf
nginxのimage作成してECRに登録
$ cd nginx
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ docker image build -t nginx .
$ docker image tag nginx ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/nginx
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/nginx
fluent-bitのimageを作成してECRに登録
ログの保存先を指定する必要があります。
適当にs3 bucketつくってextra.confを編集してください。
https://github.com/tky/play-ecs-template/blob/master/log-router/extra.conf
bucket play-ecs-template-log-bucket // ここのところを作ったものに変える
imageを作成して登録
$ cd log-router
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ docker image build -t log-router .
$ docker image tag log-router ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/log-router
$ aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com
$ docker image push ${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-2.amazonaws.com/log-router
clusterを作成
$ cd cdk
$ export AWS_ACCOUNT_ID=${YOUR_AWSACCOUNT_ID}
$ cdk deploy FrontStack
nginx, application両方ともECS Execでログインできます。
ハマったところ
CDKのversionが違う
現時点だとネットの情報は大体1系なのでimportの@aws-cdkをaws-cdk-libにする。
例
import * as ec2 from "@aws-cdk/aws-ec2";
-> import * as ec2 from "aws-cdk-lib/aws-ec2";
いろんなリソースを勝手に作ってしまう
ec2.Subnetとか自動で色々作ってくれて便利な反面、細かい制御ができなかったりする。
そう言う場合はCfnSubnetつかえば何とでもなる。
大体CfnXXXが存在するみたい。
参考文献など
AWSコンテナ設計・構築本格入門
https://dev.classmethod.jp/articles/ecs-exec/
https://zenn.dev/xeres/articles/2021-12-08-aws-cdk-ecs-patterns-and-ecs-exec
https://zenn.dev/hkdord/articles/process-of-writing-cdk
https://github.com/aws-samples/aws-cdk-examples