【AWS】Amazon ECR ~ pull through cache rules ~

■ はじめに

https://dk521123.hatenablog.com/entry/2024/04/08/184035

の続き。

現状 ECR Public の VPC エンドポイントは未サポートのため
AWS ECR Public Gallery 内のDockerイメージを
VPC エンドポイント経由で Pull はできない(※1)。

そこで、「pull through cache rules(プルスルーキャッシュルール)」
を使えば、VPC エンドポイント経由でもパブリックイメージを
Pullできそうなので調べてみた

※1:ECR Public の VPC エンドポイント未サポート
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/vpc-endpoints.html

より抜粋
~~~~~~~~~
現在、VPC エンドポイントは Amazon ECR パブリックリポジトリをサポートしていません。
プルスルーキャッシュルールを使用して、VPC エンドポイントと同じリージョンにある
プライベートリポジトリでパブリックイメージをホストすることを検討してください。
詳細については、「プルスルーキャッシュルールの使用」を参照してください。
~~~~~~~~~

目次

【1】pull through cache rules
【2】設定方法
 1)「Pull through cache」の設定手順
 2)「Permissions」の設定手順
 3)docker pull までの流れ
【3】使用上の注意

【1】pull through cache rules

* プルスルーキャッシュルールを使用すると、
 AWS ECR Public/Docker HubなどのDockerイメージを
 Amazon ECR プライベートレジストリに同期できる

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html
https://aws.amazon.com/jp/about-aws/whats-new/2021/11/amazon-ecr-cache-repositories/

【2】設定方法

* AWSServiceRoleForECRPullThroughCache ロールが必要

1)「Pull through cache」の設定手順

[1] AWS Management Console にログイン
[2] 「Elastic Container Registry」(Amazon ECR)のページに移動
[3] 「Private registry」欄 の [Settings]を選択
[4] 「Pull through cache」欄 の [Edit]を選択
[5] 「Pull through cache configuration」ページ の「Add rule」ボタン押下
[6] 「Specify a source」ページ で「Upstream source registry」を選択し
 (ここでは「ECR public」)「Next」ボタン押下
[7] 「Specify a destination」ページ で「Amazon ECR repository namespace」の
 「Amazon ECR repository prefix」を入力し(ここでは「ecr-public」)
 「Next」ボタン押下
[8] 「Create」ボタン押下

AWS CLI の場合

aws ecr create-pull-through-cache-rule \
--region us-west-2 \
--ecr-repository-prefix ecr-public \
--upstream-registry-url public.ecr.aws

https://docs.aws.amazon.com/cli/latest/reference/ecr/create-pull-through-cache-rule.html

CloudFormation の場合
https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecr-pullthroughcacherule.html

Resources:
  DemoECRPullThroughCacheRule:
    Type: 'AWS::ECR::PullThroughCacheRule'
    Properties:
      EcrRepositoryPrefix: 'ecr-public'
      UpstreamRegistry: 'ecr-public'

2)「Permissions」の設定手順

[1] AWS Management Console にログイン
[2] 「Elastic Container Registry」(Amazon ECR)のページに移動
[3] 「Private registry」欄 の [Settings]を選択
[4] 「Permissions」欄 の [Edit]を選択
[5] 「Registry permissions」ページ の「Generate statement」ボタン押下
[6] 「Generate statement」ページ で以下を入力し「Save statement」ボタン押下
 => もしくは「JSON」を選択し、
 後述「※2:AWS ECR / Permissions JSON例」を参考に入力
 * Policy type: Pull through cache policy
 * Statement id: 任意の文字列(e.g. ForPullingThroughCachePolicy)
 * IAM entities: 対象IAMロール(今回は、EC2にAttachしているIAMロール)
 * Repository namespace: 1)の [7] で入力したAmazon ECR repository prefix
  (今回は「ecr-public」)
 * Repository names: 対象のDockerイメージ名/UpstreamRepositoryName
 (今回は「docker/library/flink」)

※2:AWS ECR / Permissions JSON

{
  "Sid": "ForPullingThroughCachePolicy",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::123456789012:demo-ec2-role" <=IAMロール
  },
  "Action": [
    "ecr:CreateRepository",
    "ecr:BatchImportUpstreamImage"
  ]
  "Resource": "arn:aws:ecr:us-east-2:123456789012:repository/ecr-public/docker/library/flink" <= ECR Repository ARN
}

補足:関連するAction
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html

より抜粋
~~~~~~~
ecr:BatchImportUpstreamImage
 – 外部イメージを取得し、プライベートレジストリにインポートする
 アクセス許可を付与します。

ecr:CreateRepository
 – プライベートレジストリにリポジトリを作成するアクセス許可を付与します。
 キャッシュされたイメージを格納するリポジトリがまだ存在しない場合には、
 この許可が必要となります。
~~~~~~~

* どうも、動き的には、pullして同じ名前のPrivte ECR repository がなかったら作成する
 => その際に「ecr:CreateRepository」が必要

* Privte ECR repository に対象Docker imageがなかったら、取得しにいく
 => その際に「ecr:BatchImportUpstreamImage」が必要

3)docker pull までの流れ

[1] AWS Management Console にログイン
[2] 「Elastic Container Registry」(Amazon ECR)のページに移動
[3] 「Private registry」欄 の [Settings]-[Pull through cache]を選択
[4] 「Pull through cache configuration」ページで
  対象のDestination namespaceを選択する (ここでは「ecr-public/」)
[5] 「Pull through cache rule detail」欄の
  右上にある「View pull command」ボタン押下
 => 「Pull command for XXX(ここでは「ecr-public」)」が表示される

例:Dockerイメージ「docker/library/flink:1.18.0」をPullする場合
https://gallery.ecr.aws/docker/library/flink

# Step1: docker login
#  => AWS Region: us-west-2 / AWS account ID: 123456789012
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-west-2.amazonaws.com

# Step2: docker pull
# => docker pull 123456789012.dkr.ecr.us-west-2.amazonaws.com/{RepositoryNamespace(ecr-public)}/{UpstreamRepositoryName(docker/library/flink)}:{ImageTag(1.18.0)}
docker pull 123456789012.dkr.ecr.us-west-2.amazonaws.com/ecr-public/docker/library/flink:1.18.0

【3】使用上の注意

* 以下の公式ドキュメントに記載。

https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html#pull-through-cache-considerations

参考文献

https://dev.classmethod.jp/articles/launch-ecs-task-from-public-image-through-vpce/
https://dev.classmethod.jp/articles/ecr-pull-through-cache-repositories/
https://qiita.com/t_tsuchida/items/d3c284aac0f84a597c70
https://qiita.com/yoshii0110/items/2cac49fc919d9a8465c7

関連記事

Amazon ECR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/22/165711
Amazon ECR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/26/142645
Amazon ECR ~ AWS CLI
https://dk521123.hatenablog.com/entry/2024/01/05/000000
Amazon ECR ~ boto3 ~
https://dk521123.hatenablog.com/entry/2024/01/31/014010
Amazon ECR ~ Dockerイメージを Pull & Push ~
https://dk521123.hatenablog.com/entry/2023/12/02/024631
Amazon ECR ~ AWS ECR Public Gallery ~
https://dk521123.hatenablog.com/entry/2024/04/08/184035
Amazon ECR ~ 脆弱性診断 / Amazon Inspector ~
https://dk521123.hatenablog.com/entry/2024/01/22/210831
Terraform ~ AWS ECR ~
https://dk521123.hatenablog.com/entry/2023/05/23/002314
Amazon ECR でのトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/05/24/000000
IAM ~ Service-Linked Roles ~
https://dk521123.hatenablog.com/entry/2023/01/22/000000