Можно ли создать кодовую цепочку с целевым источником репозитория CodeCommit в другой учетной записи?
AWS Codepipeline с репозиторием целей Codecommit из другой учетной записи
Ответы (3)
Мне просто нужно было это сделать, я объясню процесс.
Учетная запись C - это учетная запись в вашем репозитории CodeCommit. Учетная запись P - это учетная запись с вашими конвейерами CodePipeline ...
В аккаунте P:
Создайте ключ шифрования AWS KMS и добавьте учетную запись C с доступом (руководство здесь в предварительном шаге). Вам также потребуется добавить роль CodePipeline, и если у вас есть этапы CodeBuild и CodeDeploy, добавьте и эти роли.
В вашей корзине артефактов 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.
- Добавьте политику в свою роль службы CodePipeline, чтобы вы могли получить доступ к учетной записи C и репозиториям CodeCommit:
{
"Version": "2012-10-17",
"Statement": {
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": [
"arn:aws:iam::ACCOUNTC_ID:role/*"
]
}
}
Снова измените ACCOUNTC_ID
на идентификатор учетной записи C.
В аккаунте C:
- Создайте политику 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.
- Создайте роль для доступа между аккаунтами и прикрепите указанную выше политику, а также политику 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
Убедитесь, что он работает, запустив конвейер.
An error occurred (AccessDeniedException) when calling the UpdatePipeline operation: Cross-account pass role is not allowed.
, не могли бы вы помочь.
- person Bhatasana Prashant; 01.06.2020
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
Да, это должно быть возможно. Следуйте этим инструкциям: http://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create-cross-account.html
Вы можете развернуть ресурсы с помощью конвейера с репозиторием codecommit в другой учетной записи.
Допустим, у вас есть учетная запись A, где находится ваш репозиторий codecommit, и учетная запись B, где находится ваш код.
Настройте в учетной записи B следующее:
Вам потребуется создать собственный ключ KMS, поскольку для ключа по умолчанию AWS нет связанной политики ключей. Вы можете использовать Создать конвейер в CodePipeline, который использует Ресурсы из другой учетной записи AWS, если вам нужна помощь в создании CMK. Добавьте роль службы Codepipeline в политику ключей KMS, чтобы разрешить codepipeline использовать ее.
Шина событий для получения событий от кросс-аккаунта. Перейдите в CloudWatch → Шины событий в разделе «События» → «Добавить разрешение» → введите идентификатор учетной записи DEV AWS → «Добавить». Для получения дополнительных сведений см. Создание шины событий
Добавьте следующую политику в хранилище артефактов конвейера 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/*” } ] }
Измените роли IAM конвейера, чтобы они взяли на себя роль учетной записи A следующим образом:
{ “Version”:“2012–10–17”, “Statement”:{ “Effect”:“Allow”, “Action”:“sts:AssumeRole”, “Resource”:[ “arn:aws:iam::ACCOUNT_A_ID:role/* ] } }
- Создайте правило события 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: *, вы можете изменить их в соответствии с вашими потребностями.
Я надеюсь, это поможет.