【AWS】Amazon ECR ~ 別アカウントのECRにPull/Push ~

■ はじめに

久しぶりに、ECRネタ。

アカウントA(Account ID: 111111111111)から、
アカウントB(Account ID: 999999999999)のECRリポジトリに対して
Docker Pull/Pushすることを考える

目次

【0】何を行う必要があるか?
 1)公式サイトより
【1】呼び出し側のAWS環境設定 - IAMロール設定
【2】ECR側のAWS環境設定 - ECRリポジトリポリシー設定
 1)GUIでの設定手順
 2)AWS CLIによる方法
 3)トラブルシュート・エラー
 4)補足:設定しないでPushした場合のエラーメッセージ
【3】動作確認
【4】補足:別アカウントになった際の影響
 1)AWS CLIを使用している場合
 2)ECRのイメージスキャン(Inspector2)について

【0】何を行う必要があるか?

1)公式サイトより

https://repost.aws/ja/knowledge-center/secondary-account-access-ecr

より抜粋
~~~~~~
Amazon Elastic Container Registry (Amazon ECR) イメージリポジトリ内
のイメージをセカンダリアカウントでプッシュまたはプルできるようにしたい
と考えています。

解決策
別のアカウントの Amazon ECR リポジトリに
イメージをプッシュまたはプルできます。

まず、セカンダリアカウントがリポジトリに対して
API 呼び出しを実行できるようにするポリシーを作成する必要があります。
↑【2】参照

次に、セカンダリアカウントから生成された Docker 認証トークンを使用して、
プライマリアカウントのリポジトリに対して
プッシュコマンドとプルコマンドを使用します。
↑【3】参照
~~~~~~
# っと言っているが、呼び出し側の設定(【1】)も確認する必要があると思う

【1】呼び出し側のAWS環境設定 - IAMロール設定

* IAMロールが、別アカウントのECR に使用権限が付与されているか確認する
 => 今回は、簡易的に
 「arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser」を使用

【2】ECR側のAWS環境設定 - ECRリポジトリポリシー設定

* ECRリポジトリ側の権限設定を以下「リポジトリポリシー例」を参考に行う

1)GUIでの設定手順

* GUIでの設定手順は以下の通り。

手順

[1] AWSマネージメントコンソールへログイン
[2] Amazon ECR のページに移行
[3] [Repositories]を選択し、リポジトリ一覧から対象のリポジトリにチェックを付け
 (今回は「your-repo」としておく)、[Actions]-[Permissions]を選択
[4] 右上にある[Edit policy JSON]ボタン押下
[5] 以下「リポジトリポリシー例」を参考に、リポジトリポリシーを入力
[6] 「Save」ボタン押下
 => ただ、実行権限によっては、
  以下『Save」ボタン押下後のエラーメッセージ』が表示される可能性あり 

リポジトリポリシー例

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowPushPull",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111111111111:role/your-iam-role"
      },
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability",
        "ecr:PutImage",
        "ecr:InitiateLayerUpload",
        "ecr:UploadLayerPart",
        "ecr:CompleteLayerUpload"
      ]
    }
  ]
}

2)AWS CLIによる方法

# Step1: 上記「リポジトリポリシー例」を例えば「repo-policy.json」で保存する

# Step2: 以下のコマンドを実行
aws ecr set-repository-policy --region us-west-2 \
 --repository-name your-repo --policy-text repo-policy.json

3)トラブルシュート・エラー

* 実行したら、以下「エラーメッセージ例」が表示される場合があった
 => その際、IAMロールなどを確認し、適切に修正したら直った

エラーメッセージ例

Error
Invalid parameter at 'Policy Text' failed to satisfy constraint:
 'Invalid repository policy provided'

4)補足:設定しないでPushした場合のエラーメッセージ

* 本設定を行っていなかった状態で、docker push を試みた場合、
 以下「エラーメッセージ例」が表示される

エラーメッセージ例

denied: arn:aws:sts::[account_ID(111111111111)]:assumed-role/your-role/i-xxxxxx
 is not authorized to perform: ecr:InitiateLayerUpload
 on resource: arn:aws:ecr:us-west-2:[account_ID(999999999999)]:repository/your-repo
 because no identity-based policy allows the ecr:InitiateLayerUpload action

【3】動作確認

* アカウントA(111111111111)側のAWS環境で、以下「コマンド例」を参考に動作確認を行う

コマンド例

# ログイン
aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 999999999999.dkr.ecr.us-west-2.amazonaws.com

# Push/Pull
docker push 999999999999.dkr.ecr.us-west-2.amazonaws.com/your-repo:latest
docker pull 999999999999.dkr.ecr.us-west-2.amazonaws.com/your-repo:latest

【4】補足:別アカウントになった際の影響

1)AWS CLIを使用している場合

CI/CDなどで、AWS CLIを使用している場合に
引数として「--registry-id <ACCCOUNT_ID_FOR_ECR>」を使用するといい
 => なお、Amazon ECRに関するAWS CLI については、以下の関連記事を参照のこと

https://dk521123.hatenablog.com/entry/2024/01/05/000000

aws ecr list-images \
  --region us-west-2 \
  --registry-id 999999999999
  --repository-name sample-repo

2)ECRのイメージスキャン(Inspector2)について

ECRリポジトリにInspector2による自動スキャン設定をしている場合
スキャン実行自体は可能。
ただし、スキャン結果をモニタリングする場合に別設定が必要。
 => 詳細は、以下の関連記事を参照のこと

Amazon ECR ~ 別アカウントからInspector2を操作するには ~
https://dk521123.hatenablog.com/entry/2024/05/16/212100

参考文献

https://qiita.com/winebarrel/items/bbfe4bf06039f7831af3
その他: CloudFormation
https://zenn.dev/part_of_mitsuo/articles/20220723-cloudformation05

関連記事

Amazon ECR ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2020/05/22/165711
Amazon ECR ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/05/26/142645
Amazon ECR ~ AWS CLI
https://dk521123.hatenablog.com/entry/2024/01/05/000000
Amazon ECR ~ boto3 ~
https://dk521123.hatenablog.com/entry/2024/01/31/014010
Amazon ECR ~ Dockerイメージを Pull & Push ~
https://dk521123.hatenablog.com/entry/2023/12/02/024631
Amazon ECR ~ pull through cache rules ~
https://dk521123.hatenablog.com/entry/2024/04/09/141310
Amazon ECR ~ AWS ECR Public Gallery ~
https://dk521123.hatenablog.com/entry/2024/04/08/184035
Amazon ECR ~ 脆弱性診断 / Amazon Inspector ~
https://dk521123.hatenablog.com/entry/2024/01/22/210831
Amazon ECR ~ 別アカウントからInspector2を操作するには ~
https://dk521123.hatenablog.com/entry/2024/05/16/212100
Terraform ~ AWS ECR ~
https://dk521123.hatenablog.com/entry/2023/05/23/002314
Amazon ECR でのトラブルシューティング
https://dk521123.hatenablog.com/entry/2020/05/24/000000
IAM ~ Service-Linked Roles ~
https://dk521123.hatenablog.com/entry/2023/01/22/000000
シェルで split するには
https://dk521123.hatenablog.com/entry/2021/09/02/000000