[アップデート] Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました
こんにちは!クラウド事業本部コンサルティング部のたかくに(@takakuni_)です。
Amazon ECR がプルスルーキャッシュ先として新たに Amazon ECR をサポートしました
アップデート内容
プルスルーキャッシュ、みなさん使っていますでしょうか?
パブリックでホストされるコンテナイメージをプライベートリポジトリをキャッシュすることで、NAT Gateway の利用費を下げられるあの機能です。
今までアップストリームレジストリには、次のリポジトリがサポートされていました。
- 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 型)
ご覧の通り、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.
やってみた
それでは実際に、クロスアカウントの同一リージョンで、 ECR のプルスルーキャッシュ設定を試してみたいと思います。
ソース
まず、ソースリポジトリには、事前に 3 つのイメージを格納しておきます。
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 クロスアカウント
の項目が増えていました。
アカウント ID を入力し保存を押すとレジストリポリシーが作成されました。Resource 句の部分は、適宜変更しましょう。
ターゲット
続いてターゲット側の設定です。別アカウントに切り替えます。
まずは 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": "*"
}
]
}
今回はインラインポリシーで設定しました。同じく Resource 句の部分は、適宜変更しましょう。
プルスルーキャッシュの設定に移ります。クロスアカウントから、ソースとなる AWS アカウントを選択します。
先ほど選んだ IAM ロールを設定します。
最後に名前空間の設定です。ターゲット側の キャッシュ名前空間
を ROOT にすると通常の ECR への pull と見分けがつかなくなるため、 ecr-to-ecr
をプレフィックスに設定しました。
名前空間の例で、利用イメージがわかるのはありがたいですね。
キャッシュルールが作成されました。
動作確認
それではターゲット側アカウントで 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
から始まっています。
続いて、ソース側の v2 タグのイメージを更新してみます。ダイジェストは sha256:3d85
から始まるものになりました。
再度ターゲットに戻り、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_)でした!