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


はじめに

クラスタ作成、タスク定義、サービス作成を行ったので、今回はロードバランシング(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起動タイプ

Fargate起動タイプでサービスを作成します。

ネットワーク構成ではVPCとサブネットを指定します。

セキュリティグループのインバウンドルールでは、ELBのセキュリティグループからの受信を許可するようにします。

また、ロードバランシングでロードバランサーの種類とIAMロールを選択し、ロードバランス用のコンテナを追加します。

ロードバランサーのDNS名をコピーして、[DNS名]/fargate/にアクセスします。

以下のページが開かれます。
このときページロードを何回も行うと、ELBのおかげでタスクが切り替わります。

EC2起動タイプ

同様にサービスの作成を行います。

[DNS名]/ec2/にアクセスすると以下のページが開かれ、ロードを繰り返すとタスクが切り替わります。

Auto Scaling

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

また、タスクを実行するインフラを決定するためにCapacity Providerを利用します。
Fargate起動タイプの場合はFARGATEFARGATE_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グループを選択して、最小キャパシティと最大キャパシティを設定します。

ECSからキャパシティプロバイダーを新しく作成します。

新しくサービスを作成するのですが、このときに”キャパシティープロバイダー戦略に切り替える”をクリックします。

以下のような設定を行います。

タスクの配置には"ビンパック"を選択します。

ロードバランシングとAuto Scalingはデフォルト設定のままでサービスを作成します。
1つのコンテナインスタンスに5つのタスクが実行されています。

Auto Scalingの確認のために、タスク数を25にしてサービスを更新します。
CloudWatchをみると、CPUが400%くらいになっています。

クラスターのECSインスタンスタブを開くと、コンテナインスタンスが3つに増えています。

タスクも21個まで増えていることが確認できます。

参考資料