概要
EC2 on ECSで構築したアプリについて、APIコール(エンドポイントへのコール)はできていたのに、デプロイ時や再起動時のECSタスク起動では失敗する、というケースがありました。
こちらの原因と解決方法を紹介します。
前提
・EC2 on ECSを利用。EC2はプライベートサブネットに配置
・サブネットはap-northeast-1a
、ap-northeast-1c
の二つのAZに配置
・AutoscalingGroupでは、上記どちらのサブネットも選択している状態
・ap-northeast-1a
ではNAT Gatewayを介してインターネット接続ができる状態
原因
前提を見ると原因は察しがつきやすいと思いますが、今回の原因は、
・EC2インスタンスがap-northeast-1c
で起動してしまうことがあったため
でした。
最初これに気づかず、ap-northeast-1a
で起動したECSタスクでは疎通確認ができていたので、問題なしと勘違いしてしまいました。
ただし、デプロイ作業などでECSタスクを一度落とした際に、ap-northeast-1c
にEC2が起動してしまうと、ap-northeast-1c
ではインターネット接続がされていないので、ECSエージェントが通信できない状態となっていたのです。これにより、ECSタスクが自動起動されなくなっていました。
「ECSタスクの自動起動にはECSエージェントがAWS ECSサービスと通信するためのインターネットアクセスが必要」という点が大事です。当然といえば当然なのですが、アプリがLB側から疎通していたので勘違いが起きていました。
解決方法
プライベートサブネットのap-northeast-1c
のEC2インスタンスにもNATゲートウェイを介してインターネットに接続できる状態にしてあげればOKです。
(もしくは、AutoscalingGroupの対象をインターネット接続ができるap-northeast-1a
のみにすること)
これにより、ECSタスクの自動起動が可能になりました。