AWSCLIで過去のコンテナイメージに「latest」タグをつけ直してみた

AWSCLIで過去のコンテナイメージに「latest」タグをつけ直してみた

AWS CLI を使用した Amazon ECR コンテナイメージのタグの再付与操作を試してみました。
Clock Icon2024.07.07

AWS CLI の put-image コマンドを利用して、過去に利用していた Amazon ECR コンテナイメージに、「latest」 タグをつけ直す機会がありました。その手順を紹介します。

Amazon ECR でのイメージのタグ付け

実行環境

CloudShell

CloudShellの awscli を利用しました。

$ aws --version
aws-cli/2.17.5 Python/3.11.8 Linux/6.1.92-99.174.amzn2023.x86_64 exec-env/CloudShell exe/x86_64.amzn.2023

イメージの特定

プライベートレジストリ の リポジトリ情報より、イメージ情報を確認しました。

プッシュされた日時を元に、イメージタグ「latest」をつけ直すイメージを特定しました。

ダイジェスト値の確認

CLI操作

ダイジェスト値を取得

タグをつけ直すイメージのダイジェスト値をCLIで確認しました。

REPOSITORY_NAME='test-nginx'
aws ecr list-images --repository-name "${REPOSITORY_NAME}" 
{
    "imageIds": [
        {
            "imageDigest": "sha256:39fd5f65(..snip..)",
            "imageTag": "latest"
        },
        {
            "imageDigest": "sha256:c5a9d0f5(..snip..)"
        },
        {
            "imageDigest": "sha256:37a1876c(..snip..)"
        }
    ]
}

イメージマニフェストを取得

「batch-get-image」コマンドをタグを付け直すイメージのダイジェストを指定して実行、イメージマニュフェストを取得しました。

REPOSITORY_NAME='test-nginx'
DIGEST='sha256:c5a9d0f5(..snip..)'
MANIFEST=$(aws ecr batch-get-image --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST} --output text --query 'images[].imageManifest')
  • マニュフェストの内容を確認
$ echo ${MANIFEST} | jq . | head -n 14
{
  "schemaVersion": 2,
  "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
  "config": {
    "mediaType": "application/vnd.docker.container.image.v1+json",
    "size": 7311,
    "digest": "sha256:5406299(..snip..)"
  },
  "layers": [
    {
      "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
      "size": 29126278,
      "digest": "sha256:f11c1adaa26e0(..snip..)"
    },

「latest」タグの反映

イメージマニフェストを利用して、「latest」タグを反映しました。

REPOSITORY_NAME='test-nginx'
DIGEST='sha256:c5a9d0f5(..snip..)'
MANIFEST=$(aws ecr batch-get-image --repository-name ${REPOSITORY_NAME} --image-ids imageDigest=${DIGEST} --output text --query 'images[].imageManifest')
aws ecr put-image --repository-name "${REPOSITORY_NAME}" --image-tag latest --image-manifest "${MANIFEST}"

確認

「list-images」を実行、 「latest」タグが指定したイメージに反映された事を確認しました。

aws ecr list-images --repository-name  "${REPOSITORY_NAME}" 
{
    "imageIds": [
        {
            "imageDigest": "sha256:39fd5f65(..snip..)"
        },
        {
            "imageDigest": "sha256:c5a9d0f5(..snip..)",
            "imageTag": "latest"
        },
        {
            "imageDigest": "sha256:37a1876c(..snip..)"
        }
    ]
}

マネジメントコンソールのでも、つけ直したイメージタグが確認できました。

タグ書き換え後

まとめ

今回の様な「latest」タグの付け直し操作、Dockerコマンドでも行うことは可能です。

ただ、Dockerコマンドの利用には実行環境の準備や、イメージ容量が大きい場合、所要時間が問題になる事があります。

Amazon ECR コンテナイメージを利用する App Runner環境で、新しいイメージのリリース後に発生した障害対応として、緊急の切り戻しをAWS側から行う場合、今回のイメージタグの書き換えを実施した後、App Runnerのデプロイ操作をお試しください。

参考

Dockerコマンド利用したタグ付け

Dockerコマンド利用したタグ付け操作の例です。

docker 設定

  • Amazon Linux 2023用
sudo dnf install docker jq -y
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
sudo su - ec2-user

Pull

イメージファイルを ダイジェスト指定でpull

ACCOUNT='000000000000'
REGION='ap-northeast-1'
REPOSITORY_NAME='test-nginx'

aws ecr get-login-password | docker login --username AWS --password-stdin ${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com
aws --region ${REGION} ecr describe-images --repository-name ${REPOSITORY_NAME}

DIGEST='sha256:37a187(..snip..)'
docker pull "${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPOSITORY_NAME}@${DIGEST}"

タグ付け

イメージIDを確認して、タグ付け

docker image ls
IMAGE_ID='####'
docker tag "${IMAGE_ID}" "${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPOSITORY_NAME}:latest"

Push

タグ付けしたイメージをPushします。

docker push "${ACCOUNT}.dkr.ecr.${REGION}.amazonaws.com/${REPOSITORY_NAME}:latest"

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.