Amazon ECR イメージリポジトリ内のイメージをセカンダリアカウントにプッシュまたはプルできるようにする方法を教えてください。
Amazon Elastic Container Registry (Amazon ECR) イメージリポジトリ内のイメージをセカンダリ AWS アカウントでプッシュまたはプルできるようにしたいと考えています。
簡単な説明
セカンダリアカウントが Amazon ECR リポジトリからイメージをプッシュまたはプルできるようにするには、プライマリアカウントでレジストリまたはリポジトリポリシーを作成します。AWS リージョンのすべてのリポジトリまたは複数の異なるリポジトリへのアクセスを提供するには、レジストリレベルのポリシーを設定します。1 つのリポジトリにのみアクセスを提供したり、1 つのリポジトリ内の異なる ID へのアクセスを制限したりするには、リポジトリレベルのポリシーを設定します。セカンダリアカウントからの特定の API コールを許可するようにポリシーを設定します。
その後、セカンダリアカウントから Docker 認証トークンを生成して、プライマリアカウントのリポジトリからイメージをプッシュおよびプルします。
解決策
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
レジストリレベルのアクセス許可の設定
**前提条件:**Amazon ECR レジストリは V2 ポリシーを使用する必要があります。V1 ポリシーを使用する場合は、V2 に切り替えてください。V2 ポリシーの詳細については、「Amazon ECR がレジストリポリシーをすべての ECR アクションに拡張」を参照してください。
次の手順を実行します。
- プライマリアカウントの Amazon ECR コンソールを開きます。
- ナビゲーションペインの [プライベートレジストリ] で、[機能と設定] を選択します。
- [アクセス許可] を選択します。
- [JSON を編集] を選択します。
- エディタにポリシーを入力します。セカンダリアカウントがリージョンのすべてのリポジトリでイメージをプッシュおよびプルすることを許可するポリシーの例:
**注:**account-id をセカンダリアカウント ID に置き換えてください。アクションには、アカウントがリポジトリで実行できるアクションを入力します。特定のロールへのアクセスを許可するには、プリンシパルに AWS: arn:aws:iam::account-id:role/ecsInstanceRole などのロール Amazon リソースネーム (ARN) を指定します。レジストリポリシーを保存する前に、入力したロールがセカンダリアカウントに存在することを確認してください。ロールが存在しない場合、「invalid registry policy provided」というエラーが表示されます。{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:root" }, "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload" ], "Resource": "*" } ] } - [保存] を選択します。
リポジトリレベルのアクセス許可の設定
次の手順を実行します。
- プライマリアカウントの Amazon ECR コンソールを開きます。
- ナビゲーションペインの [プライベートレジストリ] で、[リポジトリ] を選択します。
- 変更するリポジトリを選択します。
- ナビゲーションペインで [アクセス許可] を選択します。
- [ポリシー JSON の編集] を選択します。
- ポリシーエディタでポリシーステートメントを入力します。
アカウントにイメージのプッシュとプルを許可するリポジトリポリシーの例:
**注:**account-id をセカンダリアカウント ID に置き換えてください。アクションには、アカウントがリポジトリで実行できるアクションを入力します。特定のロールへのアクセスを許可するには、プリンシパルに AWS: arn:aws:iam::account-id:role/ecsInstanceRole などのロール Amazon リソースネーム (ARN) を指定します。レジストリポリシーを保存する前に、入力したロールがセカンダリアカウントに存在することを確認してください。ロールが存在しない場合、「invalid registry policy provided」というエラーが表示されます。{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowPushPull", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:root" }, "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:PutImage", "ecr:InitiateLayerUpload", "ecr:UploadLayerPart", "ecr:CompleteLayerUpload" ] } ] } - [保存] を選択します。
- Amazon ECS を使用してセカンダリアカウントでコンテナを実行する場合は、Amazon ECS で使用するイメージを設定します。プライマリアカウントの Amazon ECR リポジトリがイメージをホストします。
**注:**AmazonEC2ContainerRegistryPowerUser マネージドポリシーに、セカンダリアカウントの Amazon ECR アクセス許可が含まれていることを確認してください。プライマリアカウントからプルまたはプッシュするには、これらのアクセス許可が必要です。
一時的な Docker 認証トークンを生成する
**注:**トークンを取得するアカウントには、リポジトリを変更するための関連する AWS Identify and Access Management (IAM) API アクセス権限が必要です。例については、「Amazon ECR の AWS マネージドポリシー」を参照してください。Docker の問題をトラブルシューティングするには、Docker デーモンでデバッグモードをオンにします。
次の手順を実行します。
-
Amazon ECS の外部にイメージをプッシュおよびプルするアカウントの Docker 認証トークンを生成するには、次の AWS CLI コマンド get-login-password を実行します。
aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.REGION-ID.amazonaws.comまたは、
次の AWS Tools for Windows PowerShell コマンドを実行します。(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin AWS_ACCOUNT_ID.dkr.ecr.regionID.amazonaws.com**注:**AWS-ACCOUNT-ID をプライマリアカウント ID に、REGION-ID をリージョンに置き換えてください。一時認証トークンは 12 時間有効です。
出力例:aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-south-1.amazonaws.com WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded or Login Succeeded -
プライマリアカウントからイメージをプルまたはプッシュしてテストを実施するには、次のコマンドを実行します。
docker pull ACCOUNT-ID.dkr.ecr.REGION.amazonaws.com/REPOSITORY-NAME:TAG-NAME**注:**ACCOUNT-ID をプライマリアカウント ID に、REGION をリージョンに、REPOSITORY-NAME をリポジトリ名に、TAG-NAME をイメージのタグ名に置き換えてください。
-
イメージが正常にダウンロードされたことを確認するには、次のコマンドを実行します。
docker images | grep IMAGE-NAME**注:**IMAGE-NAME をイメージの名前に置き換えてください。
- トピック
- Containers
- 言語
- 日本語

