📝

ECS クラスターの Auto Scaling グループに ALB をアタッチしてみた

2022/04/28に公開

ECS で EC2 を利用する際、クラスターの作成で「EC2 Linux + Networking (EC2 Linux + ネットワーキング)」を選択すると、EC2ContainerService で始まる Auto Scaling グループ が自動的に作成されます。

Auto Scaling グループの作成 - Amazon Elastic Container Service

Amazon ECS コンソールの [Create Cluster (クラスターの作成)] ウィザードを [EC2 Linux + Networking (EC2 Linux + ネットワーキング)] オプションとともに使用すると、Amazon ECS ではAWS CloudFormationスタックの一部としてお客様に代わって Amazon EC2 Auto Scaling 起動設定と Auto Scaling グループが作成されます。それらには EC2ContainerService-<ClusterName> プレフィックスが付いているため、識別が容易になります。

この Auto Scaling グループに、ALB をアタッチしたら面白い挙動が発生したので紹介します。

概要

  • ECS クラスターの Auto Scaling グループに ALB をアタッチすると、自動的に 80 番ポートへのヘルスチェックが追加される
  • 動的ポートマッピングを使用している場合、80 番ポートを使用していないので、80 番ポートへのヘルスチェックが失敗する
  • 解決策として、自動的に追加されたヘルスチェックを手動で登録解除する

準備

  • ECS クラスターは EC2 Linux + ネットワーキングで作成済み
  • タスク定義で動的ポートマッピングを使用するよう、ホストポートを 0 に設定
  • Application Load Balancer (ALB) は作成済み
  • ALB のデフォルトのリスナーとターゲットグループは削除
  • サービス作成時に作成済みの ALB を指定し、新しくターゲットグループを作成

Auto Scaling グループ に ALB をアタッチしてみる

アタッチ前に、準備段階でのリソースの状況を確認しておきます。

Auto Scaling グループには ALB をアタッチしておらず、ヘルスチェックのタイプも EC2 のみです。

ターゲットグループには動的ポートマッピングを使用して起動されたタスクのポートへヘルスチェックをしています。

それではこの状態から Auto Scaling グループのヘルスチェックのタイプに ELB を追加してみます。

この時点ではターゲットグループに変化はありません。

ただし、ヘルスチェックのタイプとして ELB を使用するには、Auto Scaling グループに ALB をアタッチする必要があります。

ヘルスチェックのタイプとして ELB を使用するために、Auto Scaling グループに ALB をアタッチしてみます。

現在の Auto Scaling グループ の状態は以下の通りです。

ここで、ターゲットグループを確認してみます。

Auto Scaling グループに ALB をアタッチした直後に、80 番ポートへのヘルスチェックが自動的に追加されています。
しかしながら、ECS では動的ポートマッピングを使用しているため、80 番ポートは使われていません。
そのため、80 番ポートへのヘルスチェックが失敗しています。

Auto Scaling グループではヘルスチェックのタイプとして ELB も使用するように設定したので、80 番ポートへのヘルスチェックが失敗していることが伝番されます。

その結果、動的ポートマッピングで稼働しているタスクが正常であるにもかかわらず、EC2 インスタンスの置き換えが発生します。

これでは延々と EC2 インスタンスの置き換えが発生してしまうので、80 番ポートへのヘルスチェックを何とかしないといけません。

80 番ポートへのヘルスチェックを手動で登録解除

解決策として、80 番ポートへのヘルスチェックを手動で登録解除する方法があります。

登録解除後に、再度自動的に 80 番ポートへのヘルスチェックが追加されることはありませんでした。
また、タスク数を増やしたり、EC2 インスタンスをスケールアウトした際にも追加されなかったので、ALB をアタッチするときのみ自動追加されるようでした。

注意点として、80 番ポートへのヘルスチェックの失敗が Auto Scaling グループに伝番される前に登録解除しないと、EC2 インスタンスの置き換えが発生します。
Auto Scaling グループに ALB をアタッチした流れでヘルスチェックの登録解除まですばやく行う必要がある点には注意してください。

まとめ

今回は、ECS クラスターの Auto Scaling グループ に ALB をアタッチした際、80 番ポートへのヘルスチェックが自動的に追加されるという挙動について紹介しました。
動的ポートマッピングを使用している場合には注意が必要ですが、解決策もあったので併せて紹介しました。

どなたかの参考になれば幸いです。

Discussion