AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~Fargate+ECSの構築~

# 前記事
[AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~ECRへのビルド~](https://qiita.com/bakuchiku/items/6ffd113fa869375d78ab "AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~ECRへのビルド~")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/80a3560e-9246-5ba0-d84e-b53770c0c12b.png)

# 今回やること
Fargate+ECSの構築！！
Brue/Greenデプロイメント環境の構築！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/9d73088c-f5a2-b22c-dbc5-387a7217df33.png)

分けるのも難しかったのでドカッと進みます。
大きく分けると以下2点ですかね、
* Brue/Greenデプロイメント用ALBの構築
* ECS Clusterの作成

頑張っていきましょう！！

# Brue/Greenデプロイメント用ALBの作成
ECSでBrue/Greenデプロイメントを行うためにALBを追加します。
↓ここの部分ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/71fe3301-5354-6f5c-537b-835efb364aa2.png)

## ALBの作成
### Blue/Green用ターゲットグループ作成
「EC2」→「ターゲットグループ」から作成します。
ターゲットグループへの振り分けルールを設定することでBrue/Greenデプロイメント環境を構築できます。
![19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/0d4c14d2-6956-8975-138e-169084eaee43.png)

上記画面を参考にBrue、Green両方のターゲットグループを作成します。
![20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/f659c965-631a-14c4-653e-a0e2fe7c3278.png)

## ALBを作成
「EC2」→「ロードバランサー」から作成します。

ここでハプニング発生。泣
ALBってAZ2つ以上必要なんですね。今回は検証なのでダミーAZ（ap-northeast-3）を作成しました。
本当はちゃんと両方にコンテナ配置して分けないといけないようですが、今回は勉強のみのためこのままやってしまいます。

ALBを選択し、以下画面のように設定しました。
セキュリティグループには第2回で作成したセキュリティグループを設定、
ターゲットグループはそれぞれBrue:80, Green:10080のポート番号を設定しています。
![22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/cfc00398-e013-7acb-7e20-bc87dbb88f4e.png)

## Blue/Greenデプロイメント用のIAMロール作成
ECSとALBが連携してBrue/Greenデプロイメントを行えるようにIAMロールで許可していきます。
以下の権限でロールを作成します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "ecs:DescribeServices",
                "ecs:CreateTaskSet",
                "ecs:UpdateServicePrimaryTaskSet",
                "ecs:DeleteTaskSet",
                "elasticloadbalancing:DescribeTargetGroups",
                "elasticloadbalancing:DescribeListeners",
                "elasticloadbalancing:ModifyListener",
                "elasticloadbalancing:DescribeRules",
                "elasticloadbalancing:ModifyRule",
                "lambda:InvokeFunction",
                "cloudwatch:DescribeAlarms",
                "sns:Publish",
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:PassRole"
            ],
            "Effect": "Allow",
            "Resource": "*",
            "Condition": {
                "StringLike": {
                    "iam:PassedToService": [
                        "ecs-tasks.amazonaws.com"
                    ]
                }
            }
        }
    ]
}
```

# Fargate+ECSの構築
本命のFargateくんとECSちゃんを構築していきます！！
## ECSタスクの定義
「ECS」→「タスク」から定義していきます。
コンテナ詳細の名前、URIは前回作成したECRの名前とURIをコピーして貼り付けます。
![25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/188695e9-e766-d60d-a9f8-a54c6592fbc2.png)

アプリケーション環境はもちろん「Fargate」
スペックは各々いい感じに設定すれば良いです。
このタイミングで「ログ設定」にチェックを入れておくと、Cloud Watchにログがたまるようになります。
![26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/03284d9b-1158-1d6f-4d59-c0b6dfa53d7c.png)

## ECS Clusterの作成
次にECS Clusterを作成します。
「ECS」→「クラスター」から作成します。
「ネットワーキングのみ」で作成し、サブネットはコンテナを配置するPrivate subnetを選択します。
（本来ここで2つのAZにまたがってコンテナ実行環境を整える必要があります。。）
![27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/2c54dde5-ce01-55b9-89fc-3fe02ed98d1a.png)

## ECSサービスの作成
先ほど作成したタスク定義を「ファミリー」に設定します。
必要なタスクは可用性を考慮し「2」と設定しています。
![28.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/a34d6591-3fe6-caac-3a8a-76f3a91c1159.png)

ここで第2ハプニング。新コンソールではそのままBrue/Greenデプロイメントの設定が出来なさそうです。泣
そのため旧コンソールに切り替えて設定します。

Brue/Greenデプロイメントをするための設定です。
ロールには先ほど作成したIAMロールを設定します。
![29.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/623810f9-11b9-05c9-c08c-df4b21a92739.png)

最終設定は以下画像の通りです。
セキュリティグループにはバックエンド用に作成したセキュリティグループを設定。
ポート80にBlue側のターゲットグループ、ポート10080側にGreen側のターゲットグループを設定しています。
また、コンテナ実行環境はPrivate subnetに構築しているため、IPの自動割当はDISABLEにしています。
![31.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/b193a27e-03a9-44c8-7ed7-f86bd7cccef3.png)

以下画面のように2つのタスクが「RUNNING」状態になれば完了です。
![32.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/a1394a2b-92f1-a2b6-619c-82e0ea0790ae.png)

## Brue/Greenデプロイメント用CodeDeployの確認
ECSサービスを作成後、Brue/Greenデプロイメント用にCodeDeployが自動で作成されます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/7f5f8ec5-faa7-cd66-e162-c61af31b475a.png)

# コンテナのデプロイ確認
今回は最初にバックエンド側からデプロイしました。
バックエンドアプリの疎通確認にはCloud9から内部のALBへ通信を行うことで確認できます。
「EC2」→「ロードバランサ―」から内部ALBを選択し、ALBのDNSを確認して送信します。
```
$ curl http://{ALBのDNS名}:80
```
このルートですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/afbb3925-2bc9-697d-1bc7-3abcfd2451d8.png)

# まとめ
後はほぼ同様の手順でフロントエンド側も作成したら完了です！！
フロントエンドの疎通確認はALBのDNSをブラウザに打ち込んだら良いと思います！！

後少しですね、、笑笑
最後はDB、Secret Managerを設定して完了です。
あと少し頑張ります。

次↓
[AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~DB構築とラスト~](https://qiita.com/bakuchiku/items/0b9a394a39b387d0b394 "AWS Fargate, ECSを用いたコンテナ運用設計、構築をしてみた。~DB構築とラスト~")