【AWS】ECS構築の基礎 −ELB・Auto Scaling編−

#はじめに
クラスタ作成、タスク定義、サービス作成を行ったので、今回はロードバランシング(ELB)とAuto Scalingの設定を行ってみました。

https://qiita.com/suzuki0430/items/2745e9ca0ead8db982f9

https://qiita.com/suzuki0430/items/440daea590b22d1621c8

#ロードバランシング
ECSクラスタにELBを連携する際、起動タイプによってネットワークモードなどの設定が変わってきます。

https://dev.classmethod.jp/articles/ecs-networking-mode/

##Fargate起動タイプ
- ネットワークモードにawsvpcを使用(タスクごとにENIをアタッチ)
- 各タスクが固有のIPをもつ
- ENIごとにSecurityGroupを紐づける

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e55252ea-b6f7-217d-6973-34d0ff4bc93c.png" width="500">

##EC2起動タイプ
- ネットワークモードにbridgeを使用(インスタンスの任意のポートをコンテナのポートにマッピング)
- インスタンスのENIを複数のタスクで共有
- ELB(ALB)と連携する際には動的ポートで利用

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/6c22fcca-f4c6-5582-128c-9116e3683f5f.png" width="500">

#実装
タスク定義・サービス編で構築したインフラにALBを新しく加えていきます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/4732117a-83b6-33ad-c4e7-c7bada2ede07.png" width="500">

##インフラ構築
CloudFormationで一発でつくります。

```
$ aws cloudformation create-stack --stack-name external-alb --template-body file://./alb-external.yml
```

```
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:338233790232:stack/external-alb/6a9d91c0-dc5e-11eb-9aad-0a197b714f8d"
}
```

以下のリソースを含んだスタックが作成されます。
![スクリーンショット 2021-07-04 9.29.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/0c57de31-a5d9-e5bf-7fad-b341d1ffe191.png)

ELBのリスナータブからルールを開くと、各パス(`/ec2/` `/fargate/`)のターゲットグループが表示されます。
![スクリーンショット 2021-07-04 15.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/cd20796f-a144-af39-fb03-66485a6ce288.png)

##サービス作成
Fargate起動タイプとEC2起動タイプでサービスを作成してタスクを実行し、ロードバランサーの挙動を確認します。

###Fargate起動タイプ
Fargate起動タイプでサービスを作成します。
![スクリーンショット 2021-07-04 15.46.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/4dc2a58d-00b2-cdac-f918-e3178b48dbd9.png)

ネットワーク構成ではVPCとサブネットを指定します。
![スクリーンショット 2021-07-04 15.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a3df9c4c-bddf-f35b-1132-fe2906a0f7cd.png)

セキュリティグループのインバウンドルールでは、ELBのセキュリティグループからの受信を許可するようにします。
![スクリーンショット 2021-07-04 15.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/ced6be49-a259-a589-3c02-4194afc85f2a.png)

また、ロードバランシングでロードバランサーの種類とIAMロールを選択し、ロードバランス用のコンテナを追加します。
![スクリーンショット 2021-07-04 16.04.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/db56ee84-e031-878b-c4ae-8371e979da25.png)

ロードバランサーのDNS名をコピーして、`[DNS名]/fargate/`にアクセスします。
![スクリーンショット 2021-07-04 16.08.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/3cd51c9d-8d68-e869-41f2-0e0551f02ef7.png)

以下のページが開かれます。
このときページロードを何回も行うと、ELBのおかげでタスクが切り替わります。
![スクリーンショット 2021-07-04 16.09.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/19ca07be-20c4-e148-189b-2ebd26adaf73.png)

###EC2起動タイプ
同様にサービスの作成を行います。
![スクリーンショット 2021-07-04 16.16.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/0368b727-a432-b3bd-6e4f-350ba61f3d59.png)
![スクリーンショット 2021-07-04 16.23.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e5bc708f-7b51-cb78-3bc0-e3f8d35eca02.png)

`[DNS名]/ec2/`にアクセスすると以下のページが開かれ、ロードを繰り返すとタスクが切り替わります。
![スクリーンショット 2021-07-04 16.25.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/f7dd52ce-06e2-e7fd-e93c-05fc3c272106.png)

#Auto Scaling
ECSタスクのAuto ScalingはEC2インスタンスのAuto Scalingとは別物ですが、CPU/RAMの使用率をCloudWatchでトラッキングして、CloudWatchアラームをトリガにしてスケーリングするといった仕組みは同じです。

また、タスクを実行するインフラを決定するためにCapacity Providerを利用します。
Fargate起動タイプの場合は`FARGATE`や`FARGATE_SPOT`といったCapacity Providerが自動で追加され、EC2起動タイプの場合はAuto ScalingグループとCapacity Providerを連携する必要があります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c2b4b47d-3c19-2197-0dd3-80c5b94e9820.png" width="700">

https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/asg-capacity-providers.html

https://dev.classmethod.jp/articles/regrwoth-capacity-provider/

##実装
ECS(EC2起動タイプ)タスクとインスタンスのAuto Scalingをそれぞれ設定してみます。

###タスク
作成済のサービス`simplehttp-service-ec2`のAuto Scalingを更新します。
タスクの最小数、必要数、最大数、IAMロールを設定します。
![スクリーンショット 2021-07-04 17.01.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/1be4d827-1ac0-d2cd-9db6-6a443b1cec67.png)

次にスケールアウト、スケールインのときのスケーリングポリシーを作成します。

スケールアウトのポリシーは、CPUの使用率が5分以上20%を上回ったときにタスクを1つ追加するような設定にします。
![スクリーンショット 2021-07-04 17.07.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/1f6213ab-50c0-94f1-d2a9-b5abef5a5f29.png)

スケールインのポリシーは、CPUの使用率が2連続で5分以上15%以下になったときにタスクを1つ追加するような設定にします。
![スクリーンショット 2021-07-04 17.12.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/c32f1dba-62cd-acbb-9e50-2404dccd9574.png)

サービスを更新すると、Auto Scalingのタブから作成した設定を確認することができます。
![スクリーンショット 2021-07-04 17.25.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/62721278-9f66-58ee-bc7b-c59956014864.png)

###インスタンス
該当するAuto Scalingグループを選択して、最小キャパシティと最大キャパシティを設定します。
![スクリーンショット 2021-07-04 18.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/1f724cc4-8ee5-429a-7d6d-70a88f6a363f.png)

ECSからキャパシティプロバイダーを新しく作成します。
![スクリーンショット 2021-07-04 18.22.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/e80532b1-c786-01b6-a007-41394f7994db.png)

新しくサービスを作成するのですが、このときに”キャパシティープロバイダー戦略に切り替える”をクリックします。
![スクリーンショット 2021-07-04 18.24.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/483340f4-2d7d-b1b8-1373-3e8be6227618.png)

以下のような設定を行います。
![スクリーンショット 2021-07-04 18.30.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/685e8e99-8a40-11be-6b4a-577c1c580a18.png)

タスクの配置には"ビンパック"を選択します。
![スクリーンショット 2021-07-04 18.31.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/ae48c4bb-48c9-7928-2c73-39e1c14b89d9.png)

ロードバランシングとAuto Scalingはデフォルト設定のままでサービスを作成します。
1つのコンテナインスタンスに5つのタスクが実行されています。
![スクリーンショット 2021-07-04 18.39.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/049ef817-b987-f5ea-8b67-b420f0bd564b.png)

Auto Scalingの確認のために、タスク数を25にしてサービスを更新します。
CloudWatchをみると、CPUが400%くらいになっています。
![スクリーンショット 2021-07-04 18.42.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/96a8acef-db92-55b1-ea7d-d4089d4bf1bb.png)

クラスターのECSインスタンスタブを開くと、コンテナインスタンスが3つに増えています。
![スクリーンショット 2021-07-04 18.44.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/2b1ff091-d36d-bfef-3459-c2e63ce7521c.png)

タスクも21個まで増えていることが確認できます。
![スクリーンショット 2021-07-04 18.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569054/a70a99d0-5012-5350-61b6-f673418bf718.png)

#参考資料
https://www.udemy.com/share/103fe82@PkdKZFlYTFYJcEBSOGJNfT1t/

https://business.ntt-east.co.jp/content/cloudsolution/column-171.html

https://d1.awsstatic.com/webinars/jp/pdf/services/20200422_BlackBelt_Amazon_ECS_Share.pdf

https://zenn.dev/yoshinori_satoh/articles/2021-02-13-eks-ecs-compare