背景
オンプレミス環境からAWS ECSへ移行しようというプロジェクトを行っております。環境はnginx + Railsです。
Docker Desktop for Macでdocker networkを作成しnginxとrailsでコンテナ間通信ができるところまでは確認できたので、そのコンテナイメージをECRにpushし、タスク定義まで行いました。
ECSクラスターの作成を行い、作成したタスク定義を実行したところ起動できなかったのでその時の調査方法を記載します。
ECSインスタンスにログイン
起動しない原因を調査するにあたってまずはログを確認したいのですが、ログの確認方法がわかっていません…なので、本来もっと良い方法があると思うのですがよくわかっていないので、一旦ECSインスタンスにSSHログインできるようにしました。
2020/12/9追記
ログの確認方法
ECSクラスターを選択、下のタブのタスクをクリックします。
タスクの一覧が表示されます。表示されない場合は、コンテナがすでに止まってしまっている可能性が高いです。その場合は、必要なタスクのステータス
をStopped
にすると表示されると思います。タスクのIDのリンクをクリックします。するとタスクの詳細ページに遷移します。
画面上部にタブがあり、Logs
タブをクリックします。ログを表示するコンテナを選択します
というメッセージの横にセレクトボックスがあるので、ログを表示するコンテナを選択します。CloudWatchに出力する(logDriverがawslog
)設定になっているコンテナが選択できます。
選択すると下にログが表示されます。エラーなどコンテナが起動できなかった理由がわかると思います。
ECSインスタンスにログインするための設定
ECSインスタンスにログインするためには以下の設定が必要です。
クラスターテンプレートの選択
でEC2 Linux + ネットワーキング
を選択するクラスターの設定
->インスタンスの設定
でキーペア
を指定するクラスターの設定
->ネットワーキング
でパブリックサブネット
を指定するクラスターの設定
->ネットワーキング
でAuto assign public IP
をEnabled
にするサブネット
の設定でパブリック IPv4 アドレスの自動
がはい
になっていればUse subnet setting
でも大丈夫です
クラスターの設定
->セキュリティグループ
でSSHを通しているセキュリティグループを選択する- デフォルトのセキュリティグループではNG
以上の設定でクラスターを作成します。
ECSインスタンスの起動確認
先ほど作成したクラスターを選択して、ECS インスタンス
タブをクリックすると、作成したクラスターのECSインスタンスが表示されます。ECS インスタンス
のリンクをクリックすると、EC2の確認ができます。
ECSインスタンスにSSHする
確認したEC2のパブリックDNS、もしくはパブリックIPにクラスター作成時に指定したキーペアを使ってログインします。
コンテナのログを確認
早速コンテナの状況を確認します。docker ps -a
をすると、なにかの原因でステータスがExitedになっていました。
コンテナのログの確認にはdocker logs
コマンドを利用します。
1 | $ docker logs コンテナID |
nginxの設定がDocker Desktopで動作確認した時のそのままになってしまっているのが原因のようです。(docker networkを作成して動作確認したときに、Rails用コンテナをrailsという名前で起動していたため)
今回、タスク定義のネットワークモードをawsvpc
にしているので、コンテナ間通信はlocalhost指定で行えます。こちらを参考にしました。
ですので、nginxのupstreamの指定をlocalhost:3000
として、コンテナをbuild、pushしたら無事タスクが起動しました。
まとめ
なにか起こった時の調査にログは欠かせません。まずはログを確認するようにしたいです。
今回のログの確認方法は本来の方法ではないと思います。Fargate使っていたらできないと思いますし…
本来はCloudWatchなど利用して行うのだと思いますが、まだその辺りを理解できていないのでこれから調べていきたいと思います。
※ Container Insightsを使ってみましたが使用しているリソース確認、マップ表示くらいの機能でした。プロダクション環境では重宝するかもしれません。