繁体   English   中英

AWS Codepipeline 与来自另一个账户的 Codecommit 目标源存储库

[英]AWS Codepipeline with a Codecommit targetsource repository from another account

是否可以在另一个帐户中创建一个具有 CodeCommit 存储库目标源的代码管道?

我只需要这样做,我会解释这个过程。

账户 C 是您的 CodeCommit 存储库所在的账户。 账户 P 是您的 CodePipeline... 管道的账户。

在帐户 P 中:

  1. 创建 AWS KMS 加密密钥并添加具有访问权限的账户 C(先决条件步骤中的此处指南)。 您还需要添加 CodePipeline 角色,如果您有 CodeBuild 和 CodeDeploy 步骤,也请添加这些角色。

  2. 在您的 CodePipeline 工件 S3 存储桶中,您需要添加帐户 C 访问权限。 转到存储桶策略并添加:

{
    "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 的账户 ID,并将YOUR_BUCKET_NAME更改为 CodePipeline 工件 S3 存储桶名称。

  1. 将策略添加到您的 CodePipeline 服务角色,以便您可以访问账户 C 和 CodeCommit 存储库:
{
   "Version": "2012-10-17",
   "Statement": {
       "Effect": "Allow",
       "Action": "sts:AssumeRole",
       "Resource": [
           "arn:aws:iam::ACCOUNTC_ID:role/*"
       ]
   }
}

同样,将ACCOUNTC_ID更改为账户 C 的账户 ID。

在帐户 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 策略。 确保将 Trusted entity 作为账户 P 的账户 ID。

在 AWS CLI中 您无法在控制台中执行此操作,因此您必须使用 AWS CLI。 这将使您在 AccountP 中的 CodePipeline 承担源步骤中的角色,并将其转储到 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

通过运行管道来验证它是否有效。

是的,这应该是可能的。 按照这些说明操作:http: //docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create-cross-account.html

您可以在另一个帐户中使用带有 codecommit 存储库的管道来部署资源。

假设您在 codecommit 存储库所在的位置有帐户 A,在 codepipeline 所在的位置有帐户 B。

在帐户 B 中配置以下内容:

  1. 您需要创建自定义 KMS 密钥,因为 AWS 默认密钥没有关联的密钥策略。 如果您在创建 CMK 方面需要帮助,可以使用在使用来自另一个 AWS 账户的资源的 CodePipeline 中创建管道 将 Codepipeline 服务角色添加到 KMS 密钥策略以允许 codepipeline 使用它。

  2. 用于从跨账户接收事件的事件总线转到 CloudWatch → 事件部分下的事件总线 → 添加权限 → 输入 DEV AWS 账户 ID → 添加。 有关详细信息,请查看创建事件总线

  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. 编辑 Pipeline IAM 角色以承担账户 A 的角色,如下所示:

     { “Version”:“2012–10–17”, “Statement”:{ “Effect”:“Allow”, “Action”:“sts:AssumeRole”, “Resource”:[ “arn:aws:iam::ACCOUNT_A_ID:role/* ] } }
  5. 创建 CloudWatch 事件规则以在账户 A 中的 CodeCommit 的主分支上触发管道。添加 CodePipeline 的 ARN 作为此规则的目标。

现在,在账户 A 中执行以下操作:

创建具有 3 个策略的跨账户 IAM 角色。 a) AWSCodeCommitFullAccess

b) 对账户 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 的建议更新您的管道。

有关更多详细信息,请访问带有跨账户 CodeCommit 存储库的 AWS CodePipeline

另外,请注意,我已经授予了比所需更多的权限,例如 codecommit:* 和 kms:*,您可以根据需要更改它们。

我希望这将有所帮助。

可以使用基于一个中央代码提交存储库的存储库中的分支,从另一个AWS账户中的一个中央代码提交存储库中构建和触发多个代码管道。 您需要确保交叉帐户IAM角色到位,事件总线需要配置为从交叉帐户接收事件,并且还必须具有KMS权限。 这是一篇文章,涵盖了您的确切需求: 带有交叉账户CodeCommit回购的AWS Codepipeline希望它能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM