Я пытаюсь создать docker изображение из учетной записи Pipeline и добавить sh его в ECR другой учетной записи (Dev).
Пока я могу docker pu sh от codebuild до репозитория ECR в той же учетной записи (Pipeline), я испытываю трудности при выполнении этого для внешнего AWS ECR аккаунта.
Политика, прикрепленная к репо ECR в учетной записи Dev :
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountPush",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<pipelineAccountID>:role/service-role/<codebuildRole>"
},
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:CompleteLayerUpload",
"ecr:GetDownloadUrlForLayer",
"ecr:InitiateLayerUpload",
"ecr:PutImage",
"ecr:UploadLayerPart"
]
}
]
}
В моей учетной записи конвейера роль службы, выполняющая проект сборки, соответствует ARN в приведенной выше политике, а моя сборка c содержит следующий фрагмент кода, который выдвигает образ:
- $(aws ecr get-login --no-include-email --region us-east-1 --registry-ids <DevAccount>)
- docker tag <imageName>:latest $ECR_REPO_DEV:latest
- docker push $ECR_REPO_DEV:latest
Codebuild может успешно войти в ECR, но когда он пытается на самом деле получить sh изображение, я получаю:
*denied: User: arn:aws:sts::<pipelineAccountID>:assumed-role/<codebuildRole>/AWSCodeBuild-413cfca0-133a-4f37-b505-a94668201e26 is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:<DevAccount>:repository/<repo>*
Кроме того, я пошел вперед и убедился, что Политика IAM для роли (находящейся в учетной записи codepipeline) имеет разрешения для этого репо:
{
"Sid": "CrossAccountRepo",
"Effect": "Allow",
"Action": "ecr:*",
"Resource": "arn:aws:ecr:us-east-1:<DevAccount>:repository/sg-api"
}
Теперь я мало представляю, чего мне не хватает. Единственное, что приходит на ум - запуск сборки с ролью кросс-аккаунта, но я даже не уверен, что это возможно. Моя цель - отделить конвейер сборки от разработчика. Как я слышал, это лучшая практика.
Предложения?
Заранее спасибо.