Невозможно получить доступ к репозиторию ECR из отдельной учетной записи через `docker pull`
Я пытаюсь разрешить одной учетной записи AWS (называемой "второй" ниже) извлекать изображение из репозитория ECR другой учетной записи AWS (называемой "первой" ниже).
Я слежу за этими документами:
- https://docs.aws.amazon.com/AmazonECR/latest/userguide/RepositoryPolicyExamples.html (для установки разрешений)
- https://aws.amazon.com/premiumsupport/knowledge-center/secondary-account-access-ecr/ (чтобы получить токен)
Я добавил следующие разрешения в репозиторий ECR:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<second>:root"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:GetDownloadUrlForLayer"
]
}
]
}
Затем я запускаю эту команду: eval "$(aws ecr get-login --no-include-email --region us-east-1 --profile second --registry-ids <second> <first>)"
И я получаю этот результат:
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /Users/libby/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /Users/libby/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
Я поменял магазин на config.json
временно, чтобы убедиться, что я вижу, что аутентификация была добавлена в файл, как я и ожидал, и это:
{
"auths": {
"<second>.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "<super long token>"
},
"<first>.dkr.ecr.us-east-1.amazonaws.com": {
"auth": "<super long token>"
}
},
"HttpHeaders": {
"User-Agent": "Docker-Client/18.09.0 (darwin)"
},
"stackOrchestrator": "swarm"
}
Наконец я бегу: docker pull <first>.dkr.ecr.us-east-1.amazonaws.com/<repo>:<tag>
и получить этот результат:
Error response from daemon: pull access denied for <first>.dkr.ecr.us-east-1.amazonaws.com/<repo>, repository does not exist or may require 'docker login'
Я трижды проверил, все номера счетов верны, репо определенно есть. Я могу вытащить его, если я войду в систему с тем же get-login
команда но --profile first
,
Я не уверен, что еще можно попробовать, чтобы я мог вытащить это изображение!
Изменение Principal
в разрешениях ECR для "AWS": "arn:aws:iam::<second>:user/<user>"
не имеет никакого значения.
2 ответа
Я понял это - у пользователя IAM во "второй" учетной записи была привязана политика, ограничивающая его доступ к ECR. Политика была:
{
"Sid": "ECRAccess",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "arn:aws:ecr:us-east-1:<second>:repository/<unrelated-repo>"
}
Таким образом, даже несмотря на то, что репозиторий ECR в "первой" учетной записи имел разрешения, разрешающие доступ пользователя, собственная учетная запись пользователя ограничивала его доступ к одному несвязанному репозиторию.
Когда я добавил еще один раздел с хранилищем первого аккаунта ARN:
{
"Sid": "FirstAccountECRAccess",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "arn:aws:ecr:us-east-1:<first>:repository/<repo>"
}
затем docker pull
работал!
Использует ли ваша вторая учетная запись пользователя IAM на вашем компьютере? Потому что в вашей политике вы предоставили пользователю root права доступа ко второй учетной записи:
"Principal": {
"AWS": "arn:aws:iam::<second>:root"
},
рассмотрите возможность изменения этого в своей политике:
"Principal": {
"AWS": "arn:aws:iam::<second>:user/[nameofuser]"
},