動的ポートマッピング利用時に EC2 のヘルスチェックが失敗する

2023.07.06

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

今回は、 ALB + ECS で利用される動的ポートマッピング利用時にターゲットグループのヘルスチェックが失敗するケースを考えていきたいと思います。

動的ポートマッピングとは

動的ポートマッピングとは、ELB + ECS 間で利用されるホストポート(トラフィックポート)を動的に採番し、ポートの重複を避けて疎通を行う方法です。詳細は以下をご覧ください。

では、ALB と ターゲットグループ(ECS)のヘルスチェックに失敗するパターンを考えていきます。

EC2 のセキュリティグループをチェック

動的ポートマッピングでは、一時ポートが利用されます。 EC2 のセキュリティグループが ALB のセキュリティグループからのインバウンドを一時ポートで許可しているか確認してみてください。マネジメントコンソールでみると以下のようなイメージで、一時ポートが利用されて、「Request timed out」になっている部分が特徴的です。

ちなみに、動的ポートマッピングで使用されるホストポートは、コンテナインスタンスの一時ポート範囲とDockerのバージョンから動的に選択されます。Docker バージョン 1.6.0 以降のデフォルトの一時ポート範囲は、EC2 インスタンスの /proc/sys/net/ipv4/ip_local_port_range に記載されています。

sh-4.2$ cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999
sh-4.2$

AWS::ECS::TaskDefinition PortMapping hostPort

一時ポート以外のヘルスチェックが行われ失敗する

一時ポート以外のヘルスチェックでヘルスチェックが行われ、ヘルスチェックに失敗している場合は 2 パターン考えられます。

traffic-port でヘルスチェックが行われていない

厳密に言えば、ヘルスチェックに失敗しているわけではないのですが、タスクが起動してこないケースの原因として、ターゲットグループで利用するヘルスチェック用のポートが traffic-port に設定されてない場合が考えられます。

マネジメントコンソールだと、以下のようにターゲットが登録されていない(登録済みターゲットが 0 の状態)になります。

この場合、ターゲットグループのポートが固定化されていないか確認します。

動的ポートマッピング利用時において、あるべき姿は「トラフィックポート」になります。

AutoScaling Group 側でも管理している

少し特殊ですが、 AutoScaling Group 側でも EC2 をターゲット登録してしまった場合、動的ポートマッピングとは別に、ターゲットグループ作成時に設定したポート番号でヘルスチェックが行われます。

ほとんどのケースの場合、ポート開放していないため、Application AutoScaling (ECS) のヘルスチェックは Healty だが、EC2 AutoScaling のヘルスチェックは Unhealty のような挙動を取ります。

EC2 AutoScaling の設定は不要のため、 AutoScaling Group 編集画面で ELB (ターゲットグループ) の紐付けを外してあげましょう。

まとめ

以上、「動的ポートマッピングを構築した時に EC2 のヘルスチェックが失敗する」でした。

私は最後の「AutoScaling Group 側でも管理している」に引っかかり、かなり詰まったのでブログにしてみました。

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

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!