AWS ECS Fargate вытащить изображение из репо ECR кросс-аккаунта
У меня есть 2 учетных записи AWS: - учетная запись A с репо ECR. - учетная запись b с кластером ECS под управлением Fargate.
Я создал роль "кросс-аккаунт" в учетной записи A с доверительными отношениями к учетной записи B, а также к этой роли я прикрепил политику "AmazonEC2ContainerRegistryPowerUser".
Я предоставил доступ к репозиторию ECR в учетной записи A, добавив идентификатор учетной записи B и роль "кросс-учетной записи" в политику хранилища.
Я прикрепил политику к fargate "TaskExecutionRole", позволяющую fargate взять на себя роль "кросс-аккаунт".
При попытке развернуть задачу Fargate в учетной записи B со ссылкой на изображение в учетной записи A я получаю ошибку 500.
1 ответ
Fargate не будет автоматически выполнять роль кросс-аккаунта. К счастью, вам не нужно брать на себя роль в другой учетной записи, чтобы получать изображения из репозитория ECR этой учетной записи.
Чтобы включить перекрестный доступ к изображению в ECR, добавьте доступ для учетной записи B в хранилище учетной записи A (установив политику хранилища), а затем укажите TaskExecutionRole в учетной записи B, у которого есть разрешения для извлечения из ECR ("ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability").
Например, установите политику хранилища для хранилища в учетной записи A следующим образом:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPull",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::ACCOUNT_B_ID:root"
},
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchCheckLayerAvailability",
"ecr:BatchGetImage"
]
}
]
}
Затем установите TaskExecutionRole в учетной записи B, чтобы иметь такую политику:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "*"
}
]
}
Кроме того, вы можете использовать управляемую политику AmazonECSTaskExecutionRolePolicy
для вашего TaskExecutionRole вместо определения вашего собственного.