【AWS】Amazon ECR のプルスルーキャッシュを導入してみた

## はじめに
コンテナ開発において、Docker イメージの取得は日常的な作業ですが、パブリックレジストリからの頻繁なプルは帯域幅の消費やレートリミットの問題を引き起こす可能性があります。特に CI/CD パイプラインや大規模な開発チームでは、同じイメージを何度もプルすることによる非効率が課題となっています。
Amazon ECR (Elastic Container Registry) のプルスルーキャッシュ機能を使用すると、パブリックレジストリからのイメージをプライベート ECR リポジトリにキャッシュできます。これにより、イメージのプル時間の短縮、帯域幅の節約、外部依存の軽減が可能になります。
本記事では、Amazon ECR のプルスルーキャッシュを実際に設定し、ECR Public からのイメージ取得を検証した結果をご紹介します。
**対象読者**:
- AWS でコンテナ環境を運用している方
- Docker イメージの取得を最適化したい方
- Amazon ECR の機能を深く知りたい方
**検証環境**:
- AWS リージョン: ap-northeast-1 (東京)
- AWS CLI がインストールされた環境
- Docker がインストールされた環境
## 前提条件
### 必要な権限とツール
- AWS アカウントと適切な IAM 権限
  - Amazon ECR へのアクセス権限 (ecr:*)
  - [参考: アップストリームレジストリと Amazon ECR プライベートレジストリを同期するために必要な IAM アクセス許可 - Amazon ECR](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache-iam.html)
- AWS CLI のインストールと設定
- Docker のインストールと設定
### 注意事項
- プルスルーキャッシュを使用すると、キャッシュされたイメージに対して ECR の標準料金が発生します
- キャッシュされたイメージは自動的に更新されますが、更新タイミングには若干の遅延が生じる場合があります
## Amazon ECR プルスルーキャッシュの概要
### プルスルーキャッシュとは
プルスルーキャッシュは、外部のコンテナレジストリからイメージをプルし、プライベート ECR リポジトリにキャッシュする機能です。これにより、以下のメリットが得られます：
1. **高速なイメージ取得**: 一度キャッシュされたイメージは、外部レジストリにアクセスせずに取得可能
2. **帯域幅の節約**: 同じイメージを複数回ダウンロードする必要がない
3. **可用性の向上**: 外部レジストリの障害時でもキャッシュからイメージを取得可能
4. **レートリミットの回避**: パブリックレジストリのプル制限に影響されない
### サポートされているアップストリームレジストリ
- Amazon ECR Public Gallery
- Docker Hub
- Quay.io
- GitHub Container Registry
- Microsoft Azure Container Registry
- GitLab コンテナレジストリ
今回は ECR Public からのキャッシュを検証します。
[参考: アップストリームレジストリと Amazon ECR プライベートレジストリの同期 - Amazon ECR](
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html)
> Amazon ECR は現在、次のアップストリームレジストリのプルスルーキャッシュルールの作成をサポートしています。
>
> Docker Hub、Microsoft Azure コンテナレジストリ、GitHub コンテナレジストリ、および GitLab コンテナレジストリ (認証が必要)
>
> Amazon ECR パブリック、Kubernetes コンテナイメージレジストリ、Quay (認証は不要)
## 実装手順
### STEP1: プルスルーキャッシュルールの作成
1. AWS マネジメントコンソールにログインし、ECR サービスに移動します
2. 左側のナビゲーションペインから「プライベートレジストリ」を選択します
3. 「Features & Settings」タブをクリックします
4. 「Pull through cache」セクションに移動します
5. 「Create rule」ボタンをクリックして新しいルールを作成します
6. 以下の設定を行います：
   - アップストリームレジストリ: ECR Public
   - キャッシュ名前空間: デフォルト設定（ecr-public）
   - アップストリーム名前空間: デフォルト設定
7. 「Create」ボタンをクリックして設定を完了します


![create-pull-through-cache-rule.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251551/43bcea57-09fd-42fe-a7df-8d4b5420a7a2.png)

設定が完了すると、プルスルーキャッシュルールが作成され、ECR Public からのイメージをキャッシュする準備が整います。
[参考：Amazon ECR でのプルスルーキャッシュルールの作成 - Amazon ECR](
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html)


### STEP2: Docker での認証設定
プルスルーキャッシュを使用するには、まず ECR リポジトリに対して Docker クライアントの認証を行う必要があります。
```bash
# AWS CLI を使用して ECR 認証トークンを取得し、Docker に渡す
aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com
```
成功すると、以下のようなメッセージが表示されます：
```
Login Succeeded
```
### STEP3: プルスルーキャッシュを使用したイメージのプル
プルスルーキャッシュを使用してイメージをプルするには、通常の Docker pull コマンドを使用しますが、URL を ECR のプルスルーキャッシュ URL に変更します。
今回は例として、ECR Public から nginx イメージをプルしてみます：
```bash
# プルスルーキャッシュを使用して nginx イメージをプル
docker pull xxxxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/nginx/nginx:latest
```
実行結果：
```
latest: Pulling from ecr-public/nginx/nginx
f5127914701a: Pull complete
492c7b58b293: Pull complete
587f328750b8: Pull complete
60b452932acd: Pull complete
c60ea76daae0: Pull complete
fb23ee5f039b: Pull complete
0b59f5cbcfb9: Pull complete
Digest: sha256:014b3d914c77078e1cd1d7f59a9773f71acbd04957862e05e961bb7bbf2bd656
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
```
これで nginx イメージが正常にプルされ、同時に ECR のプライベートリポジトリにキャッシュされました。
## 検証結果
### キャッシュリポジトリの確認
イメージをプルした後、ECR コンソールでキャッシュリポジトリが自動的に作成されていることを確認できます。
1. ECR コンソールの「リポジトリ」セクションに移動します
2. 「ecr-public/nginx/nginx」という名前のリポジトリが作成されていることを確認します
3. リポジトリ内には、プルしたイメージのタグとダイジェストが表示されています

![nginx-images.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251551/be4f4386-f270-47ec-a43b-f087fc03bab7.png)


検証の結果、以下のことが確認できました：
1. プルスルーキャッシュを使用して ECR Public から nginx イメージをプルできる
2. プル操作によって、自動的に ECR プライベートリポジトリにイメージがキャッシュされる
3. キャッシュされたイメージには Image Index と 2 つの Image が含まれる
### プルスルーキャッシュの動作の仕組み
プルスルーキャッシュを使用してイメージをプルする際の処理フローは以下の通りです：
1. ユーザーが ECR のプルスルーキャッシュ URL を使用してイメージをプルします
2. ECR は、要求されたイメージがキャッシュに存在するかチェックします
3. キャッシュにイメージが存在する場合は、そのイメージを直接返します
4. キャッシュにイメージが存在しない場合は、アップストリームレジストリ（この場合は ECR Public）からイメージをプルし、キャッシュに保存してから返します
5. 既にキャッシュされているイメージでも、アップストリームで更新があった場合はイメージの更新を少なくとも 24 時間に 1 回試みます
[参考：アップストリームレジストリと Amazon ECR プライベートレジストリの同期 - Amazon ECR](
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html)
## 応用例と考察
### コスト最適化のポイント
プルスルーキャッシュを使用する際のコスト最適化ポイントは以下の通りです：
1. **不要なイメージの定期的なクリーンアップ**: キャッシュされたイメージにも ECR の標準ストレージ料金が発生するため、不要になったイメージは定期的に削除しましょう
2. **ライフサイクルポリシーの設定**: キャッシュリポジトリにライフサイクルポリシーを設定し、古いイメージを自動的に削除することでコストを抑制できます
3. **必要なタグのみをキャッシュ**: 全てのタグではなく、必要なタグのみをプルすることで、ストレージコストを削減できます
## まとめ
Amazon ECR のプルスルーキャッシュは、外部レジストリからのイメージ取得をするための機能です。今回の検証では、ECR Public からの nginx イメージのプルとキャッシュを簡単に設定・実行できることを確認しました。
プルスルーキャッシュを導入することで得られる主なメリットは以下の通りです：
1. **イメージ取得の高速化**: キャッシュからのプルは外部レジストリよりも高速
2. **帯域幅の節約**: 同じイメージを何度もダウンロードする必要がない
3. **可用性の向上**: 外部レジストリに依存せずにイメージを取得可能
4. **レートリミットの回避**: Docker Hub などのレート制限を受けない
プルスルーキャッシュは特に CI/CD パイプラインや大規模な開発チームでの活用が効果的です。導入にあたっては、キャッシュされるイメージのライフサイクル管理やコスト最適化にも注意しましょう。
AWS のコンテナ環境をさらに最適化したい場合は、ECR のその他の機能（イメージスキャン、クロスリージョンレプリケーションなど）と組み合わせることで、より堅牢なコンテナ基盤を構築できます。
## 参考資料
- [Amazon ECR でのプルスルーキャッシュルールの作成 - AWS 公式ドキュメント](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache-creating-rule.html)
- [Amazon ECR Public Gallery - NGINX](https://gallery.ecr.aws/nginx/nginx)
---
この記事が Amazon ECR のプルスルーキャッシュ機能の理解と活用に役立てば幸いです。実際に試してみて、コンテナ環境の効率化にお役立てください！