■ はじめに
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 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://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