意外とハマりどころが多いと思ったので書いておく。
まず、アカウントAとBがあるとして、AのCodeBuildでdocker buildを実行してBのECRにdocker pushしたい状況を考える。
最初に、AのCodeBuildにBのECRを操作する権限を与える。AとBにそれぞれこういうRoleを作成する。B側のRoleにはAmazonEC2ContainerRegistryPowerUser
をつけておく。
アカウントA_CodeBuildに付与するロールのポリシードキュメント
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<Account B>:role/ECRRoleForCodeBuild"
}
]
}
アカウントB_ECRRoleForCodeBuildの信頼ポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<Account A>:root",
"Service": "codebuild.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}
ここまでは簡単で、問題は次。docker loginするための認証情報を得る必要があるが、2点注意が必要。
- プロファイルをBアカウント側に設定すること
-
credential_source = EcsContainer
を設定すること
EcsContainerって何だよという感じだがCodeBuildがECSで実行されているということか。
configとloginコマンドはそれぞれこんな感じ
aws-config
[default]
region=ap-northeast-1
output=json
[profile B]
role_arn=arn:aws:iam::<Account B>:role/ECRRoleForCodeBuild
credential_source = EcsContainer
loginコマンド
aws --profile B ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${REPOSITORY_HOST}
参考
- CodeBuildのビルド内でAssumeRole(クロスアカウントアクセス)する方法とハマった話: https://dev.classmethod.jp/articles/assumerole-in-codebuild/