アカウント①(111111111111)がアカウント②(999999999999)に対してPush/Pullする場合。
アカウント①のIAMの設定
まず、Pushする側のアカウント①のIAMに対してECRの操作に必要な権限 を付与する。
これは、アカウント②のECRリポジトリの権限とは別に必要なので注意。
※MiamでRoleに権限を付与した場合の例を示す
# アカウント①(111111111111)
role "DockerPusher", :path=>"/" do
instance_profiles(
"DockerPusher"
)
assume_role_policy_document do
{"Version"=>"2012-10-17",
"Statement"=>
[{"Effect"=>"Allow",
"Principal"=>{"Service"=>"ec2.amazonaws.com"},
"Action"=>"sts:AssumeRole"}]}
end
# 今回はECRの権限を AmazonEC2ContainerRegistryPowerUser で付与する
attached_managed_policies(
"arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryPowerUser"
)
end
アカウント②のECRリポジトリポリシーを設定する
ECRはS3のバケットポリシーのようにリポジトリごとにポリシーを設定することができ
http://docs.aws.amazon.com/AmazonECR/latest/userguide/RepositoryPolicyExamples.html
他のアカウントに対して操作権限を付与することができる。
アカウント②のECRリポジトリに対して、アカウント①のDockerPusherロールからPush/Pull可能なポリシーをセットする。
// アカウント②(999999999999)
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPushPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::111111111111:role/DockerPusher"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload"
]
}
]
}
リポジトリのポリシーの操作はコンソールから行うことができるが、他のAWSアカウントに権限を付与する場合 rootしか指定できない ので、ロールを個別に指定する場合は以下のようにCLIでポリシーをセットする必要がある。
aws ecr set-repository-policy --repository-name webrick --policy-text file://policy.json --region us-east-1
アカウント①でDockerの操作
アカウント①のDockerPusherロールでは、以下のようにdocker login
を実行することで、Push/Pullすることができる。
# アカウント②のレジストリID(アカウント番号)を指定してログイン
$(aws ecr get-login --registry-ids 999999999999 --region us-east-1)
# あとは普通にPush/Pull
docker push 999999999999.dkr.ecr.us-east-1.amazonaws.com/webrick:latest
docker pull 999999999999.dkr.ecr.us-east-1.amazonaws.com/webrick:latest
おまけ
ECRリポジトリを管理するツールを作りました。
https://github.com/winebarrel/repol