🥺

ECS上のDjango環境コンテナがある日突然作動しなくなった話

2022/02/02に公開

起こったこと

いつものように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で入れるパッケージらしいので、入れてみる。

Dockerfile
RUN pip install requests
RUN pip install requests_toolbelt

動いた

謎なことに、この2つのパッケージを入れたイメージで立ち上げたコンテナは正常に作動した。
今まで動いていたイメージはなんだったのだろう。

https://hub.docker.com/layers/python/library/python/3.7/images/sha256-f94c3a0f001af0f70f8082b467f2fde0412b9215f0a26afa04ccfb5995941c30?context=explore

Dockerhubのpythonベースイメージが今日から3日前に更新されている。
推測になるが、自分のソースコードやECSタスク定義の設定が変わったからではなく、ECRに上げる際にdockerhubにある最新のpythonベースイメージの構成が変わり、それをビルドに使ったことが原因なのかも知れない。
過去のECRイメージが動作して、直近で作ったイメージがことごとくダメだった説明も一応つく。

ログって大事

今回の教訓でした。
食わずもの嫌いでCloudWatchは避けてきましたが、awslogsのおかげで原因も掴めたのは大きかったです。(ローカル環境だとさらに気づきにくかった)
※正しい原因は掴めてません。同じ現象にあったよって方いらっしゃれば情報共有いただけると嬉しいです。🙇‍♂️

Discussion