AWS Codepipeline с репозиторием целей Codecommit из другой учетной записи

Можно ли создать кодовую цепочку с целевым источником репозитория CodeCommit в другой учетной записи?


person Alex Nelson    schedule 07.07.2017    source источник
comment
Привет, ты нашел ответ на свой вопрос?   -  person Hamed Minaee    schedule 26.11.2017
comment
Не. поиск продолжается. В ответе ниже перечислена документация, на которую я ссылался, задавая вопрос. Не уверен, что человек понял мой вопрос.   -  person Alex Nelson    schedule 02.12.2017


Ответы (3)


Мне просто нужно было это сделать, я объясню процесс.

Учетная запись C - это учетная запись в вашем репозитории CodeCommit. Учетная запись P - это учетная запись с вашими конвейерами CodePipeline ...

В аккаунте P:

  1. Создайте ключ шифрования AWS KMS и добавьте учетную запись C с доступом (руководство здесь в предварительном шаге). Вам также потребуется добавить роль CodePipeline, и если у вас есть этапы CodeBuild и CodeDeploy, добавьте и эти роли.

  2. В вашей корзине артефактов CodePipeline S3 вам необходимо добавить доступ к учетной записи C. Зайдите в Bucket Policy и добавьте:

{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::ACCOUNTC_ID:root"
    },
    "Action": [
        "s3:Get*",
        "s3:Put*"
    ],
    "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME/*"
},
{
    "Sid": "",
    "Effect": "Allow",
    "Principal": {
        "AWS": "arn:aws:iam::ACCOUNTC_ID:root"
    },
    "Action": "s3:ListBucket",
    "Resource": "arn:aws:s3:::YOUR_BUCKET_NAME"
}

Измените ACCOUNTC_ID на идентификатор учетной записи C и измените YOUR_BUCKET_NAME на имя корзины S3 артефакта CodePipeline.

  1. Добавьте политику в свою роль службы CodePipeline, чтобы вы могли получить доступ к учетной записи C и репозиториям CodeCommit:
{
   "Version": "2012-10-17",
   "Statement": {
       "Effect": "Allow",
       "Action": "sts:AssumeRole",
       "Resource": [
           "arn:aws:iam::ACCOUNTC_ID:role/*"
       ]
   }
}

Снова измените ACCOUNTC_ID на идентификатор учетной записи C.

В аккаунте C:

  1. Создайте политику IAM, которая позволяет учетной записи P получать доступ к ресурсам CodeCommit, а также к ключу KMS, чтобы он мог зашифровать их тем же ключом, что и остальная часть вашего CodePipeline:
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject*",
                "s3:PutObject",
                "s3:PutObjectAcl",
                "codecommit:ListBranches",
                "codecommit:ListRepositories"
            ],
            "Resource": [
                "arn:aws:s3:::YOUR_BUCKET_NAME_IN_ACCOUNTP_FOR_CODE_PIPELINE/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "kms:DescribeKey",
                "kms:GenerateDataKey*",
                "kms:Encrypt",
                "kms:ReEncrypt*",
                "kms:Decrypt"
            ],
            "Resource": [
                "arn:aws:kms:YOUR_KMS_ARN"
            ]
        }
    ]
}

Замените имя сегмента и KMS ARN в приведенной выше политике. Сохраните политику как что-то вроде CrossAccountPipelinePolicy.

  1. Создайте роль для доступа между аккаунтами и прикрепите указанную выше политику, а также политику AWSCodeCommitFullAccess. Обязательно укажите Доверенный объект в качестве идентификатора учетной записи P.

В AWS CLI. Вы не можете сделать этот бит в консоли, поэтому вам придется использовать AWS CLI. Это будет сделано для того, чтобы ваш CodePipeline в AccountP взял на себя роль на шаге Source и выгрузил его в корзину S3 для использования на всех ваших следующих шагах.

aws codepipeline get-pipeline --name NameOfPipeline > pipeline.json

Измените конвейер json так, чтобы он выглядел примерно так, и замените нужные вам биты:

"pipeline": {
        "name": "YOUR_PIPELINE_NAME",
        "roleArn": "arn:aws:iam::AccountP_ID:role/ROLE_NAME_FOR_CODE_PIPELINE",
        "artifactStore": {
            "type": "S3",
            "location": "YOUR_BUCKET_NAME",
            "encryptionKey": {
              "id": "arn:aws:kms:YOUR_KMS_KEY_ARN",
              "type": "KMS"
            }
        },
        "stages": [
            {
                "name": "Source",
                "actions": [
                    {
                        "name": "Source",
                        "actionTypeId": {
                            "category": "Source",
                            "owner": "AWS",
                            "provider": "CodeCommit",
                            "version": "1"
                        },
                        "runOrder": 1,
                        "roleArn": "arn:aws:iam::AccountC_ID:role/ROLE_NAME_WITH_CROSS_ACCOUNT_POLICY",
                        "configuration": {
                            "BranchName": "master",
                            "PollForSourceChanges": "false",
                            "RepositoryName": "YOURREPOSITORYNAME"
                        },
                        "outputArtifacts": [
                            {
                                "name": "MyApp"
                            }
                        ],
                        "inputArtifacts": []
                    }
                ]
            },

Обновите конвейер с aws codepipeline update-pipeline --cli-input-json file://pipeline.json

Убедитесь, что он работает, запустив конвейер.

person DF_    schedule 16.05.2019
comment
Спасибо за это. Мне удалось заставить работать наш CodePipeline с несколькими аккаунтами, сославшись на ваш ответ. - person krchun; 24.10.2019
comment
Я пробую это, но получаю ошибку An error occurred (AccessDeniedException) when calling the UpdatePipeline operation: Cross-account pass role is not allowed., не могли бы вы помочь. - person Bhatasana Prashant; 01.06.2020
comment
Я пробую это, но при запуске конвейера получаю ошибку The service role or action role doesn’t have the permissions required to access the Amazon S3 bucket named codepipeline-********. Update the IAM role permissions, and then try again. Error: Amazon S3:AccessDenied:Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 7DF5A64758465G6V; S3 Extended Request ID: n/tlbrqIZqy10Xp1V2bSDFRg9dTGf1MwAZpE0AD2fIP6pnCfoSf3QI02v6NBQInIVR3aJQdXIMk=; Proxy: null), не могли бы вы помочь. - person Bhatasana Prashant; 01.06.2020
comment
@BhatasanaPrashant, вы можете попробовать AWS_PROFILE = prodaccess aws codepipeline update-pipeline --cli-input-json file: //pipeline.json вместо aws codepipeline update-pipeline --cli-input-json file: //pipeline.json - profile prodaccess, если вы используете синтаксис профиля. Источник: github.com/serverless/serverless/issues/3374 - person Ron; 18.05.2021

Да, это должно быть возможно. Следуйте этим инструкциям: http://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create-cross-account.html

person Chris Pollard    schedule 07.07.2017

Вы можете развернуть ресурсы с помощью конвейера с репозиторием codecommit в другой учетной записи.

Допустим, у вас есть учетная запись A, где находится ваш репозиторий codecommit, и учетная запись B, где находится ваш код.

Настройте в учетной записи B следующее:

  1. Вам потребуется создать собственный ключ KMS, поскольку для ключа по умолчанию AWS нет связанной политики ключей. Вы можете использовать Создать конвейер в CodePipeline, который использует Ресурсы из другой учетной записи AWS, если вам нужна помощь в создании CMK. Добавьте роль службы Codepipeline в политику ключей KMS, чтобы разрешить codepipeline использовать ее.

  2. Шина событий для получения событий от кросс-аккаунта. Перейдите в CloudWatch → Шины событий в разделе «События» → «Добавить разрешение» → введите идентификатор учетной записи DEV AWS → «Добавить». Для получения дополнительных сведений см. Создание шины событий

  3. Добавьте следующую политику в хранилище артефактов конвейера S3:

     { 
      “Version”: “2012–10–17”, 
      “Id”: “PolicyForKMSAccess”, 
      “Statement”: [ 
          { “Sid”: “AllowAccessFromAAccount”, 
            “Effect”: “Allow”, 
             “Principal”: { “AWS”: “arn:aws:iam::ACCOUNT_A_ID:root” }, 
             “Action”: [ “s3:Get*”, “s3:Put*”, "s3:ListBucket ], 
             “Resource”: “arn:aws:s3:::NAME-OF-THE-BUCKET/*” } 
           ] 
        }
    
  4. Измените роли IAM конвейера, чтобы они взяли на себя роль учетной записи A следующим образом:

        { 
           “Version”:“2012–10–17”,
           “Statement”:{ 
              “Effect”:“Allow”,
              “Action”:“sts:AssumeRole”,
              “Resource”:[ 
                 “arn:aws:iam::ACCOUNT_A_ID:role/*
              ]
           }
        }
    
  5. Создайте правило события CloudWatch для запуска конвейера на главной ветви CodeCommit в учетной записи A. Добавьте ARN CodePipeline в качестве цели этого правила.

Теперь сделайте следующее в учетной записи A:

Создайте роль IAM для кросс-аккаунта с 3 политиками. а) AWSCodeCommitFullAccess

б) Встроенная политика для принятия роли учетной записи B следующим образом:

    { 
       “Version”:“2012–10–17”,
       “Statement”:[ 
          { 
             “Effect”:“Allow”,
             “Principal”:{ 
                “AWS”:“arn:aws:iam::ACCOUNT_B_ID:root”
             },
             “Action”:“sts:AssumeRole”
          }
       ]
    }

c) Встроенная политика для доступа к KMS, CodeCommit и S3:

    { 
       “Version”:“2012–10–17”,
       “Statement”:[ 
          { 
             “Effect”:“Allow”,
             “Action”:[ 
                “s3:Get*”,
                “s3:Put*”,
                “codecommit:*”
             ],
             “Resource”:[ 
                “arn:aws:s3:::YOUR_BUCKET_NAME_IN_B_FOR_CODE_PIPELINE_ARTIFACTS/”
             ]
          },
          { 
             “Effect”:“Allow”,
             “Action”:[ 
                “kms:*" ], 
                “Resource”: [ “arn:aws:kms:YOUR_KMS_ARN_FROM_B_ACCOUNT” ] } ] }

2. Обновите свою воронку, как предложил @Eran Medan.

Для получения дополнительных сведений посетите AWS. CodePipeline с репозиторием CodeCommit для нескольких аккаунтов

Также обратите внимание, что я дал намного больше разрешений, чем требуется, например codecommit: * и kms: *, вы можете изменить их в соответствии с вашими потребностями.

Я надеюсь, это поможет.

person Anoop    schedule 28.11.2019