在中 CodePipeline 创建使用其他 Amazon 账户资源的管道 - Amazon CodePipeline
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

在中 CodePipeline 创建使用其他 Amazon 账户资源的管道

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

注意

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

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

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

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

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

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

  • 以下操作类型不支持跨账户操作:

    • Jenkins 构建操作

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

注意

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

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

要让 Ac countA 编辑管道以使用由 Account B 创建的 CodeDeploy 应用程序,AccountA 必须:

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

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

  • 创建亚马逊 S3 存储桶策略,授予 Ac countB 访问亚马逊 S3 存储桶的权限(例如,codepipeline-us-east-2- 1234567890)。

  • 创建允许账户 A 代入账户 B 配置的角色的策略,并将该策略附加到服务角色 (_Service_Role)。CodePipeline

  • 编辑管道以使用客户托管 Amazon KMS 密钥而不是默认密钥。

要使 AccountB 允许在 AccountA 中创建的管道访问其资源,AccountB 必须:

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

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

  • 创建应用于为其配置的 Amazon EC2 实例角色的策略 CodeDeploy ,该策略允许访问用于在 Ac coun tA 中加密管道项目的 Amazon KMS 客户托管密钥。

  • 配置并附加一个 IAM 角色 (CrossAccount_Rol e),其信任关系策略允许 Accoun tA 中的 CodePipeline 服务角色代入该角色。

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

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

先决条件:创建 Amazon KMS 加密密钥

客户管理的密钥和所有 Amazon KMS 密钥都特定于一个区域。您必须在创建管道的同一区域(例如us-east-2)创建客户托管 Amazon KMS 密钥。

要在中创建客户管理的密钥 Amazon KMS
  1. 使用 Ac coun Amazon Web Services Management Console tA 登录并打开控制台。 Amazon KMS

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

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

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

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

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

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

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

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

创建 Amazon KMS 密钥后,您必须创建并附加将启用跨账户访问权限的策略。这需要来自 AccountAAccountB 的操作。

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

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

创建授予 AccountB 访问权限的 Amazon S3 桶策略(控制台)
  1. 使用 Ac coun Amazon Web Services Management Console tA 登录并打开亚马逊 S3 控制台,网址为 https://console.aws.amazon.com/s3/。

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

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

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

    注意

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

  5. 桶策略编辑器窗口中,键入以下策略。这将允许 AccountB 访问管道项目,并且如果某个操作 (比如自定义源或生成操作) 创建了这些管道项目,则将为 AccountB 提供添加输出项目的功能。

    在该示例中,AccountB 的 ARN 为 012ID_ACCOUNT_B亚马逊 S3 存储桶的 ARN 为 -2-1234567890 codepipeline-us-east。将这些 ARN 分别替换为要允许访问的账户的 ARN 和 Amazon S3 桶的 ARN:

    { "Version": "2012-10-17", "Id": "SSEAndSSLPolicy", "Statement": [ { "Sid": "DenyUnEncryptedObjectUploads", "Effect": "Deny", "Principal": "*", "Action": "s3:PutObject", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "StringNotEquals": { "s3:x-amz-server-side-encryption": "aws:kms" } } }, { "Sid": "DenyInsecureConnections", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*", "Condition": { "Bool": { "aws:SecureTransport": false } } }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": [ "s3:Get*", "s3:Put*" ], "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" }, { "Sid": "", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::012ID_ACCOUNT_B:root" }, "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::codepipeline-us-east-2-1234567890" } ] }
  6. 选择 Save,然后关闭策略编辑器。

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

为的服务角色创建策略 CodePipeline (控制台)
  1. 使用 Ac coun Amazon Web Services Management Console tA 登录并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。

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

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

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

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

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

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

在拥有 Amazon 资源的账户 (Ac co untB) 中配置策略和角色

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

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

  • 在配置为跨账户存取的 AccountB 中创建第二个角色。

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

    注意

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

为为 CodeDeploy (控制台)配置的 Amazon EC2 实例角色创建策略
  1. 使用 A ccoun Amazon Web Services Management Console tB 登录并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam/。

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

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

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

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

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] }, { "Effect": "Allow", "Action": [ "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890" ] } ] }
  6. 选择查看策略

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

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

    { "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:012ID_ACCOUNT_A:key/2222222-3333333-4444-556677EXAMPLE" ] } ] }
    重要

    您必须使用本政策中账户 A 的账户 ID 作为 Amazon KMS 密钥资源 ARN 的一部分,如图所示,否则该策略将失效。

  9. 选择查看策略

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

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

在 IAM 中配置跨账户角色
  1. 使用 A ccoun Amazon Web Services Management Console tB 登录并打开 IAM 控制台,网址为 https://console.aws.amazon.com/iam。

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

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

    重要

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

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

    注意

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

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

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

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

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

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

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

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

  12. 策略文档中,键入以下策略以允许该角色从 AccountA 的 Amazon S3 桶中检索输入构件,或者将输出构件放入该桶中:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject*", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::codepipeline-us-east-2-1234567890/*" ] } ] }
  13. 选择查看策略

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

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

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

步骤 2:编辑管道

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

添加与其他 Amazon 账户关联的资源 (Amazon 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. 在阶段添加部署操作以使用与 A ccountB 关联的 CodeDeploy 资源,包括您创建的跨账户角色 (CrossAccount_Role) 的roleArn值。

    以下示例显示了添加名为的部署操作的 JSON ExternalDeploy它使用在名为 “暂存” 的阶段中在 AccountB 中创建的 CodeDeploy 资源。在以下示例中,AccountB 的 ARN 是 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

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

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

    aws codepipeline start-pipeline-execution --name MyFirstPipeline

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

  2. 使用 Ac coun Amazon Web Services Management Console tA 登录并打开 CodePipeline控制台,网址为 http://console.aws.amazon.com/codesuite/codepipeline/home。

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

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

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

    注意

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