

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

# 在中 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\$1ACCOUNT\$1B*
+ 在管道的区域中创建或使用 AWS KMS 客户托管密钥，并向服务角色授予使用该密钥的权限 (*CodePipeline\$1Service\$1Role*) 和*AccountB*。
+ 创建授予对 Amazon S3 存储桶的*AccountB*访问权限的 Amazon S3 存储桶策略（例如，*codepipeline-us-east-2-1234567890*）。
+ 创建*AccountA*允许代入由配置的角色的策略*AccountB*，并将该策略附加到服务角色 (*CodePipeline\$1Service\$1Role*)。
+ 编辑管道以使用客户托管 AWS KMS 密钥而不是默认密钥。

*AccountB*要允许在中创建的管道访问其资源*AccountA*，*AccountB*必须：
+ 请求的 ARN 或账户 ID*AccountA*（在本演练中，*AccountA*ID 为）。*012ID\$1ACCOUNT\$1A*
+ 创建应用于为其配置[的 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\$1Role*)，该策略*AccountA*允许中的 CodePipeline 服务角色代入该角色。
+ 创建允许访问管道所需的部署资源的策略并将其附加到*CrossAccount\$1Role*。
+ 创建允许访问 Amazon S3 存储桶 (*codepipeline-us-east-2-1234567890*) 的策略并将其附加到*CrossAccount\$1Role*。

**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 \$1Service\$1Role）。在 “**其他 AWS 账户**” 下，选择 “**添加其他 AWS 账户**”。**输入*AccountB*要完成 ARN 的账户 ID，然后选择下一步。**

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

1. 从密钥列表中选择密钥的别名并复制其 ARN（例如 ***arn:aws:kms:us-east-2:012ID\$1ACCOUNT\$1A: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\$1ACCOUNT\$1B* 是：*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\$1ACCOUNT\$1A: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\$1Role*）。您可以任意命名该角色，只要其遵循 IAM 中的命名约定即可。考虑为该角色使用一个明确指明其用途的名称。选择**创建角色**。

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

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\$1ACCOUNT\$1A: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\$1Role*）。

   以下示例显示了添加名为的部署操作的 JSON *ExternalDeploy*。它使用在名为的阶段*AccountB*中创建的 CodeDeploy 资源*Staging*。在以下示例中，的 ARN 为*AccountB*：*012ID\$1ACCOUNT\$1B*

   ```
   ,
               {
                   "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。