Amazon ECRに「プルスルーキャッシュリポジトリ」機能が追加されました #reinvent
みなさん、こんにちは!
福岡オフィスの青柳です。
Amazon ECRに「プルスルーキャッシュリポジトリ」(pull through cache repositories) という機能が新たに追加されました。
Amazon ECR announces pull through cache repositories
どんな機能で、どんな時に役立つのか、見ていきましょう。
プライベートリポジトリ運用で困っていたこと
ECSやEKSを利用する際、あるいは社内の開発者向けにコンテナリポジトリを提供する際など、コンテナイメージの取得 (pull) をプライベートなコンテナリポジトリからのみに限定して、インターネット上のパブリックなコンテナリポジトリの利用を制限する場合があるかと思います。
- 企業の社内セキュリティポリシーに準拠するため
- Docker HubやECR Public Repositoryの「Pull Rate Limit」を回避するため
その場合でも、ベースイメージとしての利用など、パブリックなコンテナリポジトリを全く使わないということは難しいのではないかと思います。
そのような際に、多くの場合は、必要なコンテナイメージを管理者がパブリックリポジトリから取得してプライベートリポジトリに複製する運用を行っているのではないでしょうか。
しかし、このような運用を行うのは非常に手間がかかり大変だと思います。
- 必要なイメージを事前に全て複製して用意しておく必要がある
- 公式イメージが更新されたら、複製も更新する必要がある
ECRの「プルスルーキャッシュリポジトリ」機能で実現できること
「プルスルーキャッシュリポジトリ」機能を使うと、2つのことが実現できます。
まず、必要なイメージの複製を事前に行わなくても、要求されたタイミングで自動的に「プルスルーキャッシュ」が働きパブリックリポジトリからPullしてくれます。
また、一度プライベートリポジトリ上に「キャッシュ」されたイメージは、プライベートリポジトリに対するPull要求をトリガーに「キャッシュされたイメージが最新バージョンであるか」のチェックが行われ、パブリックリポジトリのイメージが更新されていた場合は自動的にプライベートリポジトリのイメージも更新してくれます。
(ただし、このチェックは24時間内に最大1回までとなります)
すごいですね!
今までの困りごとが一気に解決してしまいました。
2022/03/10 追記
記事初出時に
「一度プライベートリポジトリ上に『キャッシュ』されたイメージは、定期的 (24時間毎) にパブリックリポジトリで更新されていないかチェックが行われ」
と記述していましたが、正しくは
「一度プライベートリポジトリ上に『キャッシュ』されたイメージは、プライベートリポジトリに対するPull要求をトリガーにチェックが行われる」
となります。
詳細は、AWSドキュメント「プルスルーキャッシュルールの使用」の「プルスルーキャッシュを使用するための考慮事項」を参照ください。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/pull-through-cache.html
実際に使ってみた
どんな機能なのか分かったところで、実際に使ってみましょう。
「プルスルーキャッシュ」の設定
まず最初に行うことは、「プルスルーキャッシュ」を有効にする対象のパブリックリポジトリを登録することです。
マネジメントコンソールでECRを開くと、メニューの「Private registry」の配下に「Pull through cache」が追加されています。
「ルールを追加」をクリックします。
ソースとして使用するパブリックレジストリを指定します。
現在のところ「ECR Public」と、Red Hatが提供する「Quay」のみが選択できるようです。
(「カスタム」という文字が見えるので、今後は選択肢が増えたり、任意のリポジトリが登録できたりするのかもしれません)
キャッシュされたリポジトリで使用する「名前空間」を指定します。
ここではデフォルトのecr-public
から変更せず、このままにします。
「プルスルーキャッシュ」の対象としてパブリックリポジトリ「ECR Public」が登録されました。
これで設定は完了です。
キャッシュの動作を確認する
プライベートリポジトリからイメージのPullを試みてみます。
その前に、現在のプライベートリポジトリの状態を確認しておきましょう。
何もイメージが存在しないことが確認できます。
それでは、イメージをPullしてみます。
最初に、何度か入力が必要となるプライベートリポジトリのURLを変数設定しておきます。
(AWSアカウントIDは自分のものに置き換えてくださいね)
$ export ECR_PRIVATE_REPOSITORY_URL=123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
プライベートレジストリへのdocker loginを行います。
$ aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin ${ECR_PRIVATE_REPOSITORY_URL}/ecr-public Login Succeeded
プライベートレジストリから「Amazon Linux」の公式イメージamazonlinux/amazonlinux:latest
のPullを試みます。
$ docker image pull ${ECR_PRIVATE_REPOSITORY_URL}/ecr-public/amazonlinux/amazonlinux:latest latest: Pulling from ecr-public/amazonlinux/amazonlinux e11e8d46e102: Pull complete Digest: sha256:916dbbb288948b54c94b5b9f0769085aa601d4468d099e90d8a7da5cfa551b50 Status: Downloaded newer image for 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux:latest
正常にPullが行えました。
繰り返しになりますが、プライベートリポジトリ上にイメージは一切登録されていませんでした。
それにもかかわらず、イメージがあたかも最初から存在していたかのようにPullが行われたことが分かります。
Pullしたイメージを確認します。
$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ecr-public/amazonlinux/amazonlinux latest 8a4c608d4467 2 weeks ago 164MB
特に問題はありません。
マネジメントコンソールに戻って、プライベートリポジトリの状態を再び確認します。
(画面をリロードしてみてください)
リポジトリecr-public/amazonlinux/amazonlinux
が登録されていることが確認できます。
右端の「プルスルーキャッシュ」の項目が「アクティブ」となっていることに注目してください。
ここが「アクティブ」になっていると、最初に説明した「定期的なイメージ更新のチェックと同期」が有効であるということになります。
リポジトリ内を見てみましょう。
イメージ (タグ) が3つ表示されています。
「latest」は分かりますが、残り2つのタグが付いていないイメージは何なのでしょうか?
確認したところ、latestに相当するバージョンの「amd64」「arm64v8」の各アーキテクチャのイメージであるようです。(sha256ダイジェストの値より類推)
amazonlinux/amazonlinux:2.0.20211103.0-amd64
amazonlinux/amazonlinux:2.0.20211103.0-arm64v8
「Amazono Linux」公式イメージは「マルチCPUアーキテクチャサポート」に対応したイメージであるため、複数のアーキテクチャのイメージが同時にPullされ、登録されたものと思われます。
定期的なイメージ更新チェックの動作を確認する (未確認)
本日公開されたばかりで、まだ設定してから1日も経っていないため、残念ながら確認することができませんでした。
こちらについては、後々、動作を確認したいと思います。
おわりに
いかがでしたでしょうか?
プライベートリポジトリを利用していて、パブリックリポジトリのイメージを手動で複製・同期する運用に苦労している方がいらっしゃいましたら、是非チェックしてみて頂きたい新機能でした。
今後、連係できるパブリックリポジトリの選択肢が増えれば、もっと使い勝手が良くなるのではないかと思います。 期待してます!