Amazon ECR 最高です。あ、個人的な要望ですが、東京リージョンよりも Docker Datacenter のセキュリティ機能切望してます。よろしくお願いします。
さて
会社 / プロジェクトで共通の Docker イメージどう管理してますか?
AWS アカウントを分けて運用したくなる方も多いと思います。
そんなとき、ECR ではどうするかというと、こうします。
仮定
Docker イメージの所有者(= ECR 管理者)と
その利用者は以下のものだったとして。
所有者 | |
---|---|
AWS Account ID | 1234-5678-9012 |
Docker Image | 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web |
利用者 | |
AWS Account ID | 9876-5432-1098 |
IAM User | ecr |
所有者側の設定
特定 IAM ユーザへの許可は AWS コンソールからはできない1 ため
CLI から許可してみます。
1. ECR ポリシーの定義
987654321098
アカウントの ecr
という IAM ユーザ2 に対してのみ
アクセス許可するなら、以下のような policy.json ファイルを定義します。
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "allow-iam-user",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::987654321098:user/ecr"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability"
]
}
]
}
このとき、Principal
に arn:aws:iam::987654321098:root
を指定すると、ポリシー的に許可された すべての IAM ユーザ からのアクセスが許可されます。
また、ここで許可している Action
は docker pull
のみを許可するものです。push
も許可する場合は 公式ドキュメント を確認してください。
2. 利用者からのアクセスを許可
CLI からリポジトリにポリシーをセットします。
POLICY=`cat policy.json`
REPOSITORY="app/web"
aws ecr set-repository-policy --repository-name $REPOSITORY --policy-text $POLICY
利用者側の設定
1. IAM ポリシーの設定
IAM ユーザ ecr
に以下の Action
を許可します。
ECR に設定したポリシーとひとつ違うことに注意してください。
ecr:GetAuthorizationToken
が多いですね!
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "allow-ecr-read",
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability"
],
"Resource": [
"*"
]
}
]
}
2. クロスアカウントな ECR にログインする
2.1. 所有者の AWS アカウント ID を指定してログイン
eval "$(aws ecr get-login --registry-ids 123456789012)"
2.2. または生のトークンを利用してログイン
AUTH_DATA=$(aws ecr get-authorization-token --registry-ids 123456789012)
TOKEN=$(echo $AUTH_DATA | jq -r ".authorizationData[0].authorizationToken" | base64 --decode | awk -F":" '{ print $2 }')
ENDPOINT=$(echo $AUTH_DATA | jq -r ".authorizationData[0].proxyEndpoint")
docker login -u AWS -p $TOKEN $ENDPOINT
2.3 pull なり push なり
ログインが成功すれば、あとは許可されたリポジトリを操作できます。
docker pull 123456789012.dkr.ecr.us-east-1.amazonaws.com/app/web