問題点
ブラウザからECSでデプロイしたコンテナにアクセス出来ない。
状況
デプロイ前
ECSにコンテナをデプロイする前の設定(原因と思われる箇所のみ抜粋)
タスク定義
- ホストポートは動的割当に(ホストポートに0を指定)していた
サービス
ALBを利用するように設定していた
デプロイ後
コンテナデプロイ後の動作
ターゲットグループ
状態がunhealtyのままとなり、healtyにならない。
タスク
タスクがSTOPされ、前回のステータスにTask failed ELB health checks in xxxと表示される。
原因
コンテナのヘルスチェックに失敗するため、ロードバランサーがコンテナにリクエストを送信していなかった。
見直し・解決方法
ロードバランサーのヘルスチェックがコンテナへ到達できるようにALBやEC2の設定を見直す。
Application Load Balancer
- ALBとコンテナをデプロイするEC2インスタンスが同じVPCに配置されてるか?
- コンテナをデプロイするEC2インスタンスのアベイラビリティゾーンが含まれているか?
などを確認する。
ALBをコンテナをデプロイするEC2インスタンスと異なるVPCに配置していた場合は、VPCやアベイラビリティゾーンの設定に注意してALBを作成する。
セキュリティグループ
- EC2インスタンスに割り当てられているセキュリティグループがロードバランサーからのアクセスを許可しているか?
などを確認する。
公式ドキュメントのタスク定義パラメーターによると、Docker デーモンは /proc/sys/net/ipv4/ip_local_port_range の一時ポート範囲 (最新の Amazon ECS 最適化 AMI では 32768 ~ 61000) を読み取ろうとします。
とあるので、EC2インスタンスに割当られているセキュリティグループにロードバランサーのセキュリティグループからポート32768 - 61000へのアクセスを許可するルールを追加する。
アクセス確認
ALBやEC2の設定を見直したところ、ヘルスチェックが通るようになり、ブラウザからコンテナへアクセスすることができるようになった。