ECS でタスクを手動停止してもイメージが更新されない事象を回避するには
困っていた内容
latest
のイメージタグを設定したタスク定義を利用して、ECS サービスでコンテナを実行しています。
イメージ更新の場合は、コンテナレジストリのlatest
イメージを更新してタスクを手動停止しています。
先日、手動停止したところ代替として起動したタスクのイメージは更新されていませんでした。
なぜでしょうか。対処方法を教えてください。
どう対応すればいいの?
「新しいデプロイの強制」を選択した状態で、ECS サービスを更新してください。
ECS サービスでは、サービス内のタスクが使用するイメージの一貫性を保つため、タグをダイジェストに解決し、起動するタスクに使用する仕様になりました。
そのため ECS サービスでデプロイ後に、イメージタグが参照するイメージを変更し、新たにタスクを起動した場合も、タスクはデプロイ時のイメージを参照します。
Amazon ECS でコンテナ化されたアプリケーションにソフトウェアバージョンの一貫性が強制されるように - AWS
Amazon ECS は、Amazon ECS サービスに更新をデプロイするときに、コンテナイメージタグをイメージダイジェスト (イメージマニフェストの SHA256 ハッシュ) に解決し、サービス内のすべてのタスクが同一であることと、このイメージダイジェストで起動することを強制するようになりました。つまり、タスク定義で「LATEST」などのミュータブルなイメージタグを使用し、デプロイ後にサービスがスケールアウトされた場合でも、新しいタスクの起動には正しいイメージ (サービスのデプロイ時に使用されたもの) が使用されます。
タスクが使用するイメージを更新したい場合は、タスクを個別に手動停止するのではなく「新しいデプロイの強制」を選択した状態で ECS サービスを更新してください。
参考資料
タスクを置き換えて Amazon ECS サービスをデプロイする - Amazon Elastic Container Service
コンテナイメージダイジェストが確立されると、Amazon ECS はこのダイジェストを、他の対象タスクの開始や、その後のサービスの更新に使用します。この結果、サービス内のすべてのタスクで常に同じコンテナイメージが実行され、ソフトウェアのバージョン整合性が得られます。
Deploy Amazon ECS services by replacing tasks - Amazon Elastic Container Service
To establish an updated image digest, you can force a new deployment. This updated digest will be used to start new tasks and will not affect already running tasks.
Amazon ECS におけるソフトウェアバージョンの一貫性の実現 | Amazon Web Services ブログ
ECS デプロイメントコントローラー (ローリングアップデート) を使用する ECS サービスは、タスク定義リビジョンがコンテナイメージタグを参照していても、デプロイメントライフサイクル全体で同一のコンテナイメージダイジェストを使用することが保証されます。Amazon ECS は、最初のタスクのデプロイ時にコンテナランタイムがイメージタグを解決する際、イメージダイジェストを保存しておきます。そして、そのデプロイメントにおける他のすべてのタスクは、保存したイメージダイジェストを参照する形になります。