Amazon ECRにプッシュしたコンテナイメージのタグを変更してみた

ECRにプッシュしているコンテナイメージのタグを変更してみました
2023.10.23

こんにちは、AWS事業本部@福岡オフィスのべこみん(@beco_minn)です。

突然ですが皆さん、Amazon ECRのコンテナイメージに latest タグを付与してませんか?ちゃんと、Security Hubのコントロール [ECR.2] に対応していますか?

対応していない、特に理由も無く latest タグを使い続けている、という方は、是非この機会に改めてコンテナイメージの運用方法を検討の上、本記事を参考にタグの付け替えをしてみて下さい。

最初にまとめ

  • 一度ECRにプッシュしたコンテナイメージでもタグの付け替えが出来る
  • ただ単純に更新するのではなく、新たなタグを付与→元のタグを削除、という手順が必要
  • 操作はAWS CLIを利用して行う。マネジメントコンソール上では出来ない。

やってみた

今回は下記を前提とします。

  • ECR上にタグを付与したコンテナイメージがプッシュされていること
    • 今回は latest タグを付与
  • AWS CLIが利用出来る環境があること
    • 今回はECRの下記コマンドを実行出来る権限を持ったIAMユーザーでAWS CloudShellを利用しました
      • aws ecr batch-get-image
      • aws ecr put-image
      • aws ecr batch-delete-image
      • aws ecr describe-images

新たなタグを付与

まずは新しくタグを付与するため、下記の手順を実行します。

  1. 対象のイメージに付いているタグを確認する
  2. ECRが個々のコンテナイメージを管理するためのメタデータ「マニフェスト」を取得する
  3. 新しいタグを付与する
  4. 対象のイメージに付いているタグを確認する

実行結果が下記です。今回は「test」というイメージに対して操作を行っています。また、マニフェスト取得時に指定する元のタグ、新しく付与するイメージタグは適宜変更して実行して下さい。

# 付いているタグを確認
$ aws ecr describe-images --repository-name test --query imageDetails[].imageTags[]
[
    "latest"
]

# イメージのマニフェストを取得
$ MANIFEST=$(aws ecr batch-get-image --repository-name test --image-ids imageTag=latest --output text --query images[].imageManifest)

# 新しいタグを付与
$ aws ecr put-image --repository-name test --image-tag new-tag --image-manifest "$MANIFEST"
{
    "image": {
        "registryId": "706587535044",
        "repositoryName": "test",
        "imageId": {
            "imageDigest": "sha256:a0820d91fce5efb4b0a42f01ae5cb2a624ab3f2db8809ad8858188a79da26cc8",
            "imageTag": "new-tag"
        },
        "imageManifest": "*******"
    }
}

# 付いているタグを確認
$ aws ecr describe-images --repository-name test --query imageDetails[].imageTags[]
[
    "new-tag",
    "latest"
]

元のタグを削除

それでは要らない元のタグ(今回は latest)を削除します。

実行結果は下記です。

※タグを削除する場合、そのイメージに付与されているタグを全て削除してしまうと、 最後のタグ削除時にイメージそのものも削除 されてしまいます。ご注意ください。

# タグを削除する
$ aws ecr batch-delete-image --repository-name test --image-ids imageTag=latest
{
    "imageIds": [
        {
            "imageDigest": "sha256:a0820d91fce5efb4b0a42f01ae5cb2a624ab3f2db8809ad8858188a79da26cc8",
            "imageTag": "latest"
        }
    ],
    "failures": []
}

# 付いているタグを確認
$ aws ecr describe-images --repository-name test --query imageDetails[].imageTags[]
[
    "new-tag"
]

おまけ〜気付いたこと〜

実際にタグを変更してみて、マネジメントコンソール上から分かったことが2つありました。

  • 今回の一連の操作でイメージの「プッシュされた日時」は変わらない
  • イメージのURIにはいずれかのタグ1つが使われる
    • 例えばaaa, bbb, cccと複数タグがある場合でも、URIは 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/hoge-image:aaa となる

参考

最後に

挙動としてはタグを新しく付与しているというより、異なるタグが付いた同じイメージを複数プッシュしている感覚に近いのかな?と感じました。コンソールやCLIの結果からは1つのイメージに複数タグが付いているように見えるんですが。

latest運用をしている方はこれを機会に運用を見直してみてはいかがでしょうか。

本記事がどなたかのお役に立てれば幸いです。

以上、べこみんでした。