View a markdown version of this page

在中 CodePipeline 创建一个使用来自另一个管道的资源 AWS 账户 - AWS CodePipeline

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

在中 CodePipeline 创建一个使用来自另一个管道的资源 AWS 账户

您可能希望创建一个使用由另一个 AWS 账户创建或管理的资源的管道。例如,您可能希望将一个账户用于您的管道,将另一个账户用于您的 CodeDeploy 资源。

注意

当您创建一个包含多个账户的操作的管道时,必须配置您的操作,以使它们仍可以在跨账户管道的限制范围内访问构件。跨账户操作适用以下限制:

  • 通常,只有在以下情况下,操作才能使用构件:

    • 操作所属账户与管道账户相同,或者

    • 构件是在管道账户中为另一个账户中的操作创建的,或者

    • 构件是由操作所属账户中的先前操作生成的

    换句话说,如果两个账户都不是管道账户,则无法将构件从一个账户传递到另一个账户。

  • Cross-account 以下操作类型不支持操作:

    • Jenkins 构建操作

在此示例中,您必须创建一个 AWS Key Management Service (AWS KMS) 密钥才能使用,将密钥添加到管道中,并设置账户策略和角色以启用跨账户访问。对于 AWS KMS 密钥,您可以使用密钥 ID、密钥 ARN 或别名 ARN。

注意

别名只能在创建 KMS 密钥的账户中识别。对于跨账户操作,您只能使用密钥 ID 或密钥 ARN 来识别密钥。 Cross-account 操作涉及使用来自其他账户(AccountB)的角色,因此指定密钥 ID 将使用来自其他账户(AccountB)的密钥。

在本演练及其示例中,AccountA是最初用于创建管道的帐户。它可以访问用于存储管道对象的 Amazon S3 存储桶和使用的服务角色 AWS CodePipeline。AccountB是最初用于创建所使用的 CodeDeploy 应用程序、部署组和服务角色的帐户 CodeDeploy。

AccountA要编辑管道以使用由创建的 CodeDeploy 应用程序AccountBAccountA必须:

  • 请求的 ARN 或账户 IDAccountB(在本演练中,AccountBID 为012ID_ACCOUNT_B)。

  • 在管道区域中创建或使用 AWS KMS 客户管理的密钥,并向服务角色授予使用该密钥的权限 (CodePipeline_Service_Role) 和AccountB

  • 创建授予对 Amazon S3 存储桶AccountB访问权限的 Amazon S3 存储桶策略(例如,codepipeline-us-east-2-1234567890)。

  • 创建AccountA允许代入由配置的角色的策略AccountB,并将该策略附加到该服务角色 (CodePipeline_Service_Role)。

  • 编辑管道以使用客户管理的 AWS KMS 密钥而不是默认密钥。

AccountB要允许访问在中创建的管道的资源AccountAAccountB必须:

  • 请求的 ARN 或账户 IDAccountA(在本演练中,AccountAID 为012ID_ACCOUNT_A)。

  • 创建适用于为其配置的 Amazon EC2 实例角色的策略 CodeDeploy ,该策略允许访问 Amazon S3 存储桶 (codepipeline-us-east-2-1234567890)。

  • 创建适用于配置的 Amazon EC2 实例角色的策略 CodeDeploy ,该策略允许访问用于加密管道对象的 AWS KMS 客户管理密钥AccountA

  • 使用允许中的 CodePipeline 服务角色代入该角色的信任关系策略配置和附加 IAM 角色 (CrossAccount_Role)。AccountA

  • 创建允许访问管道所需的部署资源的策略并将其附加到CrossAccount_Role

  • 创建允许访问 Amazon S3 存储桶 (codepipeline-us-east-2-1234567890) 的策略并将其附加到CrossAccount_Role

先决条件:创建一个 AWS KMS 加密密钥

Customer-managed 密钥是特定于某个区域的,所有 AWS KMS 密钥也是如此。您必须在创建管道的同一区域(例如us-east-2)中创建客户管理 AWS KMS 密钥。

要在中创建客户管理的密钥 AWS KMS
  1. 使用登录 AWS 管理控制台 AccountA并打开 AWS KMS 控制台。

  2. 在左侧,选择 客户管理的密钥

  3. 选择创建密钥。在配置密钥中,保留默认选中的对称,然后选择下一步

  4. 别名中,输入用于此密钥的别名(例如,PipelineName-Key)。(可选)提供有关该密钥的描述和标签,然后选择下一步

  5. 定义密钥管理权限中,选择您希望作为该密钥管理员的一个或多个角色,然后选择下一步

  6. 在 “定义密钥使用权限” 中的 “此帐户” 下,选择管道的服务角色的名称(例如, CodePipeline_Service_Role)。在 “其他 AWS 帐户” 下,选择 “添加其他 AWS 帐户” 。输入的账户 ID AccountB 以完成 ARN,然后选择 “下一步”。

  7. 审核和编辑密钥策略中审核策略,然后选择完成

  8. 从密钥列表中选择密钥的别名并复制其 ARN(例如 arn:aws:kms:us-east-2:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE)。在您编辑您的管道和配置策略时将会需要此密钥。

步骤 1:设置账户策略和角色

创建 AWS KMS 密钥后,必须创建和附加允许跨账户访问的策略。这需要AccountA和都采取行动AccountB

在将创建管道的账户中配置策略和角色 (账户 A)

要创建使用与其他 AWS 账户关联的 CodeDeploy 资源的管道,AccountA必须为用于存储对象的 Amazon S3 存储桶和的服务角色配置策略 CodePipeline。

创建授予 AccountB 访问权限的 Amazon S3 桶策略(控制台)
  1. AWS 管理控制台 使用登录AccountA并打开 Amazon S3 控制台,网址为https://console.aws.amazon.com/s3/

  2. 在 Amazon S3 桶列表中,选择用于存储您的管道构件的 Amazon S3 桶。此存储桶命名codepipeline-region-1234567EXAMPLE,其中region是您创建管道的 AWS 区域,1234567EXAMPLE是一个十位数的随机数,可确保存储桶名称是唯一的(例如,codepipeline-us-east-2-1234567890)。

  3. 在 Amazon S3 桶的详细信息页面上,选择属性

  4. 在属性窗格中,展开 Permissions,然后选择 Add bucket policy

    注意

    如果一个策略已附加到您的 Amazon S3 桶,请选择编辑桶策略。然后,您可以将以下示例中的语句添加到现有策略中。要添加新策略,请选择链接,然后按照 AWS 策略生成器中的说明进行操作。有关更多信息,请参阅 IAM 策略概述

  5. Bucket Policy Editor 窗口中,创建一个策略,该策略将AccountB允许AccountB访问管道对象,并允许在某个操作(例如自定义源或生成操作)创建输出对象时添加这些对象。

  6. 选择 Save,然后关闭策略编辑器。

  7. 选择保存以保存 Amazon S3 桶的权限。

为的服务角色创建策略 CodePipeline (控制台)
  1. AWS 管理控制台 使用登录AccountA并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择角色

  3. 在角色列表中的角色名称下,选择 CodePipeline 的服务角色的名称。

  4. 权限选项卡上,选择添加内联策略

  5. 选择 JSON 选项卡,然后输入以下策略AccountB以允许代入该角色。在以下示例中,ARN 012ID_ACCOUNT_B 是:AccountB

    JSON
    { "Version":"2012-10-17", "Statement": { "Effect": "Allow", "Action": "sts:AssumeRole", "Resource": [ "arn:aws:iam::111122223333:role/*" ] } }
  6. 选择查看策略

  7. Name (名称) 中,输入此策略的名称。选择创建策略

在拥有的账户中配置策略和角色 AWS 资源(账户 B)

当您在中创建应用程序、部署和部署组时 CodeDeploy,您还会创建一个 Amazon EC2 实例角色。(如果您使用“运行部署演练”向导,系统将为您创建该角色,但您也可以手动创建该角色。) AccountA要使在中创建的管道使用在中创建的 CodeDeploy 资源AccountB,您必须:

  • 为实例角色配置策略,允许它访问存储管道构件的 Amazon S3 桶。

  • AccountB配置为跨账户访问中创建第二个角色。

    第二个角色不仅必须有权访问中的 Amazon S3 存储桶AccountA,还必须包含允许访问 CodeDeploy 资源的策略和允许中的 CodePipeline AccountA服务角色代入该角色的信任关系策略。

    注意

    这些策略专门用于设置要在使用其他 AWS 账户创建的管道中使用的 CodeDeploy 资源。其他 AWS 资源将需要专门针对其资源需求的政策。

为配置的 Amazon EC2 实例角色创建策略 CodeDeploy (控制台)
  1. AWS 管理控制台 使用登录AccountB并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择角色

  3. 在角色列表的角色名称下,选择用作 CodeDeploy 应用程序的 Amazon EC2 实例角色的服务角色的名称。该角色名称可能不同,而且多个实例角色可以由一个部署组使用。有关更多信息,请参阅为 Amazon EC2 实例创建 IAM 实例配置文件

  4. 权限选项卡上,选择添加内联策略

  5. 选择 JSON 选项卡,然后输入以下策略以授予访问用于存储管道对象的 AccountA Amazon S3 存储桶的访问权限(在本示例中,codepipeline-us-east-2-1234567890):

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket" ] } ] }
  6. 选择查看策略

  7. Name (名称) 中,输入此策略的名称。选择创建策略

  8. 创建第二个策略,说明客户管理密钥arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE的 ARN 在 AWS KMS 哪里,该密钥是在哪里创建AccountA并配置为AccountB允许使用的:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:DescribeKey", "kms:GenerateDataKey*", "kms:Encrypt", "kms:ReEncrypt*", "kms:Decrypt" ], "Resource": [ "arn:aws:kms:us-east-1:111122223333:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    重要

    您必须使用此策略AccountA中的账户 ID 作为 AWS KMS 密钥资源 ARN 的一部分,如此处所示,否则该策略将无法生效。

  9. 选择查看策略

  10. Name (名称) 中,输入此策略的名称。选择创建策略

现在创建一个 IAM 角色用于跨账户访问,并对其进行配置,以便中的 CodePipeline 服务角色AccountA可以代入该角色。此角色必须包含允许访问 CodeDeploy 资源和用于存储对象的 Amazon S3 存储桶的策略AccountA

在 IAM 中配置跨账户角色
  1. AWS 管理控制台 使用登录AccountB并打开 IAM 控制台,网址为https://console.aws.amazon.com/iam

  2. 在导航窗格中,选择角色。选择创建角色

  3. 选择受信任实体的类型下,选择其他 AWS 账户。在 “指定可以使用此角色的帐户” 下的 “账户 ID” 中 ,在 CodePipeline (AccountA) 中输入用于创建管道的账户的账户 ID,然后选择 “下一步:权限” 。 AWS

    重要

    此步骤创建AccountB和之间的信任关系策略AccountA。但是,这会授予账户的根级访问权限,并 CodePipeline 建议将其范围缩小到中的 CodePipeline AccountA服务角色。按照步骤 16 限制权限。

  4. 在 “附加权限策略” 下 AmazonS3ReadOnlyAccess,选择,然后选择 “下一步:标签”

    注意

    这并不是您要使用的策略。您必须选择一个策略来完成向导。

  5. 选择下一步:审核。在角色名称中键入该角色的名称(例如,CrossAccount_Role)。您可以任意命名该角色,只要其遵循 IAM 中的命名约定即可。考虑为该角色使用一个明确指明其用途的名称。选择创建角色

  6. 从角色列表中,选择您刚刚创建的角色(例如CrossAccount_Role)以打开该角色的摘要页面。

  7. 权限选项卡上,选择添加内联策略

  8. 选择 JSON 选项卡,然后输入以下策略以允许访问 CodeDeploy 资源:

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codedeploy:CreateDeployment", "codedeploy:GetDeployment", "codedeploy:GetDeploymentConfig", "codedeploy:GetApplicationRevision", "codedeploy:RegisterApplicationRevision" ], "Resource": "*" } ] }
  9. 选择查看策略

  10. Name (名称) 中,输入此策略的名称。选择创建策略

  11. 权限选项卡上,选择添加内联策略

  12. 选择 JSON 选项卡,然后输入以下策略,以允许此角色从 Amazon S3 存储桶中检索输入项目,并将输出项目放入其中AccountA

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/*" ] } ] }
  13. 选择查看策略

  14. Name (名称) 中,输入此策略的名称。选择创建策略

  15. 权限” 选项卡上,AmazonS3ReadOnlyAccess在 “策略名称” 下的策略列表中查找,然后选择策略旁边的删除图标 (X)。系统提示时,选择 Detach

  16. 选择信任关系选项卡,然后选择编辑信任策略。选择左侧栏中的添加主体选项。对于委托人类型,选择 IAM 角色,然后为中的 CodePipeline AccountA服务角色提供 ARN。从 AWS 主体列表中删除 arn:aws:iam::Account_A:root,然后选择更新策略

步骤 2:编辑管道

您不能使用 CodePipeline 控制台创建或编辑使用与其他 AWS 账户关联的资源的管道。但是,您可以使用控制台创建管道的总体结构,然后使用 AWS CLI 来编辑管道并添加这些资源。或者,您可以使用现有管道的结构并手动向其添加资源。

添加与其他资源关联的资源 AWS 账户 (AWS CLI)
  1. 在终端(Linux、macOS 或 Unix)或命令提示符 (Windows) 中,对您要添加资源的管道运行 get-pipeline 命令。将命令输出复制到 JSON 文件。例如,对于名为 MyFirstPipeline 的管道,您应键入类似以下的内容:

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

    输出将会发送到 pipeline.json 文件。

  2. 在任何纯文本编辑器中打开 JSON 文件。进入工件存储后"type": "S3",添加 KMS 加密密钥、ID 和类型信息,其中codepipeline-us-east-2-1234567890是用于存储管道对象的 Amazon S3 存储桶的名称,arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE也是您刚刚创建的客户管理密钥的 ARN:

    { "artifactStore": { "location": "codepipeline-us-east-2-1234567890", "type": "S3", "encryptionKey": { "id": "arn:aws:kms:us-east-1:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE", "type": "KMS" } },
  3. 在阶段中添加部署操作以使用与之关联的 CodeDeploy 资源AccountB,包括您创建的跨账户角色的roleArn值 (CrossAccount_Role)。

    以下示例显示了添加名为的部署操作的 JSON ExternalDeploy。它使用在名为的阶段AccountB中创建的 CodeDeploy 资源Staging。在以下示例中,的 ARN AccountB 是:012ID_ACCOUNT_B

    , { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyAppBuild" } ], "name": "ExternalDeploy", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "AccountBApplicationName", "DeploymentGroupName": "AccountBApplicationGroupName" }, "runOrder": 1, "roleArn": "arn:aws:iam::012ID_ACCOUNT_B:role/CrossAccount_Role" } ] }
    注意

    这不是整个管道的 JSON,而只是一个阶段中操作的结构。

  4. 您必须从文件中删除 metadata 行以便 update-pipeline 命令可以使用它。从 JSON 文件中的管道结构中删除该部分("metadata": { } 行以及 "created""pipelineARN""updated" 字段)。

    例如,从结构中删除以下各行:

    "metadata": { "pipelineArn": "arn:aws:codepipeline:region:account-ID:pipeline-name", "created": "date", "updated": "date" }

    保存该文件。

  5. 要应用更改,请运行 update-pipeline 命令并指定一个管道 JSON 文件,类似于以下内容:

    重要

    务必在文件名前包含 file://。此命令中需要该项。

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    该命令会返回编辑后的管道的整个结构。

测试使用与其他资源关联的管道 AWS 账户
  1. 在终端(Linux、macOS 或 Unix)或命令提示符 (Windows) 中,运行 start-pipeline-execution 命令,指定管道的名称,类似下面这样:

    aws codepipeline start-pipeline-execution --name MyFirstPipeline

    有关更多信息,请参阅 手动启动管道

  2. 使用登录 AWS 管理控制台 AccountA并打开 CodePipeline控制台,地址为http://console.aws.amazon.com/codesuite/codepipeline/home

    将显示与您的 AWS 账户关联的所有管道的名称。

  3. 名称中,选择您刚编辑的管道的名称。这将打开管道的详细视图,包括管道每个阶段中每个操作的状态。

  4. 观看管道中的进度。等待有关使用与其他 AWS 账户关联的资源的操作的成功消息。

    注意

    如果您尝试在登录时查看操作的详细信息,则会收到错误消息AccountA。注销,然后使用登录AccountB以查看部署详细信息 CodeDeploy。