Amazon Elastic Container Registry (Amazon ECR) イメージリポジトリ内のイメージをセカンダリアカウントでプッシュまたはプルできるようにしたいと考えています。
解決策
別のアカウントの Amazon ECR リポジトリにイメージをプッシュまたはプルできます。まず、セカンダリアカウントがリポジトリに対して API 呼び出しを実行できるようにするポリシーを作成する必要があります。次に、セカンダリアカウントから生成された Docker 認証トークンを使用して、プライマリアカウントのリポジトリに対してプッシュコマンドとプルコマンドを使用します。
セカンダリアカウントがイメージリポジトリに対して API 呼び出しを実行できるようにするポリシーを作成します。
1. プライマリアカウントの Amazon ECR コンソールを開きます。
2. 変更するリポジトリのハイパーリンクされたリポジトリ名を選択します。
3. 左側のナビゲーションペインの Amazon ECR - Repositories で、 [権限] を選択します。
4. プライマリアカウント内からセカンダリアカウントのリポジトリポリシーを追加するには、 [ポリシー JSON を編集] を選択します。コードエディタにポリシーを入力し、[保存] を選択します。
重要: ポリシーには、セカンダリアカウントのアカウント番号と、そのアカウントがリポジトリに対して実行できるアクションを含めてください。特定のロールへのアクセスを許可するには、プリンシパルとしてロール arn を指定します。たとえば、AWS:arn:aws:iam::account-id:role/ecsInstanceRoleリポジトリポリシーを保存する前に、ロールがセカンダリアカウントに存在している必要があります。存在しない場合、次のようなエラーが表示されます。リポジトリポリシーが無効です。
次のリポジトリポリシー例では、特定のアカウントがイメージをプッシュおよびプルすることを許可しています。
{
"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 ECR リポジトリでホストされます。
**注:**セカンダリアカウントに「AmazonEC2ContainerRegistryPowerUser」管理ポリシーに記載されている Amazon ECR 権限があることを確認してください。これらの権限は、プライマリアカウントからプルまたはプッシュするために必要です。
セカンダリアカウントから一時的な Docker 認証トークンを生成し、テストプッシュまたはプルを実行します
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新バージョンの AWS CLI を使用していることを確認してください。
セカンダリアカウントは、12 時間有効な一時認証トークンを受け取るまで、リポジトリに対してポリシーアクションを実行できません。このトークンにより、セカンダリアカウントはプライマリアカウントのリポジトリに対して Docker push および pull コマンドを使用できます。**get-login-password **コマンドは認証トークンを取得してデコードし、それを docker login コマンドに渡して認証することができます。
**注:**トークンを取得するアカウントには、リポジトリを変更するための関連する AWS Identify and Access Management (IAM) API 権限が必要です。例については、「Amazon Elastic コンテナレジストリの AWS 管理ポリシー」を参照してください。Docker の問題をトラブルシューティングするには、Docker デーモンでデバッグモードをオンにします。このコマンドは、最新バージョンの AWS CLI バージョン 2、または AWS CLI バージョン 1 の v1.17.10 以降でサポートされています。詳細については、「ログインパスワードの取得」を参照してください。
1. Amazon ECS の外部にイメージをプッシュおよびプルするアカウントの Docker 認証トークンを生成するには、次のコマンドを実行します。aws_account_id をプライマリアカウント ID に、regionID を Region ID に置き換えてください。
AWS CLI を使用する
aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com
Windows PowerShell 用 AWS ツールの使用:
(Get-ECRLoginCommand).Password | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com
次の出力が表示されます。
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
2. プライマリアカウントからイメージをプルまたはプッシュしてテストを実行します。
docker pull AccountID.dkr.ecr.Region.amazonaws.com/ImageName::TagName
注: AccountID と Region をお使いのアカウント ID とリージョンに置き換えてください。ImageName と TagName をお使いのイメージとタグの名前に置き換えてください。
3. イメージが正常にダウンロードされたことを確認します。
docker images | grep ImageName
注: ImageName をお使いのイメージの名前に置き換えてください。