はじめに
クラスタ作成、タスク定義、サービス作成を行ったので、今回はロードバランシング(ELB)とAuto Scalingの設定を行ってみました。
ロードバランシング
ECSクラスタにELBを連携する際、起動タイプによってネットワークモードなどの設定が変わってきます。
Fargate起動タイプ
- ネットワークモードにawsvpcを使用(タスクごとにENIをアタッチ)
- 各タスクが固有のIPをもつ
- ENIごとにSecurityGroupを紐づける

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

実装
タスク定義・サービス編で構築したインフラにALBを新しく加えていきます。
インフラ構築
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"
}
ELBのリスナータブからルールを開くと、各パス(/ec2/
/fargate/
)のターゲットグループが表示されます。
サービス作成
Fargate起動タイプとEC2起動タイプでサービスを作成してタスクを実行し、ロードバランサーの挙動を確認します。
Fargate起動タイプ
セキュリティグループのインバウンドルールでは、ELBのセキュリティグループからの受信を許可するようにします。
また、ロードバランシングでロードバランサーの種類とIAMロールを選択し、ロードバランス用のコンテナを追加します。
ロードバランサーのDNS名をコピーして、[DNS名]/fargate/
にアクセスします。
以下のページが開かれます。
このときページロードを何回も行うと、ELBのおかげでタスクが切り替わります。
EC2起動タイプ
[DNS名]/ec2/
にアクセスすると以下のページが開かれ、ロードを繰り返すとタスクが切り替わります。
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を連携する必要があります。

実装
ECS(EC2起動タイプ)タスクとインスタンスのAuto Scalingをそれぞれ設定してみます。
タスク
作成済のサービスsimplehttp-service-ec2
のAuto Scalingを更新します。
タスクの最小数、必要数、最大数、IAMロールを設定します。
次にスケールアウト、スケールインのときのスケーリングポリシーを作成します。
スケールアウトのポリシーは、CPUの使用率が5分以上20%を上回ったときにタスクを1つ追加するような設定にします。
スケールインのポリシーは、CPUの使用率が2連続で5分以上15%以下になったときにタスクを1つ追加するような設定にします。
サービスを更新すると、Auto Scalingのタブから作成した設定を確認することができます。
インスタンス
該当するAuto Scalingグループを選択して、最小キャパシティと最大キャパシティを設定します。
新しくサービスを作成するのですが、このときに”キャパシティープロバイダー戦略に切り替える”をクリックします。
ロードバランシングとAuto Scalingはデフォルト設定のままでサービスを作成します。
1つのコンテナインスタンスに5つのタスクが実行されています。
Auto Scalingの確認のために、タスク数を25にしてサービスを更新します。
CloudWatchをみると、CPUが400%くらいになっています。
クラスターのECSインスタンスタブを開くと、コンテナインスタンスが3つに増えています。
参考資料