はじめに
AWSのECSを使用してアプリをデプロイした時になぜかコンテナが立ち上がらなくなったという問題に引っかかりました。
その時にトラブルシューティングをメモしておきます。
他の方の助けになれば嬉しいです。
初めてでない方はそんなの当たり前じゃんって話かと思います.
かんたんにECSの概要
ECSはdockerコンテナをEC2またはFARGATEのどちらかで動かすものです。
開発環境でdockerを使っていれば、その開発時に作ったdockerイメージを利用してデプロイできるため、dockerを最大限に利用することができるメリットがあります。その他にもメリットはあると思いますが、とりあえずdockerで開発・運用することができるのが1つあるのかなと思います。
(自分がECSを使ってデプロイするのが、目的だったのでECSを選ぶまでの思考はありませんでした。。。。)
詳細な説明は他の方が書いてくださっている記事が多いのでググればすぐに出てきます!
インフラ構成図
上の図の赤枠で囲った部分がECSでデプロイした環境になります。
今回はEC2を2台にした構成を取っております。
このEC2の中にはコンテナが配置されているのですが、同じアプリケーションコンテナを各EC2インスタンスに2つずつ起動しています。
下の図のような感じです。
本題のポートマッピング変更したらコンテナが立ち上がらなくなった
ECSを設定する時にタスクを定義するという作業があります。(docekrコンテナの起動する際の設定etc...)
その時に ポートマッピング という設定項目があります。
ホストコンピュータのEC2のポートとコンテナのポートをマッピングさせるという意味の項目です。
ここで問題だったのが、ホストコンピュータのポート8080とコンテナの8080ポートを紐づけようとすると一つのコンテナにしか紐づけられないという問題でした。
そこで。ホストコンピュータのポートをエフェメラルポート指定することで、各コンテナの8080ポートとマッピングすることができルため4つのコンテナに振り分けられるようになるはずでした。
が、、、なぜかエフェメラルポートを使用するとなぜかコンテナが起動しては2分後には落ちて、起動し直すという問題に。。。
※ エフェメラルポートとはTCP/IPプロトコルスタックが事前に定義されている範囲内から自動的に割り当てるポートである
解決
答えは、セキュリティグループでした。。。(自分の設定ミス)エフェメラルポートに設定したが、EC2インスタンス用のセキュリティグループのインバウンドで8080ポートのみを許容していたため、ELBのヘルスチェックが通らずunhealthyに状態だったため何度もコンテナが落ちては起動を繰り返していたということです。
(ケアレスミスでした。。。)
解決に時間がかかった
最初に、コンテナが落ちていたので、EC2のリソース(メモリやCPU)らへんを追っていました。CloudWatchのECSを見たが、リソースが使われすぎているということでもない。dockerイメージの内容に確認したりなど変更しても特に見つからず、時間がすぎていきました。
「ECS コンテナ 落ちる」とググったらAWSの公式の記事にまさに自分が困っている内容の記事が出てきました!
Amazon ECS のタスクでコンテナが終了する問題をトラブルシューティングする方法を教えてください。
qiitaの記事を読むのもいいですが、やはり最初は一次情報を見ることが大切だなと改めて思いました。
また、問題が起きている箇所だけではなくその周辺の設定を落ち着いて見ることも大切ですね。