Amazon Web Services ブログ
Amazon ECRのクロスリージョンレプリケーションが公開されました
この記事は Cross region replication in Amazon ECR has landed を翻訳したものです。
本投稿は Michael Brown と Michael Hausenblas が共同で作成しました。
Amazon Elastic Container Registry (ECR) のリージョン間でコンテナイメージを自動的にレプリケーションする機能は、最も要望の多かった機能の一つでした。これまでは自分でレプリケーションを実装しなければならなかったのですが、今では AWS に作業を任せて、お客様はアプリケーションの構築と実行に集中できるようになりました。この記事では、ECR のクロスリージョンレプリケーション (CRR) がどのように機能するのか、そしてどのようにしてその恩恵を受けることができるのかを説明します。
レプリケーションは、ECR プライベートレジストリレベルで設定されます。つまり、この機能をオンにすると、レジストリ内のすべてのプライベート ECR リポジトリが、異なるアカウントやリージョンにある複数の他のリポジトリにイメージを自動的にコピーします。リージョン内でイメージをプルできるようになるため、プルにかかるレイテンシが削減され、コンテナの起動が速くなります。また異なるリージョンのイメージは、アーティファクトが地理的に分散しているため、ディザスタリカバリの要件を満たすのに役立ちます。
レプリケーションを開始するには、レプリケーションを有効にして、ECR がイメージをコピーする先のアカウントとリージョンを選択するだけです。その後、プライベートECRリポジトリにイメージをプッシュするたびに(またはレプリケートAPI を明示的に呼び出すたびに) ECR は自動的にイメージをレプリケーションします。リポジトリがコピー先のリージョンにまだ存在しない場合は、CRR が自動的に作成します。アカウント間でレプリケーションを行う場合は、最初にコピー先のアカウントにて、コピー元のアカウントに対して必要な権限を付与する必要があります。
ユースケースシナリオ
ユースケースのシナリオとして、地理的に異なる地域で働く2つのチームを考えてみましょう。開発チームが米国を拠点とし、デプロイを担当するチームが欧州を拠点としているとします。このような状況では、CRR が有効なワークフローは以下のようになります。
開発チームは、例えば AWS CodePipeline を使ってコンテナイメージを作成し、それを us-west-2
リージョンの CRR が有効なプライベート ECR リポジトリにプッシュします。これがコピー元のリージョンとなり、CRR によってイメージは自動的にデプロイ先の eu-west-1
リージョンにレプリケーションされ、デプロイチームは Amazon EKS や Amazon ECS などのコンテナオーケストレータでイメージを使用することができます。
この全体的なセットアップが終わったら、実際のウォークスルーに移りましょう。
CRR を実行する
ここからは上記のユースケースの例に基づいて、新しい ECR CRR 機能の使い方を説明します。us-west-2
リージョンでイメージを公開し、CRR を利用して eu-west-1
に取り込みます。
まず、コピー元である us-west-2
リージョンから CRR を有効にし、コピー先のリージョン(ここでは eu-west-1
、単一リージョン)を選択する必要があります。そのためには、左側のメニューから「Registries」を選択し、「Private」レジストリを選択し、右上隅の「Edit」ボタンをクリックします。すると、以下のような画面が表示されます。
注: このチュートリアルでは、同じアカウントでコンテナイメージをレプリケーションしています。コピー元とコピー先のリージョンで異なるアカウントを使用している場合は、上記のクロスアカウントレプリケーションを有効にし、さらにアカウント間の CRR を許可するためにレジストリのパーミッションポリシーを設定する必要があります。
これで、コピー元リージョン( us-west-2 )にリポジトリを作成できるようになりました。
次に、コピー元リージョンでの認証を行います。
aws ecr get-login-password --region us-west-2 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.us-west-2.amazonaws.com
上記のコマンドと下記のコマンドでは、123456789012
を自分のアカウントIDに置き換えてください。
これで、コピー元リージョン( us-west-2
)のレポジトリにコンテナイメージをプッシュすることができるようになりました。
$ docker push 123456789012.dkr.ecr.us-west-2.amazonaws.com/mservice:42 16:10:49
The push refers to repository [123456789012.dkr.ecr.us-west-2.amazonaws.com/mservice]
30cca227097d: Pushed
cd7100a72410: Pushed
42: digest: sha256:497108730bb719d606c1f75be33f310b018ed30d18be884fa00b189aceed5e59 size: 738
それでは所属チームを(気持ちの上で)切り替えて、コピー先リージョンの eu-west-1
に移動してみましょう。ECR CRR が動作し、実際に自動的に 2 つのリージョン間でイメージがレプリケーションされていることを確認してみましょう。
そのためには、コピー先リージョンのイメージをプルします。(イメージのURL 123456789012.dkr.ecr.eu-west-1.amazonaws.com/mservice:42
に含まれるリージョンに注目してください)
$ aws ecr get-login-password --region eu-west-1 | \
docker login --username AWS --password-stdin \
123456789012.dkr.ecr.eu-west-1.amazonaws.com
$ docker pull 123456789012.dkr.ecr.eu-west-1.amazonaws.com/mservice:42 16:17:02
42: Pulling from mservice
Digest: sha256:497108730bb719d606c1f75be33f310b018ed30d18be884fa00b189aceed5e59
Status: Downloaded newer image for 123456789012.dkr.ecr.eu-west-1.amazonaws.com/mservice:42
123456789012.dkr.ecr.eu-west-1.amazonaws.com/mservice:42
簡単だったでしょう?アカウント間でレプリケーションを行っている場合もフローは同じですが、必要なパーミッションが変更されることに注意してください。
最後に、コストからレプリケーションのセマンティクスまで、いくつかの運用上のことを考えてみましょう。
考慮すべきこと
CRR を使用すると、ECR Public では AWS がこのようなレプリケーションを行っていますが、それと同様に、ECR できめ細かなレプリケーションが可能になります。コンテナイメージはメタデータとともにレプリケーションされますが、脆弱性の検出結果はレプリケーションされません。
この機能は新しい価格設定を導入するものではありません。コピー先のリポジトリに保存されたイメージには、そのアカウントの ECR ストレージ料金が発生します。リージョンをまたいでイメージをコピーする際に転送されたデータには、転送元のリポジトリのリージョンに基づいて、ECR データ転送料金が発生します。ECR ストレージとデータ転送料金の詳細については、ECR の価格設定ページを参照してください。データ転送料金をより正確に見積もるために、ECR は各ソースリポジトリでレプリケーションされたデータ量を GB/月単位で表示します。
今後の流れ
CRR をより便利にご利用いただけるよう、様々な機能強化を行っております。近い将来には、以下のような機能をリリースする予定です。
- イメージのレプリケーション処理の進捗状況を表示するレプリケーションステータス API
- リポジトリとイメージのサブセットのみがレプリケーションされるようにフィルタを追加する機能
- コピーの完了などのレプリケーションイベントの通知
- マニフェストリストのサポート
ECR にクロスリージョンレプリケーションが導入されたことで、お客様の差別化にならない重労働を一つ無くすことができるようであれば幸いです。この新機能をどのように使用しているかを教えてください。コンテナロードマップでは、今後もニュースをお届けしていきます。
ー Michael Brown and Michael Hausenblas
翻訳はソリューションアーキテクト工藤 朋哉が担当しました。