[アップデート] Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました

[アップデート] Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました

Clock Icon2025.03.13

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

Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました

https://aws.amazon.com/jp/about-aws/whats-new/2025/03/amazon-ecr-pull-through-cache/

アップデート内容

プルスルーキャッシュ、みなさん使っていますでしょうか?

パブリックでホストされるコンテナイメージをプライベートリポジトリをキャッシュすることで、NAT Gateway の利用費を下げられるあの機能です。

https://dev.classmethod.jp/articles/launch-ecs-task-from-public-image-through-vpce/

今までアップストリームレジストリには、次のリポジトリがサポートされていました。

  • Amazon ECR Public (public.ecr.aws)
  • Kubernetes コンテナレジストリ (registry.k8s.io)
  • Quay (quay.io)
  • Docker Hub (registry-1.docker.io)
  • GitHub コンテナレジストリ (ghcr.io)
  • Microsoft Azure コンテナレジストリ (azurecr.io)
  • GitLab コンテナレジストリ (registry.gitlab.com)

今回、新たに ECR Private リポジトリ (aws_account_id.dkr.ecr.region.amazonaws.com) が追加されました。というものです。

Push 型と Pull 型

このアップデートの嬉しさって何だろうと考えた時、同じような機能で ECR のレプリケーション機能が挙げられます。

両者の違いとして ECR レプリケーションは Push 型、 プルスルーキャッシュは Pull 型の同期になります。

ECR レプリケーション (Push 型)

ECR プルスルーキャッシュ (Pull 型)

Untitled(139).png

ご覧の通り、ECR プルスルーキャッシュは必要なイメージタグのみ、ターゲットレポジトリで保持するため、単にクロスアカウント/リージョンでイメージを共有したいケースの場合、保持データ、転送データのコスト削減が見込めます。

ただし、プルスルーキャッシュは性質上、特定のイメージタグに対する内容が最新かどうかは、最短でも 24 時間に 1 回までのチェックとなるため注意です。

特定のイメージタグを利用し、1日に数回以上のデプロイ頻度がある場合は、ユースケースに向かない可能性があります。

When a cached image is pulled through the Amazon ECR private registry URI, Amazon ECR checks the upstream repository at least once every 24 hours to verify whether the cached image is the latest version. If there is a newer image in the upstream registry, Amazon ECR attempts to update the cached image. This timer is based off the last pull of the cached image.

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

やってみた

それでは実際に、クロスアカウントの同一リージョンで、 ECR のプルスルーキャッシュ設定を試してみたいと思います。

ソース

まず、ソースリポジトリには、事前に 3 つのイメージを格納しておきます。

2025-03-13 at 16.12.44-Elastic Container Registry - Images.png

IAM の設定です。ターゲットの AWS アカウントからイメージを Pull できるよう、レジストリポリシーを設定します。

444455556666 の部分にターゲットの AWS アカウント ID が入ります。111122223333 にソースの AWS アカウント ID が入ります。

{
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::444455556666:root"
    },
    "Action": [
        "ecr:BatchGetImage",
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchImportUpstreamImage",
        "ecr:GetImageCopyStatus"
    ],
    "Resource": "arn:aws:ecr:region:111122223333:repository/*"
}

マネジメントコンソールを確認すると、ポリシータイプに プルスルーキャッシュ - ECR クロスアカウント の項目が増えていました。

2025-03-13 at 16.12.44-Elastic Container Registry - Images.png

アカウント ID を入力し保存を押すとレジストリポリシーが作成されました。Resource 句の部分は、適宜変更しましょう。

2025-03-13 at 16.21.16-Elastic Container Registry - Registry Permissions.png

ターゲット

続いてターゲット側の設定です。別アカウントに切り替えます。

まずは IAM ロールの作成を行います。次のポリシーが付与された IAM ロールを作成します。

信頼ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "pullthroughcache.ecr.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}

IAM ポリシー

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:GetAuthorizationToken",
                "ecr:BatchImportUpstreamImage",
                "ecr:BatchGetImage",
                "ecr:GetImageCopyStatus",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload",
                "ecr:PutImage"
            ],
            "Resource": "*"
        }
    ]
}

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

今回はインラインポリシーで設定しました。同じく Resource 句の部分は、適宜変更しましょう。

2025-03-13 at 16.25.08-pull-through-update-role  IAM  Global.png

プルスルーキャッシュの設定に移ります。クロスアカウントから、ソースとなる AWS アカウントを選択します。

2025-03-13 at 16.26.52-Elastic Container Registry - Pull Through Cache - Create Rule.png

先ほど選んだ IAM ロールを設定します。

2025-03-13 at 16.28.02-Elastic Container Registry - Pull Through Cache - Create Rule.png

最後に名前空間の設定です。ターゲット側の キャッシュ名前空間 を ROOT にすると通常の ECR への pull と見分けがつかなくなるため、 ecr-to-ecr をプレフィックスに設定しました。

名前空間の例で、利用イメージがわかるのはありがたいですね。

2025-03-13 at 16.29.33-Elastic Container Registry - Pull Through Cache - Create Rule.png

キャッシュルールが作成されました。

2025-03-13 at 16.31.42-Elastic Container Registry - Pull Through Cache - Rule Detail.png

動作確認

それではターゲット側アカウントで ECR のイメージプルを行います。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com
docker pull ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2

うまくイメージがプルできていますね。

~ $ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com
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
~ $ docker pull ターゲット.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2
v2: Pulling from ecr-to-ecr/pull-through-update
4b6d8039d953: Pull complete 
9c7e9e9ee40a: Pull complete 
7adbbc838ccf: Pull complete 
8042b66d8510: Pull complete 
7b5a8ee0226d: Pull complete 
54152a8f26f2: Pull complete 
Digest: sha256:93d3bdb16d38bd9e6452766e74993c9f46748fe44bb9a55a987f21656d4a1023
Status: Downloaded newer image for ターゲットアカウント.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2
ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2

レポジトリが作成され、v2 のイメージタグのみが取得されています。イメージダイジェストは sha256:93d3 から始まっています。

2025-03-13 at 16.35.00-Elastic Container Registry - Images.png

続いて、ソース側の v2 タグのイメージを更新してみます。ダイジェストは sha256:3d85 から始まるものになりました。

2025-03-13 at 16.39.42-Elastic Container Registry - Images.png

再度ターゲットに戻り、v2 のイメージプルを行います。

aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com
docker pull ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2

内容は変わらず sha256:93d3 から始ま流ものが取得されていますね。

~ $ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com
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
~ $ docker pull ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2
v2: Pulling from ecr-to-ecr/pull-through-update
Digest: sha256:93d3bdb16d38bd9e6452766e74993c9f46748fe44bb9a55a987f21656d4a1023
Status: Image is up to date for ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2
ターゲットアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-to-ecr/pull-through-update:v2

まとめ

以上、「Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました」でした。

図解したように、レプリケーション機能とは似て非なる用途ですのでユースケースにマッチすれば、コスト削減できそうだなと思っていただけると幸いです。

このブログがどなたかの参考になれば幸いです。

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

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.