以下の内容はhttps://developersblog.dmm.com/entry/2025/02/05/110000より取得しました。


Amazon ECRプルスルーキャッシュを使ってみた

サムネイル

はじめに

こんにちは。ITインフラ本部 SRE部の湯浅です。

本記事では、Amazon Elastic Container Registry (以下、ECR)の機能の1つである、プルスルーキャッシュリポジトリ機能の使い方についてご紹介していきます。

AWSのプライベートサブネット内のコンテナワークロードでは、パブリックレジストリからイメージを取得する際、NAT Gateway(以下、NAT)を経由して通信します。

そして、そのようなNAT経由のデータ通信量が多いとコストも増えていきます。

そこで、ECRのプルスルーキャッシュを活用することで、パブリックなコンテナイメージをECRにキャッシュし、プライベートサブネットからはECR経由でイメージを取得できます。

これにより、NAT を介した通信量を削減し、コストの抑制が可能になります。

ECRのプルスルーキャッシュリポジトリとは

ECRのプルスルーキャッシュリポジトリとは、Docker Hubやその他のパブリックレジストリのイメージを、AWS内にキャッシュして利用できる仕組みです。

プルスルーキャッシュリポジトリ機能の全体イメージ

プルスルーキャッシュリポジトリの全体イメージは以下のとおりです。

  1. 初回は、NAT 経由 で ECR Public Registry からイメージ取得
  2. ECR Private Registry上にイメージキャッシュが作成される
  3. 二回目以降は、VPCエンドポイント経由でキャッシュからイメージ取得します

画像

なお、VPCエンドポイントについては、以下を設定しておいてください。

  • com.amazonaws.${region}.ecr.dkr
  • com.amazonaws.${region}.ecr.api
  • com.amazonaws.${region}.s3

${region} はご自身の環境のリージョン名となります。

プルスルーキャッシュ機能を使いはじめる前に確認すること

NAT を介した通信コスト抑制の可能性について最初にお伝えしましたが、プルスルーキャッシュ機能を利用する場合としない場合で、それぞれ発生するコストが異なります。

そのため、プルスルーキャッシュ機能を使った場合にどれぐらいコスト削減の余地がありそうか、以下の2つについて事前に確認しておきましょう。

  • (1)NAT 経由のイメージpull通信コスト
  • (2)プルスルーキャッシュ機能利用時のストレージ費用

(1)NAT 経由のイメージpull通信コスト

NAT 経由でのイメージpullをどれぐらい行っているのかは、VPCフローログの情報から確認できます。

以下のエンドポイント向けの通信データサイズが大きい場合、プルスルーキャッシュ機能を活用して通信コストを抑制できる可能性があります。

  • d5l0dvt14r5h8.cloudfront.net.: パブリックECRのコンテナイメージを配信しているエンドポイント
  • production.cloudflare.docker.com.: Docker hubのコンテナイメージを配信しているエンドポイント

※ VPCフローログの分析方法については、当記事では割愛します。詳細は、以下をご確認ください。

(参考)CloudWatch LogsでのNAT Gateway通信ログ分析のサンプルクエリ

(2)プルスルーキャッシュ機能利用時のストレージ費用

キャッシュされたデータはストレージに保存され、GB/月あたり USD 0.10の費用が発生します。

そのため、もしキャッシュされるデータサイズが大きく、かつ、 そのキャッシュの利用頻度が少ない場合、プルスルーキャッシュ機能を利用するほうが逆に割高になる可能性があります。

プルスルーキャッシュの設定方法

それではここから、具体的なプルスルーキャッシュの設定方法について説明します。

キャッシュ可能なパブリックレジストリとして、Docker HubGitHub コンテナレジストリなど、複数のレジストリが対応していますが、今回は、ECRパブリックレジストリ の場合を例に挙げて説明します。

この、ECRパブリックレジストリ とは、 AWSがパブリックに公開している、認証なしでイメージ取得ができる public.ecr.aws のようなドメインで始まるものを指しています。

プルスルーキャッシュを利用するにあたって、大きくは以下の2つが必要となります。

  • プルスルーキャッシュルール の作成
  • キャッシュ用レジストリ操作のための権限付与

プルスルーキャッシュルール の作成

設定方法として、今回は、AWS Webコンソールでの設定方法と、Terraformでの設定方法を紹介します。

AWS Webコンソールから設定する場合

ECR の画面のプライベートレジストリのメニューで Features & SettingsPull through cache にある ルールの追加 を選択します。

画像

  1. アップストリームレジストリ の設定で ECR Public を選択してください。 画像

  2. キャッシュ名前空間キャッシュリポジトリプレフィックス で任意のネームスペースを指定してください。

    • デフォルトは ecr-public です
    • 間にスラッシュを挟んで複数階層のパスにもできます
      • 例) ecr-public/example 画像
  3. 設定確認画面が出てくるので、問題なければ作成ボタンを押して完了です。

Terraform から作成する場合

以下のようにTerraformからも作成できます。

ecr_repository_prefix の値については、任意の名前空間を設定してください。

resource "aws_ecr_pull_through_cache_rule" "this" {
    ecr_repository_prefix = var.ecr_ptc_name_space # 任意のキャッシュ名前空間
    upstream_registry_url = "public.ecr.aws"
}

※ バージョンは、terraform: 1.10.4, aws_provider: 5.84.0 で検証しています。

キャッシュ用レジストリ操作のための権限付与

プルスルーキャッシュは、イメージをキャッシュするための プライベートレジストリの作成 が必要となるため、その権限が必要なります。

具体的には、以下のようなポリシー(権限)が必要になります。

ecr:CreatePullThroughCacheRule
ecr:BatchImportUpstreamImage
ecr:CreateRepository

プルスルーキャッシュのポリシーの設定箇所

プルスルーキャッシュのポリシーは以下のいずれかに必ず設定してください。
※ 権限が不足していると、キャッシュ経由でのイメージ取得に失敗します。

設定方法 1. IAMユーザー/ロールへのポリシー設定

  • 他のIAM権限と同様に、ユーザーまたはロール単位で権限を設定します。

設定方法 2. ECRプライベートレジストリへのポリシー設定

  • リポジトリ単位での権限設定となります。
  • クロスアカウントで、外部のAWSアカウントからの権限を許可したい場合などは、こちらに設定します。

上記1. の設定方法は、一般的なIAMユーザー/ロールでの設定方法と同じですので割愛します。今回は、上記2. の設定方法について紹介します。

AWS Webコンソールから設定する場合
  1. ECR の画面のプライベートレジストリのメニューでFeatures & SettingsPermissions を開き、ステートメントを作成 を選択してください。 画像

  2. ポリシーステートメント設定画面で、パラメータを設定してください。 画像

パラメータ 設定値について
ポリシータイプ プルスルーキャッシュ-スコープ を設定
ステートメントID 任意のステートメントIDを設定
IAMエンティティ アクセスを許可するIAMユーザー/ロール を設定(たとえばECSなら、ECSタスク実行ロールを指定)
キャッシュ名前空間 前述で作成したプルスルーキャッシュの名前空間を設定
リポジトリ名 アクセス先となるリポジトリ名を設定

リポジトリ名 は、IAMポリシーの Resouce に対応する項目なので、通常、ワイルドカードが指定できます。
しかし、GUI上ではパス内にワイルドカード(*)を含めると、入力チェックエラーでうまく設定できないようです。
ワイルドカードを含めたい場合は、JSON形式であれば編集、保存できました。(2025/1/24 時点)

  • 例) "arn:aws:ecr:ap-northeast-1:xxxxxxxxxxxx:repository/ecr-public/example/*"
Terraform から作成する場合

ECRプライベートレジストリのポリシー設定のTerraformでの設定例は以下のとおりです。

Principal および Resource の部分は、実際に利用するロール名やリソースに書き換えてください。

resource "aws_ecr_registry_policy" "this" {
    policy = jsonencode({
        Version = "2012-10-17",
        Statement = [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::XXXXXXXXXXXX:role/ecsExecutionRole"
                },
                "Action": [
                    "ecr:CreateRepository",
                    "ecr:BatchImportUpstreamImage"
                ],
                "Resource": [
                    "arn:aws:ecr:ap-northeast-1:XXXXXXXXXXXX:repository/ecr-public/example/*"
                ]
            }
        ]
    })
}

プルスルーキャッシュを利用する際のイメージURLについて

今まで利用していた ECRパブリックレジストリ のイメージを、プルスルーキャッシュ経由で利用するには利用するアプリケーション側で、URLの書き換えが必要になります。

書き換え例

以下は、AWS fluent-bit の公式イメージを利用する場合の例です。 ご自身の環境や実際に利用したいイメージパスなどに応じて書き換えてください。

  • xxxxxxxxxxxx は、自身のAWSアカウントIDと書き換えてください
  • ecr-public/example/ の部分はプルスルーキャッシュの名前空間にあたります
  • public.ecr.aws/<イメージパス>xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/<ネームスペース>/イメージパス のようになります
キャッシュ利用有無 イメージURL
キャッシュ利用しない場合のURL public.ecr.aws/aws-observability/aws-for-fluent-bit:2.23.3
キャッシュ利用時のURL xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/example/aws-observability/aws-for-fluent-bit:2.23.3

実際に作成されるキャッシュレジストリについて

プルスルーキャッシュの機能を使って、実際にイメージがキャッシュされると、以下のようにプライベートレジストリが作成されます。

画像

キャッシュイメージの自動更新について

AWS公式ドキュメント にも記載があるとおり、キャッシュされたイメージは、少なくとも24時間に1回、最新版かどうかの確認、更新が行われます。そのため、latestタグなど、内部的にバージョンが固定されないものを利用している場合は、そのイメージが裏で自動更新されている可能性がありますのでご注意ください。

まとめ

このように、Amazon ECR の プルスルーキャッシュリポジトリ機能 によってコンテナイメージをキャッシュでき、さらにVPCエンドポイントと組み合わせることでNAT Gatewayの通信コスト削減が期待できます。
設定も簡単ですので、ぜひ、この機能を活用してみてください。

SRE部では、一緒に働く仲間を募集しています。ご興味のある方はこちらへ!
dmm-corp.com




以上の内容はhttps://developersblog.dmm.com/entry/2025/02/05/110000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14