AWS ECR GetAuthorizationToken
Я пытался следовать инструкциям AWS по настройке авторизации ECR для моего пользователя, дав AmazonEC2ContainerRegistryFullAccess
политика для моего пользователя.
Однако, когда я пытаюсь запустить на своем компьютере aws ecr get-login
Я получаю сообщение об ошибке, что у меня нет разрешения.
An error occurred (AccessDeniedException) when calling the GetAuthorizationToken operation: User: arn:aws:iam::ACCOUNT_NUMBER:user/MY_USER is not authorized to perform: ecr:GetAuthorizationToken on resource: *
Что я сделал не так?
11 ответов
Я обнаружил, что при включении 2FA нет возможности использовать aws ecr get-login, после удаления 2FA из своей учетной записи я получил токен авторизации
Вы должны прикрепить политику к своей роли IAM.
Я прикрепил AmazonEC2ContainerRegistryFullAccess, и это сработало.
Вот полный ответ, после того как я выполнил все шаги - я смог использовать ECR
Ошибка может иметь 2 значения:
1) Вы не авторизованы, потому что у вас нет политики ECR, прикрепленной к вашему пользователю. 2) Вы не авторизованы, потому что вы используете 2FA, и использование cli небезопасно, если вы не установите временный токен сеанса.
Вот список всех шагов, чтобы получить доступ (включая обработку 2FA)
- Прежде всего, вы должны создать политику, которая дает вам доступ к действию GetAuthorizationToken в ECR.
- Прикрепите эту политику либо к пользователю, либо к группе (IMHO всегда лучше подходит для групп / ролей, мой голос за роли, например, DevOps)
- Убедитесь, что в вашей среде установлены AWS_ACCESS_KEY_ID и AWS_SECRET_ACCESS_KEY. Я рекомендую использовать папку aws с разделенными учетными данными и профилями.
Если у вас включен 2FA
- Вам нужно сгенерировать токен сеанса с помощью этой команды
aws sts get-session-token --serial-number arn-of-the-mfa-device --token-code code-from-token
,arn-of-the-mfa-device
можно найти в вашем профиле, раздел 2FA. Токен, генерируется токеном из устройства. - Обновление aws credentails с полученным
AccessKeyId
,SecretAccessKey
, а такжеSessionToken
, AWS рекомендует использовать какое-либо задание cron для обновления токена, что означает, что если вы делаете это, вы что-то тестируете, скорее всего, в ваших ресурсах prod не включена поддержка 2FA. Вы можете увеличить сессию, предоставив--duration-seconds
но только до 36 часов. Хорошее объяснение можно найти в authenticate-mfa-cli
Это должно сделать работу
У пользователя должен быть GetAuthorizationToken для всех ресурсов на ECR. Чтобы сделать политику жесткой, вы можете предоставить все действия только желаемому реестру и только ecr:GetAuthorizationToken для всех ресурсов. Вот пример политики, которую можно прикрепить к вашему пользователю:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
],
"Effect": "Allow",
"Resource": "<REPOSITORY_ARN_HERE>"
},
{
"Action": [
"ecr:GetAuthorizationToken",
],
"Effect": "Allow",
"Resource": "*"
}
]
}
Как показано в описании ошибки, я должен разрешить действие "GetAuthorizationToken" в моей политике.
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": "ecr:GetAuthorizationToken",
"Resource": "*"
}
Примечание. Это не полная политика, а подраздел "Заявление".
Если вы пытаетесь извлечь образы из ПУБЛИЧНОГО репозитория AWS, вы должны добавить в свою политику следующие разрешения пользователя:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr-public:GetAuthorizationToken",
"sts:GetServiceBearerToken"
],
"Resource": "*"
}
]
}
Пожалуйста, ознакомьтесь с полной документацией здесь .
Это был мой парень
EC2InstanceProfileForImageBuilderECRContainerBuilds
У меня была такая же проблема с ECS, когда я пытался протолкнуть свой контейнер в хранилище.
Чтобы решить эту проблему, я прикрепил к своей роли в IAM: AmazonECS_FullAccess
Для меня:
- Effect: Allow
Sid: VisualEditor2
Action:
- ecr:GetAuthorizationToken
- ecr:BatchGetImage
- ecr:GetDownloadUrlForLayer
Resource: "*"
У меня та же проблема, но я установил permission boundary
только до s3 ранее, что вызывает проблему.
Удалил permission boundary
,Оно работало завораживающе