こんにちはsekitakaです。
AWS BatchでLambdaで実行しきれない大きめのタスクを任せようと検討中です。
試しに簡単なジョブを作成してみたのですが、ステータスがRUNNABLEのまま進まなくてハマったので、調査方法と解決策を共有します。
調査
コンテナインスタンスのログを確認
エラーも何もでないのでコンテナインスタンスに接続して、何かヒントが無いか探りました。
コンテナインスタンスはVPC内に作成されるので、踏み台インスタンスを経由してSSH接続しました。
/var/log/ecs/ecs-agent.log*
を確認すると以下のようなログが出力されていた。
2017-07-04T03:14:27Z [INFO] Starting Agent: Amazon ECS Agent - v1.14.1 (467c3d7)
2017-07-04T03:14:27Z [INFO] Loading configuration
2017-07-04T03:14:27Z [INFO] Checkpointing is enabled. Attempting to load state
2017-07-04T03:14:27Z [INFO] Loading state! module="statemanager"
2017-07-04T03:14:27Z [INFO] Event stream ContainerChange start listening...
2017-07-04T03:14:27Z [INFO] Detected Docker versions [1.17 1.18 1.19 1.20 1.21 1.22 1.23]
2017-07-04T03:14:27Z [INFO] Registering Instance with ECS
2017-07-04T03:14:47Z [ERROR] Could not register: RequestError: send request failed
caused by: Post https://ecs.us-east-1.amazonaws.com/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
2017-07-04T03:14:47Z [ERROR] Error registering: RequestError: send request failed
caused by: Post https://ecs.us-east-1.amazonaws.com/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
どうやらhttps://ecs.us-east-1.amazonaws.com
に接続できない模様。
試しにこのインスタンスでcurl https://ecs.us-east-1.amazonaws.com
を実行すると、予想どおり接続できない。
というかECSを使ってAWS Batchが動いていたのですね。
VPC内の他のインスタンスと比較
VPC内の同じサブネットの他のインスタンスでどうなるか試してみました。
作成していた踏み台インスタンスでは curl https://ecs.us-east-1.amazonaws.com
は成功します。
違いはElasticIPを設定しているか/いないかなので、試しにコンテナインスタンスにElasticIPを付与してみるとジョブが動いた!!
疑問
インターネットゲートウェイをアタッチされたVPC内のEC2インスタンスはインターネット接続できると思ってたけど間違い?
→ ここを読むと間違いっぽい。
サブネットのインスタンスもグローバルに一意なIPを持たないとインターネット接続できない。
グローバルに一意なIPを持つインスタンスを自動生成するには?
VPC -> サブネット -> Batchを所属させるサブネットを選択する -> サブネットのアクション -> パブリックIPの自動割当を有効にする
最終確認
パブリックIPの自動割当を有効にしたサブネットを選択しComputing Environmentを作成し、ジョブを登録したところスムーズにジョブがSUCCESSすることを確認
まとめ
AWS BatchというよりVPCの知識不足によってハマっていたようです。
フォーラムでも疑問が出ていたので、同じハマりする人多いような気がするので誰かの役に立てればいいな。
2017/07/12 追記
VPCのDNS解決も有効にしていないとインターネット接続できなかった。