ECRのクロスリージョン・クロスアカウントレプリケーションが、複製元で対象リポジトリの限定が可能に!

意図しないECRリポジトリの複製を防止し、指定したものだけをコピれるようになりました
2021.09.27

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ちゃだいん(@chazuke4649)です。

ECRのクロスリージョン・クロスアカウントレプリケーションが、複製元で対象リポジトリの限定が可能になりました。

Amazon ECR が個々のリポジトリを他のリージョンやアカウントにレプリケートする機能を追加

どういうこと?

すでにECRレジストリのクロスリージョン・クロスアカウントレプリケーションはサポートされていましたが、複製元で複製したいリポジトリを選ぶことはできませんでした。つまり複製側ではまるっとECRレジストリ全体を複製する設定をし、複製先側で絞る、といった流れでした。詳細は以下ブログを参照ください。

ECR クロスアカウントレプリケーションをTerraformで | DevelopersIO

それが今回、複製元で複製したいリポジトリをフィルターで指定し、対象を限定することができるようになりました。

以下後述する公式ブログから画像を引用します。

やってみた

前提条件・概要

  • 複製元のAWSアカウント 111122223333
  • 複製先のAWSアカウント 444455556666

今回は複製元から複製先のECRレジストリに対し、同じ東京リージョン・クロスアカウントで指定のレジストリのみをレプリケートしてみます。

基本的に、以下公式ブログの手順に沿って進めていきます。

手順

  • 1.複製元側のECRを設定する
  • 2.複製先側のECRを設定する
  • 3.テストする

1.複製元側のECRを設定する

複製元のAWSアカウントにログインしECRコンソールを開きます。

プライベートレジストリの Replication を編集します。

今回はクロスアカウントでレプリケーションしたいので、Cross-account replication を有効化します。

複製先のAWSアカウントIDと、対象のリージョンを入力します。

ここが以前からのアップデート箇所であり、Filter をオプションとして設定できるようになっています。 現時点では「リポジトリ名のPrefix」によるフィルターがサポートされています。

xxx-prd と入力し(xxxはプロジェクト名のダミー値)、prdにて本番環境用のリポジトリ名のみをレプリケーションするようにします。

設定が完了すると、以下の通りレプリケーションルールが追加されました。

ルールを JSON では以下の通りとなります。

複製元のレプリケーションルール

{
  "destinations": [
    {
      "registryId": "44445555666",
      "region": "ap-northeast-1"
    }
  ],
  "repositoryFilters": [
    {
      "filter": "xxx-prd",
      "filterType": "PREFIX_MATCH"
    }
  ]
}

2.複製先側のECRを設定する

次に、複製元のAWSアカウントに切り替えて、ECRコンソールを開きます。

同じプライベートレジストリ画面で、今度は Permissions を編集します。

以下の通り、Cross account policy を選び、Statement id はわかりやすい名前を記入し、複製元のAWSアカウントを記入します。

JSON は以下の通りです。

複製先のレジストリパーミッション

{
  "Sid": "ReplicationAccessCrossAccount",
  "Effect": "Allow",
  "Principal": {
    "AWS": "arn:aws:iam::111122223333:root"
  },
  "Action": [
    "ecr:CreateRepository",
    "ecr:ReplicateImage"
  ],
  "Resource": "arn:aws:ecr:ap-northeast-1:444455556666:repository/*"
}

設定が完了すると、以下の通りプライベートレジストリパーミッションが追加されました。

3.テストする

サンプルでDockerfileを作成し、以下コマンドを実行していきます。(詳細は先述の公式ブログを参照ください)

# Dockerイメージの作成
% docker build -t xxx-dev-image .

# 作成したイメージにそれぞれ開発環境用リポジトリ名と本番環境用リポジトリ名をタグ付け
% docker tag xxx-dev-image 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/xxx-dev-repo

% docker tag xxx-dev-image 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/xxx-prd-repo


# それぞれをpush
% docker push 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/xxx-dev-repo

% docker push 111122223333.dkr.ecr.ap-northeast-1.amazonaws.com/xxx-prd-repo

それでは、複製元のECRレジストリを見てみます。

xxx-dev-repoxxx-prd-repo が作成されています。どちらにも latestタグ付けされたイメージが入っています。

xxx-prd-repo のみがレプリケーションされていました。

検証は以上です。

終わりに

ECRのクロスリージョン・クロスアカウントレプリケーションを、複製元で対象リポジトリ名のPrefixをフィルターし、個別指定する検証を行いました。

それではこの辺で。ちゃだいん(@chazuke4649)でした。