playframeworkで作ったアプリケーションをECSで動かす

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ようのsubnet２つ
applicationようのsubnet２つ
Databaseようのsubnet2つ（まだ使ってない。。)
VPC Endpointようのsubnet２つ
管理ようのsubnet１つ(これもまだつかってない。。)
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://www.sbcr.jp/product/4815607654/)
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