Amazon ECR でpull-through-cache機能がリリース(2021/11/30時点)

# はじめに
こんにちは。 KDDIアジャイル開発センターの小板橋です。 この記事は、KDDI Engineer&Designer Advent Calendar 2021の2日目の記事となります。

先日、[Amazon ECRでpull-through-cache機能が発表されました。](https://aws.amazon.com/jp/blogs/aws/announcing-pull-through-cache-repositories-for-amazon-elastic-container-registry/)
今回は、その機能を実際に試してみるのと、何が嬉しいのかについてまとめていこうと思います。

## pull-through-cache機能とは
一言で言うならば、ユーザーのECR(Private Registry)を通して外部のパブリックイメージを透過的にpullできるようになったというものです。
これにより・・・
**1** : パブリックイメージのpullにPrivateLinkを使うことができるようになります。
**2** : Docker HubやECR(Public Repository)の「**Pull Rate Limit**」、すなわちスロットリング回避もできます。


図解すると以下のようになります。

* pull-through-cacheでは、**Amazon ECR Public**および**Quay**のpull-through-cacheルールの作成をサポートしています。
* 外部public registryのpull-through-cacheが作成されたら、Amazon ECR private registry URIを使用して外部public registryからイメージをプルするだけで、Amazon ECRがリポジトリを作成し、そのイメージをキャッシュします。

* また、もう一点便利な機能としては、24時間毎にpublic registryで公式のimageが更新されていないかチェックし、更新されていた時は自動でAmazon ECR private registryのイメージも更新してくれます。

* そうして、ここでもう一つアップデートがあります。
* pull-through-cacheでは、**Amazon ECR Public**および**Quay**のみをサポートすることになっていますが、実は同じタイミングで[Docker Hub の Docker 公式イメージが ECR Public から pull できるようになりました!](https://aws.amazon.com/jp/blogs/containers/docker-official-images-now-available-on-amazon-elastic-container-registry-public/)

![pull-through-cache.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/e97c8efa-2d81-8f4e-59e8-395ca43a2f87.png)


### 今までは・・？ 
外部public registryのimage pullを直接させたくない場合や、Docker HubやECR(Public Repository)の「**Pull Rate Limit**」、すなわちスロットリング回避するには、下のような構成で、ユーザが定期的にAmazon ECR private registryに手動で更新する運用にならざるしかなかったのではないでしょうか。

![旧来.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/6e1c6584-1824-3082-9dd2-b21705871a8b.png)


### pull-through-cacheの制約

* **pull-through-cacheルールの作成は、次のリージョンではサポートされていない** 
中国（北京）（cn-north-1）
中国（寧夏）（cn-northwest-1）
AWS GovCloud（米国-東部）（us-gov-east-1）
AWS GovCloud（US-West）（us-gov-west-1） 

* **Amazon ECR private registryには、最大10個のpull-through-cacheルールの作成しかできない。**
* **Amazon ECRは外部リポジトリを24時間に1回までしかチェックしない**

## 実際に試してみた
### プルスルーキャッシュ設定
pull-through-cacheから、ルールの作成を選択する。

![スクリーンショット 2021-12-01 0.12.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/d2184a75-e958-739d-c7c0-469a20ee5d9f.png)

### プルスルーキャッシュルールを作成
ソースより、パブリックレジストリを今回は、「ECR Public」を選択しました。
![スクリーンショット 2021-12-01 0.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/aaa37c2d-b1ee-94dd-0034-3554e9497957.png)


### プルスルーキャッシュ設定の確認
設定が完了すると以下のように表示されます。
これで、設定はできたのであとはプライベートリポジトリからのイメージPullを試してみます。

![スクリーンショット 2021-12-01 0.15.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/57c75bfa-7c14-212a-53d0-f1817e26ff64.png)

ちなみに、検証時はプライベートリポジトリには何もないことを確認しています。
なので、imageをPullした際に、「ECR Public」よりimageをpullされ、Amazon ECRがリポジトリを作成し、そのイメージをキャッシュするはずです。

![スクリーンショット 2021-12-01 0.17.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/f9202d17-5a71-7f54-b317-f56103cdb66c.png)

### プライベートレジストリへdocker loginする

```
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin xxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecr-public
```

### 試しにプライベートレジストリからAWS for Fluent Bit イメージをpullしてみる

```
docker image pull xxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit:latest
```

```
latest: Pulling from ecr-public/aws-observability/aws-for-fluent-bit
e11e8d46e102: Pull complete
78ae343d6dcf: Pull complete
f5152049901d: Pull complete
757a28787cbb: Pull complete
38488c29e0d3: Pull complete
fd5c8838b80c: Pull complete
2010684db286: Pull complete
d52f3ff92019: Pull complete
8057cbc0f33a: Pull complete
99ad7aff5b44: Pull complete
e4759977e091: Pull complete
a87998555db4: Pull complete
9ae4d994bf55: Pull complete
dbcbcb0cdb88: Pull complete
1ac29bff7532: Pull complete
22646ab5a77d: Pull complete
a7320d535531: Pull complete
Digest: sha256:c3cf6719f9aad2e2581f0bf1f2ed69d57f25c32d227e0a66fa769271668aea60
Status: Downloaded newer image for xxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit:latest
xxxxx.dkr.ecr.us-east-1.amazonaws.com/ecr-public/aws-observability/aws-for-fluent-bit:latest
```

### プライベートリポジトリの状態を確認
確認してみると、リポジトリecr-public/aws-observability/aws-for-fluent-bitが登録されていますね。
また、プルスルーキャッシュの項目が「アクティブ」になっていると、24時間毎のチェックが行われるようです。

![スクリーンショット 2021-12-01 0.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/563635/a85d7ed8-e9e8-aa32-53ff-e7266912fec3.png)



# 参考文献
https://aws.amazon.com/jp/blogs/aws/announcing-pull-through-cache-repositories-for-amazon-elastic-container-registry/

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

https://dev.classmethod.jp/articles/ecr-pull-through-cache-repositories/