AWSCLIで過去のコンテナイメージに「latest」タグをつけ直してみた
AWS CLI の put-image コマンドを利用して、過去に利用していた Amazon ECR コンテナイメージに、「latest」 タグをつけ直す機会がありました。その手順を紹介します。
実行環境
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"