見出し画像

【AWS備忘録】ECRリポジトリ内のイメージタグを瞬時に追加する

こんにちはこぐまです。
AWS備忘録の記事です。

本日は、
「ECRリポジトリ内のイメージタグを瞬時に追加する」
の備忘録です。

結論

【対象イメージのマニフェストファイルをとってくる】
IMAGE_MANIFEST=`aws ecr batch-get-image \
--registry-id <AWSアカウントID> \
--region <リージョン名> \
--repository-name <リポジトリ名> \
--image-ids imageTag=<もともとついているタグ> \
--query 'images[].imageManifest' \
--output text`

【マニフェストファイルを書き換えて再プッシュ】
aws ecr put-image 
--registry-id <AWSアカウントID> 
--region <リージョン名>
--repository-name <リポジトリ名>
--image-tag <追加でつけたいタグ>
--image-manifest $IAMGE_MANIFEST

メモ解説

2段階あります。この順番で実施すれば大丈夫です。
1つ目は、【対象イメージのマニフェストファイルをとってくる】
2つめは、【マニフェストファイルを書き換えて再プッシュ】

イメージのタグを追加する場合、わざわざイメージ本体をDLしてきて、付け替えて再プッシュするのではなく、イメージの設計図(マニフェストファイルというらしい)だけをDLしてきて変更して再プッシュすればいいようです。イメージファイルが数百GBに及ぶ場合、この方法はとても便利です。

ちなみに、<追加でつけたいタグ>がすでに別のイメージについているときは、その別のイメージからひっぺがしてこのイメージに付け替えてくれます。たとえば「latest」とか「リリースするイメージを判別する固定のタグ」なんかを付け替えるときに便利です。

1段階目では、「aws ecr batch-get-image・・・」の出力結果を
「IMAGE_MANIFEST」という変数に格納してます。変数名は何でもいいです。
2段階目の最後でこの変数の中身を「--image-manifest」の引数として指定してます。

「--resistry-id」はオプションです。省略した場合は、コマンドを実行しているAWSアカウントIDとなります。
「--region」はオプションです。省略した場合は、コマンドを実行しているリージョン内のECRリポジトリが対象となります。
「--repository-name」は必須です。ECRのリポジトリ名を指定します。
「--image-ids」は必須です。リポジトリ内のイメージを特定する方法として、タグで指定するダイジェストで指定するかを選べます。
今回はタグで指定しているので、--image-ids に続けて、「imageTag=<もともとついているタグ>」とします。
ダイジェストで指定する場合は、--image-idsに続けて、「imageDigest=<ダイジェストID>」とします。(ダイジェストIDとは、sha256:・・・と続くやつのことです)


【背景】
不意にECSのコンテナが落ちた時、そのコンテナを含むタスクがECSサービスで起動されていれば、その時のタスク定義に記載されたイメージとタグで新しいタスクが瞬時に起動されます。
これはSLA的にはとても嬉しい仕組みですが、例えばタグに「latest」としていた場合、ECRリポジトリに新しいイメージが追加されるたびに、「latest」が移り変わっていくので、コンテナが落ちる前と後で、利用されるイメージの中身が異なってしまいます。
本番環境などある程度固定化した状態でのサービスを継続したい場合は、
タスクがいつ落ちても、前回リリース時点と同じイメージを利用して起動されることが大切だなと感じました。

そこで、リリース時に、利用したイメージに「released」みたいなタグを付与し、タスク定義の中の利用するイメージを記載する部分は「イメージURL:released」と固定することで、タスク定義を都度都度更新する必要もなく、次回リリースまでの期間は(たとえタスクが落ちて再起動しても)常に前回リリース時と同じイメージを利用します。

そんな方法を探していた時に、見つけました。

この記事が気に入ったらサポートをしてみませんか?