

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

# 在中 CodePipeline 创建使用其他 AWS 账户资源的管道
<a name="pipelines-create-cross-account"></a>

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

**注意**  
当您创建一个包含多个账户的操作的管道时，必须配置您的操作，以使它们仍可以在跨账户管道的限制范围内访问构件。跨账户操作适用以下限制：  
通常，只有在以下情况下，操作才能使用构件：  
操作所属账户与管道账户相同，或者
构件是在管道账户中为另一个账户中的操作创建的，或者 
构件是由操作所属账户中的先前操作生成的
换句话说，如果两个账户都不是管道账户，则无法将构件从一个账户传递到另一个账户。
以下操作类型不支持跨账户操作：  
Jenkins 构建操作

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

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

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

{{AccountA}}要编辑管道以使用由创建的 CodeDeploy 应用程序{{AccountB}}，{{AccountA}}必须：
+ 请求的 ARN 或账户 ID{{AccountB}}（在本演练中，{{AccountB}}ID 为）。{{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}}要允许在中创建的管道访问其资源{{AccountA}}，{{AccountB}}必须：
+ 请求的 ARN 或账户 ID{{AccountA}}（在本演练中，{{AccountA}}ID 为）。{{012ID\_ACCOUNT\_A}}
+ 创建应用于为其配置[的 Amazon EC2 实例角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)的策略 CodeDeploy ，该策略允许访问 Amazon S3 存储桶 ({{codepipeline-us-east-2-1234567890}})。
+ 创建应用于为其配置[的 Amazon EC2 实例角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)的策略 CodeDeploy ，允许访问用于加密管道项目的 AWS KMS 客户托管密钥{{AccountA}}。
+ 使用信任关系策略配置并附加一个 IAM 角色 ({{CrossAccount\_Role}})，该策略{{AccountA}}允许中的 CodePipeline 服务角色代入该角色。
+ 创建允许访问管道所需的部署资源的策略并将其附加到{{CrossAccount\_Role}}。
+ 创建允许访问 Amazon S3 存储桶 ({{codepipeline-us-east-2-1234567890}}) 的策略并将其附加到{{CrossAccount\_Role}}。

**Topics**
+ [先决条件：创建 AWS KMS 加密密钥](#pipelines-create-cross-account-create-key)
+ [步骤 1：设置账户策略和角色](#pipelines-create-cross-account-setup)
+ [步骤 2：编辑管道](#pipelines-create-cross-account-create)

## 先决条件：创建 AWS KMS 加密密钥
<a name="pipelines-create-cross-account-create-key"></a>

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

**要在中创建客户管理的密钥 AWS KMS**

1. 使用登录 AWS 管理控制台 {{AccountA}}并打开 AWS KMS 控制台。

1. 在左侧，选择 **客户管理的密钥**。

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

1. 在**别名**中，输入用于此密钥的别名（例如，{{PipelineName-Key}}）。（可选）提供有关该密钥的描述和标签，然后选择**下一步**。

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

1. 在 “**定义密钥使用权限**” 中的 “**此帐户**” 下，选择管道的服务角色名称（例如 CodePipeline \_Service\_Role）。在 “**其他 AWS 账户**” 下，选择 “**添加其他 AWS 账户**”。**输入{{AccountB}}要完成 ARN 的账户 ID，然后选择下一步。**

1. 在**审核和编辑密钥策略**中审核策略，然后选择**完成**。

1. 从密钥列表中选择密钥的别名并复制其 ARN（例如 **{{arn:aws:kms:us-east-2:012ID\_ACCOUNT\_A:key/2222222-3333333-4444-556677EXAMPLE}}**）。在您编辑您的管道和配置策略时将会需要此密钥。

## 步骤 1：设置账户策略和角色
<a name="pipelines-create-cross-account-setup"></a>

创建 AWS KMS 密钥后，您必须创建并附加将启用跨账户访问权限的策略。这需要{{AccountA}}和同时采取行动{{AccountB}}。

**Topics**
+ [在创建管道的账户中配置策略和角色 ({{AccountA}})](#pipelines-create-cross-account-setup-accounta)
+ [在拥有 AWS 资源的账户中配置策略和角色 ({{AccountB}})](#pipelines-create-cross-account-setup-accountb)

### 在创建管道的账户中配置策略和角色 ({{AccountA}})
<a name="pipelines-create-cross-account-setup-accounta"></a>

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

**创建授予 AccountB 访问权限的 Amazon S3 桶策略（控制台）**

1. 使用登录{{AccountA}}并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。 AWS 管理控制台 

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

1. 在 Amazon S3 桶的详细信息页面上，选择**属性**。

1. 在属性窗格中，展开 **Permissions**，然后选择 **Add bucket policy**。
**注意**  
如果一个策略已附加到您的 Amazon S3 桶，请选择**编辑桶策略**。然后，您可以将以下示例中的语句添加到现有策略中。要添加新策略，请选择链接，然后按照 AWS 策略生成器中的说明进行操作。有关更多信息，请参阅 [IAM 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html)。

1. 在 **Bucket Policy Editor** 窗口中，创建一个允许{{AccountB}}访问管道工件的策略，并允许在某个操作（例如自定义源或生成操作）创建输出工件时添加输出项目。{{AccountB}}

1. 选择 **Save**，然后关闭策略编辑器。

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

**为的服务角色创建策略 CodePipeline （控制台）**

1. 使用登录{{AccountA}}并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。 AWS 管理控制台 

1. 在导航窗格中，选择**角色**。

1. 在角色列表中的**角色名称**下，选择 CodePipeline 的服务角色的名称。

1. 在**权限**选项卡上，选择**添加内联策略**。

1. 选择 **JSON** 选项卡，然后输入以下策略{{AccountB}}以允许代入该角色。在以下示例中，ARN {{012ID\_ACCOUNT\_B}} 是：{{AccountB}}

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": {
           "Effect": "Allow",
           "Action": "sts:AssumeRole",
           "Resource": [
               "arn:aws:iam::{{111122223333}}:role/*"
           ]
       }
   }
   ```

------

1. 选择**查看策略**。

1. 在 **Name (名称)** 中，输入此策略的名称。选择**创建策略**。

### 在拥有 AWS 资源的账户中配置策略和角色 ({{AccountB}})
<a name="pipelines-create-cross-account-setup-accountb"></a>

当您在中创建应用程序、部署和部署组时 CodeDeploy，还会创建 [Amazon EC2 实例角色](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)。（如果您使用“运行部署演练”向导，系统将为您创建该角色，但您也可以手动创建该角色。） {{AccountA}}要使在中创建的管道使用中创建的 CodeDeploy 资源{{AccountB}}，您必须：
+ 为实例角色配置策略，允许它访问存储管道构件的 Amazon S3 桶。
+ 在为跨账户访问{{AccountB}}配置中创建第二个角色。

  第二个角色不仅必须有权访问中的 Amazon S3 存储桶{{AccountA}}，还必须包含允许访问 CodeDeploy 资源的策略和允许中的 CodePipeline {{AccountA}}服务角色代入该角色的信任关系策略。
**注意**  
这些策略专门用于设置要在使用其他 AWS 账户创建的管道中使用的 CodeDeploy 资源。其他 AWS 资源将需要针对其资源需求的具体政策。

**为为 CodeDeploy （控制台）配置的 Amazon EC2 实例角色创建策略**

1. 使用登录{{AccountB}}并打开 IAM 控制台，网址为[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。 AWS 管理控制台 

1. 在导航窗格中，选择**角色**。

1. 在角色列表中的**角色名称**下，选择用作 CodeDeploy 应用程序的 Amazon EC2 实例角色的服务角色的名称。该角色名称可能不同，而且多个实例角色可以由一个部署组使用。有关更多信息，请参阅[为 Amazon EC2 实例创建 IAM 实例配置文件](https://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-create-iam-instance-profile.html)。

1. 在**权限**选项卡上，选择**添加内联策略**。

1. 选择 **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}}"
          ]
        }
      ]
    }
   ```

------

1. 选择**查看策略**。

1. 在 **Name (名称)** 中，输入此策略的名称。选择**创建策略**。

1. 创建第二个策略，说明 AWS KMS 在**{{arn:aws:kms:us-east-1:012ID\_ACCOUNT\_A:key/2222222-3333333-4444-556677EXAMPLE}}**中创建{{AccountA}}并配置为允许{{AccountB}}使用的客户托管密钥的 ARN 在哪里：

------
#### [ 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 的一部分，如图所示，否则该策略将失效。

1. 选择**查看策略**。

1. 在 **Name (名称)** 中，输入此策略的名称。选择**创建策略**。

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

**在 IAM 中配置跨账户角色**

1. 使用登录{{AccountB}}并在 [https://console.aws.amazon.com/ AWS 管理控制台](https://console.aws.amazon.com/iam)iam 上打开 IAM 控制台。

1. 在导航窗格中，选择**角色**。选择**创建角色**。

1. 在**选择受信任实体的类型**下，选择**其他 AWS 账户**。**在 “指定可以使用此角色**的**账户 ID**” 下，在 CodePipeline ({{AccountA}}) 中输入要创建管道的账户的账户 ID，然后选择**下一步：权限**。 AWS 
**重要**  
此步骤将在{{AccountB}}和之间创建信任关系策略{{AccountA}}。但是，这会授予对账户的根级访问权限，并 CodePipeline 建议将其范围缩小到中的 CodePipeline {{AccountA}}服务角色。按照步骤 16 限制权限。

1. 在 “**附加权限策略**” 下，选择 **AmazonS3 ReadOnlyAccess**，然后选择 “**下一步：标签**”。
**注意**  
这并不是您要使用的策略。您必须选择一个策略来完成向导。

1. 选择**下一步：审核**。在角色名称中键入此**角色的名称**（例如，{{CrossAccount\_Role}}）。您可以任意命名该角色，只要其遵循 IAM 中的命名约定即可。考虑为该角色使用一个明确指明其用途的名称。选择**创建角色**。

1. 从角色列表中，选择您刚刚创建的角色（例如{{CrossAccount\_Role}}），以打开该角色的 “**摘要**” 页面。

1. 在**权限**选项卡上，选择**添加内联策略**。

1. 选择 **JSON** 选项卡，然后输入以下策略以允许访问 CodeDeploy 资源：

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "codedeploy:CreateDeployment",
           "codedeploy:GetDeployment",
           "codedeploy:GetDeploymentConfig",
           "codedeploy:GetApplicationRevision",
           "codedeploy:RegisterApplicationRevision"
         ],
         "Resource": "*"
       }
     ]
   }
   ```

------

1. 选择**查看策略**。

1. 在 **Name (名称)** 中，输入此策略的名称。选择**创建策略**。

1. 在**权限**选项卡上，选择**添加内联策略**。

1. 选择 **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}}/*"
          ]
        }
      ]
   }
   ```

------

1. 选择**查看策略**。

1. 在 **Name (名称)** 中，输入此策略的名称。选择**创建策略**。

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

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

## 步骤 2：编辑管道
<a name="pipelines-create-cross-account-create"></a>

您不能使用 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}} 文件。

1. 在任何纯文本编辑器中打开 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"
       }
     },
   ```

1. 在阶段中添加部署操作以使用与之关联的 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，而只是一个阶段中操作的结构。

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

   例如，从结构中删除以下各行：

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

   保存该文件。

1.  要应用更改，请运行 **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
   ```

   有关更多信息，请参阅 [手动启动管道](pipelines-rerun-manually.md)。

1. 使用登录 AWS 管理控制台 {{AccountA}}并打开主 CodePipeline机，[网址为 http://console.aws.amazon。 com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

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

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

1. 观看管道中的进度。等待有关使用与其他 AWS 账户关联的资源的操作的成功消息。
**注意**  
如果您在使用登录时尝试查看操作的详细信息，则会收到一条错误消息{{AccountA}}。注销，然后使用登录{{AccountB}}以查看部署详细信息 CodeDeploy。