CodePipeline ECS Синий / Зеленый Развертывание перекрестного аккаунта завершается неудачно с PermissionError - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь настроить CodePipeline с сине-зеленым развертыванием ECS, где развертывание выполняется в другой учетной записи AWS.

Я использовал два руководства для ECS Blue / Green и CodePipeline cross.Развертывание аккаунта.CodePipeline находится в учетной записи A вместе с ключом KMS, корзиной артефактов S3 и хранилищем ECR.Кластер ECS находится в учетной записи B с настройкой CodeDeploy.

ECR, ключ KMS и корзины S3 имеют разрешения для разных учетных записей (в случае ошибки они дают другую ошибку).Кластер запускается и работает, и CodeDeploy работает правильно, когда вызывается из учетной записи B.

Для CodePipeline создана роль в учетной записи B, и она предоставила учетной записи A разрешение принять эту роль.Эта роль в настоящее время имеет политику AWSCodeDeployRoleForECS (я собираюсь уменьшить ее, как только она заработает)

Сбой CodePipeline с бесполезным сообщением

   "code": "PermissionError",
   "message": "The provided role does not have sufficient permissions to access CodeDeploy"
}```

The codepipeline role does have permission to access codedeploy as it's in the canned AWS policy. I can only assume there's some missing permission but I cannot find out what from this message.

1 Ответ

1 голос
/ 27 июня 2019

Я обнаружил ответ после трассировки через CloudTrail. В роли развертывания CodePipeline отсутствовали два разрешения, которые я не могу найти документированными, это ecs:RegisterTaskDefinition и iam:PassRole для роли контейнера ECS. CodeDeploy предполагает другую роль во время развертывания, которая также требует этих разрешений, но похоже, что CodePipeline нуждается в них для запуска развертывания.

В документации, над которой я работал, был пример кросс-аккаунта CodeDeploy, но это был CodeDeploy для EC2, а не для ECS.

Мои последние разрешения для роли, принятой CodePipeline в учетной записи B, выглядят следующим образом:

{
  "Version": "2012-10-17",
  "Statement": [
    {
        "Action": [
            "codedeploy:CreateDeployment",
            "codedeploy:GetDeployment",
            "codedeploy:GetDeploymentConfig",
            "codedeploy:GetApplicationRevision",
            "codedeploy:RegisterApplicationRevision",
            "codedeploy:GetApplication",
            "ecs:RegisterTaskDefinition"
        ],
        "Resource": "*",
        "Effect": "Allow"
    },
    {
        "Action": [
            "s3:GetObject*",
            "s3:PutObject",
            "s3:PutObjectAcl"
        ],
        "Resource": "arn:aws:s3:::deployment_intermediate_bucket/*",
        "Effect": "Allow"
    },
    {
        "Action": [ "s3:ListBucket"],
        "Resource": "arn:aws:s3:::deployment_intermediate_bucket",
        "Effect": "Allow"
    },
    {
        "Effect": "Allow",
        "Action": [
            "kms:DescribeKey",
            "kms:GenerateDataKey*",
            "kms:Encrypt",
            "kms:ReEncrypt*",
            "kms:Decrypt"
        ],
        "Resource": [
            "deployment_kms_key_arn"
        ]
    },
    {
        "Action": [
            "iam:PassRole"
        ],
        "Effect": "Allow",
        "Resource": "ecs_container_role_arn"
    }
  ]
}

Я собираюсь уменьшить это до необходимого минимума.

...