タグアーカイブ ALB

Amazon ECS Gatewayを解説。ALB管理を自動化する新サービス

Amazon ECS Gatewayが正式に発表された。コンテナ化されたアプリケーションの入口(イングレス)を自動構築するフルマネージドサービスだ。ALBやTLS証明書、WAFの設定をゲートウェイが一括で管理する。

従来はサービスを公開するたびに、ロードバランサーや証明書、セキュリティグループを手動で用意する必要があった。ECS Gatewayはこの作業を自動化し、プラットフォームチームとアプリチームの責任分界点を明確にする。

最大25サービスが1つのALBを共有でき、インフラコストの最適化にも寄与する。追加料金なしで利用でき、サービスが接続した時に基盤インフラの料金だけが発生する。

ECS Gatewayが解決する課題

ECS Gatewayが解決する課題

従来のイングレス管理はなぜ負担だったのか

プラットフォームチームがECS上で多数のコンテナアプリを管理する現場では、サービスを新しく公開するたびに手間がかかる。Application Load Balancer(ALB)、AWS Certificate Manager(ACM)の証明書、AWS WAFのWeb ACL、セキュリティグループを個別に設定する必要があるからだ。さらに、サービスがスケールしたり更新されたりするたびに、これらのリソースを同期させ続ける作業が発生する。このサービス単位の作業負荷はデプロイ速度を遅らせ、設定のズレ(コンフィグレーションドリフト)のリスクを高める。

従来の方法(Before)
新しいサービスごとに、ALB・ACM証明書・WAF・セキュリティグループを毎回作成する
↓
ECS Gatewayを使った場合(After)
ゲートウェイを作成しておけば、サービス側はコネクタを指定するだけで自動で接続される

上図は、従来のサービス公開作業とECS Gateway導入後の作業量の差を示している。設定作業が大幅に減ることが分かる。

プラットフォームとアプリの分離

ECS Gatewayは、プラットフォームチームとアプリチームに明確な役割分担をもたらす。プラットフォームチームはゲートウェイを作成し、サブネットやセキュリティグループ、TLS証明書、リスナー設定、WAF Web ACLといった組織標準のネットワーク設定を1か所で定義する。アプリチームはサービスを作成・更新する時にゲートウェイコネクタのパラメータを追加するだけだ。ネットワークの専門知識は不要になる。

プラットフォームチームの役割
ゲートウェイ作成 → ネットワーク設定 → WAF適用
サブネットやTLS証明書、WAFを1か所で管理する
↓
アプリチームの役割
サービスのみ作成 → ゲートウェイコネクタ指定
ネットワークの知識は不要。エンドポイントが自動で割り当たる

ゲートウェイにより、ネットワーク設定の責任がプラットフォームチームに集約され、アプリチームの負担が軽減される。

ECS Gatewayの仕組みと特徴

ECS Gatewayの仕組みと特徴

ホストベースルーティングとALB共有

ECS GatewayはALBを使ったホストベースルーティングに対応する。1つのALBを最大25サービスが共有できるため、インフラコストを抑えられる。ECSが基盤インフラのライフサイクルをすべて管理し、最初のサービスが接続した時に最初のALBを立ち上げ、容量が上限に達したら新しいALBを追加、不要になれば削除する。各サービスにはユニークなDNSホスト名が割り当てられ、プロビジョニングが完了した時点で即座に利用可能なエンドポイントが提供される。

自動プロビジョニングの流れ

デプロイ時にECSはクラスタに関連付けられたゲートウェイを評価し、サービスを互換性のあるすべてのゲートウェイに接続する。互換性の条件は、アクセスタイプがサービスのコネクタフィルタと一致すること、サービスと同じVPCに属すること、サービスが使うサブネットの全アベイラビリティーゾーンをカバーすることだ。接続のたびに、ACM証明書、ユニークなDNSホスト名、リスナールール、セキュリティグループが自動で作成される。セキュリティグループはALBからのインバウンドトラフィックのみを許可する設定で、不要な経路を閉じる。

STEP 1 サービスのデプロイ時にゲートウェイを評価
↓
STEP 2 互換性のあるゲートウェイへ接続
↓
STEP 3 ALBに空きがあれば収容、無ければ新規作成
↓
STEP 4 証明書、DNSホスト名、リスナールールを自動生成

ECSは接続のたびに必要なネットワークリソースを自動で作成し、サービスのURLを即時に払い出す。

ECS Gatewayのセットアップ手順

ECS Gatewayのセットアップ手順

ゲートウェイの作成

ECSコンソールからゲートウェイを作成できる。ゲートウェイ名とインフラストラクチャロール(IAMロール)を指定し、ロードバランシング方式としてパブリックまたはVPC内部のルーティングを選ぶ。追加設定ではリスナーやポート、ゲートウェイがスケールできるALBの最大数、WAF Web ACLなどを設定できる。ゲートウェイ名や方式、VPC、サブネット、IPアドレスタイプ、リスナープロトコルとポートは作成後に変更できないため、初期設定時の確認が重要だ。

aws ecs create-gateway \
  --name my-team-gateway \
  --infrastructure-role-arn arn:aws:iam::123456789012:role/ECSGatewayRole \
  --configuration '{
    "HostSharedAlb": {
      "networkConfiguration": {
        "subnets": [
          "subnet-080779f9bd887757a",
          "subnet-03d5b2fead6bc6258"
        ],
        "ipAddressType": "ipv4"
      },
      "scheme": "internet-facing"
    }
  }'

ゲートウェイを作成しても、サービスがゲートウェイコネクタで接続するまではインフラはプロビジョニングされない。コストを抑えたい場合は、実際にサービスを接続するタイミングを見極めるとよい。

クラスタへの関連付けとサービス接続

ゲートウェイを1つ以上のクラスタに関連付ける。多対多の関係で、1つのゲートウェイは最大1万クラスタ、1つのクラスタは最大5つのゲートウェイに関連付けられる。これにより、パブリック用とプライベート用のゲートウェイを同じクラスタに割り当てるといった柔軟な構成が可能だ。IAMポリシーを使えば、特定のクラスタにデプロイできるユーザーを制限することもできる。

aws ecs associate-gateway-with-cluster \
  --gateway my-team-gateway \
  --cluster arn:aws:ecs:us-east-1:123456789012:cluster/my-cluster

既存のECSサービスが独自のロードバランサーを持っている場合は、UpdateServiceでゲートウェイコネクタを追加して段階的に移行できる。両方の経路を残したまま動作確認し、その後で既存のロードバランサー設定を削除すればよい。

運用時に知っておきたいポイント

運用時に知っておきたいポイント

ネットワークとキャパシティ

ECS Gatewayはawsvpcネットワークモードを使うECSサービスで利用できる。Amazon ECS EC2、AWS Fargate、ECS Managed Instancesのすべての起動タイプに対応する。サービスのアベイラビリティーゾーンはゲートウェイのAZのサブセットである必要がある。ゲートウェイのALBはサブネットがあるAZのタスクにのみトラフィックをルーティングするため、ゲートウェイとサービスは同じAZセットで構成するのが望ましい。キャパシティ面では、maxAlbCountに達し、かつどのALBにも空きがない場合にデプロイが失敗する。デフォルトの上限は10個だ。接続するサービス数に応じてこの設定を計画しておく必要がある。

監視とオブザーバビリティ

監視にはCloudWatchのALBメトリクスを活用する。TargetGroupディメンションを使えばサービス単位のトラフィックを、LoadBalancerディメンションを使えば共有ALB全体のトラフィックを確認できる。describe-target-healthでリアルタイムのターゲット状態を把握し、HealthyHostCountやTargetResponseTime、HTTPCode_Target_5XX_CountといったメトリクスでCloudWatchアラームを設定するとよい。ゲートウェイのARNベースのタグ付けにより、maxAlbCountの変更に応じて監視設定も自動でスケールする。

この記事のポイント

  • ECS Gatewayは、ECSサービスのイングレスを自動構築するフルマネージドサービス
  • ALBや証明書、WAFの設定をゲートウェイが一括管理し、サービス単位の作業が不要になる
  • 最大25サービスが1つのALBを共有でき、ホストベースルーティングでコストを最適化
  • ゲートウェイとクラスタは多対多で関連付けられ、パブリックとプライベートを柔軟に割り当て可能
  • 追加料金なし、接続したサービスが使う基盤インフラの料金のみ発生