🫧

ECSコンテナ起動中にECRイメージを削除した時の挙動

2024/04/05に公開

この記事について

実は以前、ECSのコンテナ起動中にイメージをECRから削除しちゃうというのをやってしまいました。
この場合にコンテナがどのような挙動になるのか調査したので記事にします。
同じことをやってしまった方にどうか参考になると嬉しいです。めちゃくちゃ焦ったので。

実際の挙動

実際はECRイメージを削除してしまっても、コンテナは正常に動き続けました。

..なぜ?
もしかして同期しているわけではない..?

となると、
ECSがイメージをどう扱っているのか?
コンテナがこけるとしたらいつなのか?
そこら辺が気になってきます。

調査

  • コンテナ起動時、ECRからイメージをどのように取得してくるのか
  • 起動中はどのようにイメージを保持するのか

という観点で調査をします。

内部的なロジックになりますのでまずは公式を見るに限ります
いい感じの記事がありました↓
https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/pull-behavior.html

FargateタイプとEC2タイプのタスクに分かれて記載がありますね。
タスクとかコンテナとかごちゃ混ぜになってきたという方はとりあえず、

  • タスクとは設定した定義によってコンテナを立ち上げてくれるもの
  • コンテナとはアプリを実行する環境を持つもの

と覚えておけばOKです。
(Fargate、EC2それぞれがどう違うのかはまた調査して別記事にします)

Fargateタイプのタスク

Fargate はイメージをキャッシュしないため、タスクの実行時にイメージ全体がレジストリから取得されます。

Fargateの場合は、タスク実行時にECRイメージを取得するみたいですね。
その後コンテナが起動し、イメージを取得。
コンテナ起動中は取得してきたイメージを使うので、ECRを常に参照する訳ではないんですね。

EC2タイプのタスク

Amazon ECS エージェントはタスクを開始すると、リモート レジストリから Docker イメージをプルし、ローカル コピーをキャッシュします。
スクリーンショット 2024-04-04 14.08.33.png
Amazon ECS エージェントは既存のダウンロードされたイメージを使用する

コンテナ起動時にECRイメージを取得し、コピーを作成してコンテナ内にキャッシュするようです。
次回以降はそのキャッシュを使用して起動するんですね。

結論

コンテナ起動中にECRイメージを削除した場合でも、コンテナは正常に動き続けます。
正常に動き続ける理由は、
Fargate、EC2どちらもコンテナ起動時にECRイメージを取得しており、起動中にECRを参照していないからです。
逆に言えば、コンテナが再起動するタイミングでイメージを参照するのでエラーになるということですね。

運用面でのベストプラクティスを考える

現在コンテナで利用しているイメージはローカルにプルしておくことが良いかなと思います。
バックアップがあるのは安心ですよね!
プルしてきたイメージは起動中のイメージURIと同一になるので、それをもう一度ECRへプッシュしておけば、誤って削除してしまった場合に再起動がいつ入っても問題ないということになります。
ローカルにプルする方法はまた別記事にします。

Discussion