Что мне не хватает? Независимо от того, какой синтаксис я использую, отправка в AWS ECR всегда происходит в основной/управляющей учетной записи AWS. В консоли AWS я могу переключиться на эту учетную запись с соответствующей ролью. Используя Terraform, я могу установить свойство assume_role.role_arn
для создания ресурсов в правильной учетной записи. Однако никакая конфигурация или синтаксис для Docker и интерфейса командной строки AWS, похоже, не работают. Мне явно не хватает шага, свойства или глобальной опции.
Если я выберу путь Terraform, я смогу делать все, что мне нужно. Итак, я знаю, что это должен работает...
provider "aws" {
region = "us-gov-west-1"
shared_credentials_file = "~/.aws/credentials"
profile = "govcloud"
assume_role {
role_arn = "arn:aws-us-gov:iam::123456789012:role/Build_Administrator"
}
}
Однако я бы предпочел НЕ использовать Terraform для такой простой задачи, как отправка в ECR.
Я пытался использовать свойство role_arn
в ~/.aws/config
, и тот не работает...
[govcloud]
region = us-gov-west-1
output = json
[govcloud-assume]
region = us-gov-west-1
output = json
role_arn=arn:aws-us-gov:iam::123456789012:role/Build_Administrator
В любом другом сценарии вызов get-login-password
/ create-repository
будет использовать текущие настроенные ключи и управлять настроенной учетной записью...
aws ecr get-login-password | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-gov-west-1.amazonaws.com
aws ecr create-repository --repository-name "complexapi" --image-tag-mutability MUTABLE
Такое ощущение, что должна быть какая-то глобальная опция для установки целевой учетной записи или role_arn
, однако никакая комбинация не работает...
aws ecr get-login-password --profile govcloud-assume --region us-gov-west-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-gov-west-1.amazonaws.com
aws ecr create-repository --profile govcloud-assume --region us-gov-west-1 --repository-name "complexapi" --image-tag-mutability MUTABLE
Обновление 1:
Кажется, я приближаюсь. После установки ключа доступа я могу успешно вызвать aws sts assume-role
и вернуть объект Credentials
. Просто пока не знаю, что с этим делать.
Обновление 2:
STS был пустой тратой времени и направил меня по ложному пути. Не ходи туда. Это не нужно и загрязнит вашу локальную среду аутентификации для AWS CLI.
Думаю, вам нужно сгенерировать временные учетные данные предполагаемой роли — aws.amazon.com/premiumsupport/knowledge-center/…
Чтобы взять на себя роль, используя интерфейс командной строки AWS с ECR, вы должны использовать свойство --profile
в своих скриптах и структурировать ~/.aws/config
со свойствами два вместе: role_arn
и source_profile
Для ~/.aws/config
требуется оба основная учетная запись и вспомогательная учетная запись, с которой вы хотите работать. Этот субаккаунт содержит роль, которую вы хотите взять на себя, поскольку ARN сохраняется в его свойстве role_arn
. Профиль субаккаунта — это то, на что вы будете ссылаться в своих сценариях, однако конфигурация также должна указывать на source_profile
, который будет поддерживать фактические учетные данные:
[default]
region = us-gov-west-1
output = json
[profile gov-mgmt]
region = us-west-1
output = json
[profile gov-staging]
role_arn = arn:aws-us-gov:iam::123456789123:role/BuildBoxRole
source_profile = gov-mgmt
region = us-gov-west-1
Затем ваш файл ~/.aws/credentials
содержит ключи для основной учетной записи:
[gov-mgmt]
aws_access_key_id = ABCDEFGHIJKLMNOPQRST
aws_secret_access_key = abcdefghijklmnopqrstuvwxyz1234567890ab12
Оказавшись на месте, ваши команды будут ссылаться на профиль, содержащий роль, которую вы хотите взять на себя (целевая учетная запись), и, при необходимости, вы используете этот идентификатор учетной записи. В примере с командой get-login-password
интерфейсу командной строки AWC передается свойство --profile
с использованием имени дочерней учетной записи. Docker получит полученный пароль из интерфейса командной строки AWS и напрямую сошлется на субаккаунт по номеру.
Например, вот команды для создания репозитория AWS ECR в дочерней учетной записи (обратите внимание, что используется как идентификатор дочерней учетной записи, так и имя профиля этой учетной записи):
aws ecr get-login-password --profile gov-staging | docker login \
--username AWS \
--password-stdin 123456789123.dkr.ecr.us-gov-west-1.amazonaws.com
aws ecr create-repository \
--profile gov-staging \
--repository-name "complexapi" \
--image-tag-mutability MUTABLE
... и команды, необходимые для отправки изображения в реестр субаккаунта с тегом latest
и правильным номером версии:
docker tag fredlackey/complexapi:0.0.0 \
123456789012.dkr.ecr.us-gov-west-1.amazonaws.com/complexapi:0.0.0
docker tag fredlackey/complexapi:0.0.0 \
123456789012.dkr.ecr.us-gov-west-1.amazonaws.com/complexapi:latest
aws ecr get-login-password \
--profile gov-staging | docker login \
--username AWS \
--password-stdin 123456789012.dkr.ecr.us-gov-west-1.amazonaws.com
docker push 123456789012.dkr.ecr.us-gov-west-1.amazonaws.com/complexapi:0.0.0
docker push 123456789012.dkr.ecr.us-gov-west-1.amazonaws.com/complexapi:latest
Извините, в чем здесь проблема? с какой ошибкой вы столкнулись?