はじめに
2024/10ごろ、これまで問題なくできていたECSのコンテナ起動で急にエラーが出るようになり、起動ができなくなりました。その時に調べてわかったことを記しておきます。
原因になったAWSの仕様変更
- 仕様変更前
- ECRのイメージタグからECSのコンテナを起動
- 仕様変更後
- ECRのイメージタグに紐付く、イメージダイジェストからECSのコンテナを起動
何が起きたか
以下、担当システムでの事例を元に説明します。
仕様変更前
- イメージタグを元にコンテナを起動
- ECRに対して、同じイメージタグでプッシュを行う
- 1.と同じイメージタグを元にコンテナが起動しようとする
- 問題なくコンテナが起動する
仕様変更後
- イメージダイジェストAを元にコンテナを起動
- ECRに対して、同じイメージタグでプッシュを行う
a. イメージダイジェストAに紐付くイメージタグがなくなる
b. イメージダイジェストBが作成される - イメージダイジェストAを元にコンテナが起動しようとする
- CannotPullContainerError:pull image manifest has been retried 1 time(s): failed to resolve ref ~~ というエラーが発生する(イメージダイジェストAはすでにイメージタグに紐付いていないため、「そんなものないよ」と怒られている)
想定される対処方法
今回の仕様変更に対しては、以下の方法で対応することが可能です。
案1:ECRにプッシュをする際に同じイメージタグを使用しない
→イメージタグ自体が新しいものに更新されるため、イメージダイジェストに紐づくイメージタグが存在しない、という状況が発生しなくなる
案2:ECRにプッシュをするたびに「新しいデプロイの強制」(Force new deployment)を行い、ECSに紐づくイメージダイジェストを更新する
→「新しいデプロイの強制」(Force new deployment)を行うことで、ECSが最新のイメージダイジェストからコンテナを再起動するため、古いイメージダイジェストを参照しなくなる
我々の対処方法
担当システムでは、同じイメージタグを使用しない運用にするためには、ECRのプッシュ方法やその後のECSのコンテナ起動を1から見直す必要があるため、対応するのは難しく、案2の解決策で問題を解決しました。
運用変更後の流れ
- イメージダイジェストAを元にコンテナを起動
- ECRに対して、同じイメージタグでプッシュを行う
a. イメージダイジェストAに紐付くイメージタグがなくなる
b. イメージダイジェストBが作成される - 「新しいデプロイの強制」(Force new deployment)を行う
- イメージダイジェストBを元にコンテナが再起動される
- エラーが発生しなくなり、問題解決