[プレビュー] プルスルーキャッシュで透過的に作成されるリポジトリを自動で初期設定するリポジトリ作成テンプレートが発表されました

プレビューで ECR Public で透過的に作成されるリポジトリに対して初期設定を行えるリポジトリ作成テンプレートが発表されました。
2024.02.03

こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。

Amazon ECR に 「リポジトリ作成テンプレート」 機能がプレビュー発表されました。このアップデートで、 プルスルーキャッシュで透過的に作成される ECR リポジトリ作成時の初期設定を自動化できるようになりました。

プレビューで登場しています。今後 GA までに、仕様変更が伴う可能性があります。現在はマネジメントコンソールのみで設定可能です。

何が嬉しいか

今まで、プルスルーキャッシュで透過的に作成されるリポジトリに対して、KMS 暗号化(暗号化設定)を行うことはできませんでした。また、 ECR の暗号化設定は、リポジトリ作成後に変更できない仕様となっています。

そのため、 KMS 暗号化を行うには事前に AWS CLI やマネジメントコンソールで、プルスルーキャッシュを行うリポジトリを作成する必要がありました。1

IaC や AWS CLI で事前に作っておけばいいじゃん!と思う方もいらっしゃると思いますが、「プルスルーキャッシュリポジトリは透過的に作られるもの」だと、脳裏に焼き付いている方(私も含めて)もいると思います。そんな方をお助けするのが、 リポジトリ作成テンプレート です。

ECR に保管するイメージを KMS で暗号化する方法を教えてください より引用

アップデート内容

今回のアップデートで、透過的なリポジトリ作成が行われた際の初期設定値を リポジトリ作成テンプレート 機能によってコントロール(自動でセットアップ)できるようになりました。

初期設定値は暗号化設定のみならず、以下の設定が自動でセットアップ可能になります。

  • イメージタグの変更可能性
    • 基本的に MUTABLE が推奨値
  • 暗号化設定(再掲)
    • AES256 or SSE-KMS
  • リポジトリ権限(リポジトリポリシー)
    • クロスアカウントから参照する等の設定など
  • リポジトリライフサイクルポリシー
    • 世代や日付ベースのライフサイクル管理
  • リソースタグ
    • リポジトリのタグ

上記の設定可能な項目は、テンプレートのバージョンという名前でバージョン管理されており、現在は TV1 となっています。 Amazon ECR によって、透過的にリポジトリが作成される際のリクエスト内容に、リポジトリ作成テンプレートの内容を含めるような動きのようです。

リポジトリ作成テンプレートの仕組み から引用

やってみた

今回は ECR Public のプルスルーキャッシュ設定および、リポジトリ作成テンプレートを作成、挙動を確認してみたいと思います。

プルスルーキャッシュ設定

ECR Public をプルスルーキャッシュするよう、 AWS CLI にて設定します。

aws ecr create-pull-through-cache-rule \
     --ecr-repository-prefix ecr-public \
     --upstream-registry-url public.ecr.aws \
     --region ap-northeast-1

実行結果

[cloudshell-user@ip-10-132-85-215 ~]$ aws ecr create-pull-through-cache-rule \
>      --ecr-repository-prefix ecr-public \
>      --upstream-registry-url public.ecr.aws \
>      --region ap-northeast-1
{
    "ecrRepositoryPrefix": "ecr-public",
    "upstreamRegistryUrl": "public.ecr.aws",
    "createdAt": "2024-02-01T01:08:44.092000+00:00",
    "registryId": "XXXXXXXXXXXX"
}
[cloudshell-user@ip-10-132-85-215 ~]$

マネジメントコンソールからも、プルスルーキャッシュ設定が作成されていることが確認できます。

リポジトリ作成テンプレート

では、今回アップデートのあった リポジトリ作成テンプレート を作っていきたいと思います。

画面左の 「Creation templates Preview」 をクリックして、さらに「テンプレートを作成」をクリックします。

テンプレートの詳細は、リポジトリに対してテンプレートの定義を割り当てるかを決めます。例えば、 ecr-public をテンプレートのプレフィックスに指定した場合、 ecr-public/ から始まるリポジトリが対象になります。先ほど作成した ECR Public のプルスルーキャッシュ設定から透過的に作成されるリポジトリも対象になります。なお、プレフィックスを指定しない形式(ROOT)でも設定可能です。この場合は、別のテンプレートと一致しなかったプレフィックスのリポジトリが対象になります。

今回は ecr-public を プレフィックスに指定して挙動を確認してみます。

続いて、リポジトリ設定です。イメージタグのイメージタグの変更可能性等のリポジトリの初期セットアップ部分をここでは設定します。

今回は、暗号化設定を AES-256 から AWS KMS (AWS マネージドキー) に設定してみます。

リポジトリ権限 や リポジトリライフサイクルポリシー の部分では、サンプルコードが選択できるようになっていました。ドキュメント漁らずに設定できるのいいですね。

今回はスキップして 「次へ」 を選択します。

最後に確認画面です。画面にも記載されている通り、 プレフィックスは、テンプレートの作成後は変更できない ため注意です。(プレフィックス以外も変更できなさそうな気がしますが、気にしないでおきます。)

作成」 でリポジトリ作成テンプレートを作ります。

動作確認

それでは、動作確認として ECR Public から Nginx のコンテナイメージを pull して、透過的に ECR リポジトリを作成してみます。

# 環境変数設定
ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
REGION=ap-northeast-1
ECR_PRIVATE_REPOSITORY_URL=${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com

aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ECR_PRIVATE_REPOSITORY_URL
docker image pull $ECR_PRIVATE_REPOSITORY_URL/ecr-public/nginx/nginx:latest

実行結果

[cloudshell-user@ip-10-134-3-14 ~]$ ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
[cloudshell-user@ip-10-134-3-14 ~]$ REGION=ap-northeast-1
[cloudshell-user@ip-10-134-3-14 ~]$ ECR_PRIVATE_REPOSITORY_URL=${ACCOUNT_ID}.dkr.ecr.${REGION}.amazonaws.com
[cloudshell-user@ip-10-134-3-14 ~]$ 
[cloudshell-user@ip-10-134-3-14 ~]$ aws ecr get-login-password --region $REGION | docker login --username AWS --password-stdin $ECR_PRIVATE_REPOSITORY_URL
WARNING! Your password will be stored unencrypted in /home/cloudshell-user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
[cloudshell-user@ip-10-134-3-14 ~]$ docker image pull $ECR_PRIVATE_REPOSITORY_URL/ecr-public/nginx/nginx:latest
latest: Pulling from ecr-public/nginx/nginx
af107e978371: Pull complete 
1581bea9f1d2: Pull complete 
8fb6e3475860: Pull complete 
7bfc9d79c672: Pull complete 
3ebd268aebca: Pull complete 
e5fab51fcab0: Pull complete 
04dda7b4828c: Pull complete 
Digest: sha256:a2b1c73e647b13eb8d17011a08fed1b3fcac171373efdac872336964983ada9d
Status: Downloaded newer image for XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/nginx/nginx:latest
XXXXXXXXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/nginx/nginx:latest
[cloudshell-user@ip-10-134-3-14 ~]$

透過的に作成されたリポジトリを確認すると、暗号化タイプが想定通り KMS になっていますね。

余談

余談ですが、リポジトリ作成テンプレートはクローンして複製することができます。プレフィックスだけ変えて、あとは同じにしたいケースに使えそうですね。

まとめ

以上、「プルスルーキャッシュで透過的に作成されるリポジトリを自動で初期設定するリポジトリ作成テンプレートが発表されました」でした。

プレビュー段階であるためこれからの機能拡張や仕様変更にはお気をつけください。 GA されるのが楽しみですね。この記事がどなたかの参考になれば幸いです。

AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!


  1. 透過的なレポジトリ作成は、既存でリポジトリが作成されている場合、スキップされます