Нажав Docker Изображение на ECR другого аккаунта из AWS Codebuild - PullRequest
1 голос
/ 22 апреля 2020

Я пытаюсь создать 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"
}

Теперь я мало представляю, чего мне не хватает. Единственное, что приходит на ум - запуск сборки с ролью кросс-аккаунта, но я даже не уверен, что это возможно. Моя цель - отделить конвейер сборки от разработчика. Как я слышал, это лучшая практика.

Предложения?

Заранее спасибо.

1 Ответ

0 голосов
/ 24 апреля 2020

Исходя из моего понимания этого и сообщения об ошибке выше, наиболее распространенной причиной является то, что репозиторий ECR не имеет политики, которая позволила бы роли IAM CodeBuild получить к ней доступ.

Пожалуйста, установите эту политику на репо ECR:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowCrossAccountPush",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<dev acount>:root"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ]
        }
    ]
}

Пожалуйста, добавьте это политика в отношении роли службы CodeBuild:

{
            "Sid": "CrossAccountRepo",
            "Effect": "Allow",
            "Action": "ecr:*",
            "Resource": "*"
}
...