ECS上のDjango環境コンテナがある日突然作動しなくなった話
起こったこと
いつものようにDjango環境のソースコードを変更して、ECRにプッシュし、ECSからコンテナ起動したらSTOPPED
を食らう。
停止理由をみると、
Essential container in task exited
とのこと。
詳細エラーを見ればなんかわかるでしょ〜と、タスク画面下部のタスク詳細を確認すると、終了コード3
とある。
しかし、終了コード3
を調べても原因が掴めない。
ロールバックだ
正常なイメージまでロールバックしよう。
タスク定義関連の設定(CPU/メモリ/環境変数等)は同じ条件でタスクリビジョン:12 ECR:1.0.8でコンテナ正常作動を確認。
それじゃあソースコードがどこかが悪かったんだろうと思い、正常なソースコードで念の為確認しようと、Git1.0.8を新しいイメージECR:1.0.8aで作り直してECSに上げてみる。(GitのタグとECRタグを同じバージョン名にしている)
タスクリビジョン:12は動くんだから動くはずである。
すると、奇怪なことにコンテナが作動しない。
さらにロールバックだ
あーきっとGitのタグとECRのタグがずれていたりするんだわ。と考え、さらに過去の正常なイメージを探す。
ECR:1.0.7, 1.0.9, 1.0.11もOK。
では、Gitでそれぞれのソースコードでチェックアウトして新しくリビジョン作ってコンテナ立ち上げ!
全滅である。どのコンテナも立ち上がらなくなっている。。
少し焦り出す。
awslogs入れた
ECSではタスク定義でawslogsというドライバを埋め込んで、CloudWatchでコンテナのログを見ることができる。
すると、これらのログを確認した。
ModuleNotFoundError: No module named 'requests'
ModuleNotFoundError: No module named 'requests_toolbelt'
どちらもpip installで入れるパッケージらしいので、入れてみる。
RUN pip install requests
RUN pip install requests_toolbelt
動いた
謎なことに、この2つのパッケージを入れたイメージで立ち上げたコンテナは正常に作動した。
今まで動いていたイメージはなんだったのだろう。
Dockerhubのpythonベースイメージが今日から3日前に更新されている。
推測になるが、自分のソースコードやECSタスク定義の設定が変わったからではなく、ECRに上げる際にdockerhubにある最新のpythonベースイメージの構成が変わり、それをビルドに使ったことが原因なのかも知れない。
過去のECRイメージが動作して、直近で作ったイメージがことごとくダメだった説明も一応つく。
ログって大事
今回の教訓でした。
食わずもの嫌いでCloudWatchは避けてきましたが、awslogsのおかげで原因も掴めたのは大きかったです。(ローカル環境だとさらに気づきにくかった)
※正しい原因は掴めてません。同じ現象にあったよって方いらっしゃれば情報共有いただけると嬉しいです。🙇♂️
Discussion