

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

# 在中添加跨区域操作 CodePipeline
<a name="actions-create-cross-region"></a>

AWS CodePipeline 包括许多操作，可帮助您为自动发布流程配置构建、测试和部署资源。您可以向管道中添加与您的管道不同的 AWS 区域中的操作。如果 AWS 服务 是操作的提供者，并且此操作 type/provider 类型与您的管道位于不同的 AWS 区域，则这是跨区域操作。

**注意**  
支持跨区域操作，并且只能在支持跨 AWS 区域的 CodePipeline 区域中创建。有关支持的 AWS 区域列表 CodePipeline，请参阅[AWS CodePipeline 中的限额](limits.md)。

您可以使用控制台 AWS CLI、或在管道中 CloudFormation 添加跨区域操作。

**注意**  
中的某些操作类型 CodePipeline 可能仅在某些 AWS 地区可用。另请注意，有些 AWS 区域可能有操作类型可用，但该操作类型的特定 AWS 提供者不可用。

当您创建或编辑管道时，管道区域中必须有构件存储桶，然后每个您计划执行操作的区域必须有一个构件存储桶。有关 `ArtifactStores` 参数的更多信息，请参阅 [CodePipeline 管道结构参考](reference-pipeline-structure.md)。

**注意**  
CodePipeline 在执行跨区域操作时，处理将工件从一个 AWS 区域复制到其他区域的情况。

如果您使用控制台创建管道或跨区域操作，则默认对象存储桶由 CodePipeline 在您有操作的区域中进行配置。当您使用 AWS CLI CloudFormation、或 SDK 创建管道或跨区域操作时，您需要为每个有操作的区域提供构件存储桶。

**注意**  
您必须在跨区域操作所在的 AWS 区域以及与您的管道相同的账户中创建构件存储桶和加密密钥。

无法创建以下操作类型的跨区域操作：
+ 源操作
+ 第三方操作
+ 自定义操作

**注意**  
 CodePipeline在中使用跨区域 Lambda 调用操作时，使用[PutJobSuccessResult[PutJobFailureResult](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PutJobFailureResult.html)](https://docs.aws.amazon.com/codepipeline/latest/APIReference/API_PutJobSuccessResult.html)和执行 lambda 的状态应发送到 AWS 存在 Lambda 函数的区域，而不是发送到存在的区域。 CodePipeline 

当管道将跨区域操作作为阶段的一部分时，仅 CodePipeline 将跨区域操作的输入项目从管道区域复制到操作的区域。

**注意**  
管道区域和维护您的 CloudWatch 事件变更检测资源的区域保持不变。托管管道的区域不会改变。



## 管理管道中的跨区域操作（控制台）
<a name="actions-cross-region-console"></a>

您可以使用 CodePipeline 控制台向现有管道添加跨区域操作。要使用“创建管道”向导创建具有跨区域操作的新管道，请参阅[创建自定义管道（控制台）](pipelines-create.md#pipelines-create-console)。

在控制台中，您可以通过选择操作提供方和**区域**字段，在管道阶段创建跨区域操作，该字段列出您在该区域中为该提供方创建的资源。添加跨区域操作时， CodePipeline 在操作的区域中使用单独的构件存储桶。有关跨区域构件存储桶的更多信息，请参阅[CodePipeline 管道结构参考](reference-pipeline-structure.md)。

### 向管道阶段添加跨区域操作（控制台）
<a name="actions-cross-region-console-add"></a>

使用控制台向管道添加跨区域操作。

**注意**  
如果在保存更改时管道正在运行，则执行将无法执行。

**添加跨区域操作**

1. [通过 http://console.aws.amazon 登录主机。 com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 选择您的管道，然后选择 **Edit (编辑)**。

1. 如果要添加新阶段，请在图表底部选择 **\$1 Add stage (\$1 添加阶段)**；如果要向现有阶段添加操作，请选择 **Edit stage (编辑阶段)**。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 上，选择 **\$1 Add action group (\$1 添加操作组)** 以添加序列操作。或者，选择 **\$1 Add action (\$1 添加操作)** 以添加并行操作。

1. 在 **Edit action (编辑操作)** 页面上：

   1. 在**操作名称**中，输入跨区域操作的名称。

   1. 在 **Action provider (操作提供方)** 中，选择操作提供方。

   1. 在**区域**中，选择您已创建或计划为操作创建资源的 AWS 区域。选择区域后，将列出该区域的可用资源以供选择。Re **g** ion 字段指定为此操作类型和提供者类型创建 AWS 资源的位置。此字段仅在操作提供方是 AWS 服务的情况下对操作显示。**区域**字段默认为与您的管道相同的 AWS 区域 。

   1. 在 **Input artifacts (输入构件)** 中，选择上一阶段的相应输入。例如，如果前一个阶段是源阶段，请选择**SourceArtifact**。

   1. 完成您正在配置的操作提供方的所有必填字段。

   1. 在 **Output artifacts (输出构件)** 中，选择要输出到下一阶段的适当输出。例如，如果下一阶段是部署阶段，请选择**BuildArtifact**。

   1. 选择**保存**。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 中，选择 **Done (完成)**。

1. 选择**保存**。

### 编辑管道阶段的跨区域操作（控制台）
<a name="actions-cross-region-console-edit"></a>

使用控制台编辑管道中的现有跨区域操作。

**注意**  
如果在保存更改时管道正在运行，则执行将无法执行。

**编辑跨区域操作**

1. 在 [https://console.aws.amazon.com/codesuite/codepipeline/home.](https://console.aws.amazon.com/codesuite/codepipeline/home.) 登录控制台。

1. 选择您的管道，然后选择 **Edit (编辑)**。

1. 选择**编辑阶段**。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 上，选择图标以编辑现有操作。

1. 在 **Edit action (编辑操作)** 页面上，根据需要更改字段。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 中，选择 **Done (完成)**。

1. 选择**保存**。

### 删除管道阶段的跨区域操作（控制台）
<a name="actions-cross-region-console-delete"></a>

使用控制台删除管道中的现有跨区域操作。

**注意**  
如果在保存更改时管道正在运行，则执行将无法执行。

**删除跨区域操作**

1. [通过 http://console.aws.amazon 登录主机。 com/codesuite/codepipeline/home](https://console.aws.amazon.com/codesuite/codepipeline/home)。

1. 选择您的管道，然后选择 **Edit (编辑)**。

1. 选择**编辑阶段**。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 上，选择图标以删除现有操作。

1. 在 **Edit: <Stage> (编辑: <Stage>)** 中，选择 **Done (完成)**。

1. 选择**保存**。

## 在管道中添加跨区域操作 (CLI)
<a name="actions-cross-region-cli"></a>

您可以使用 AWS CLI 向现有管道添加跨区域操作。

要使用在管道阶段创建跨区域操作 AWS CLI，请添加配置操作和可选`region`字段。您还必须已在操作的区域中创建一个构件存储桶。您可以使用 `artifactStores` 参数来包含每个区域的构件存储桶的列表，而不是提供单区域管道的 `artifactStore` 参数。

**注意**  
在本演练及其示例中，*RegionA*是创建管道的区域。它可以访问用于存储管道项目的 *RegionA* Amazon S3 存储桶和使用的服务角色 CodePipeline。 *RegionB*是创建所使用的 CodeDeploy 应用程序、部署组和服务角色 CodeDeploy 的区域。

### 先决条件
<a name="actions-create-cross-region-prereq"></a>

您必须已经完成以下操作：
+ 一条管道进来*RegionA*。
+ 里面有一个 Amazon S3 工件存储桶*RegionB*。
+ 中用于您的操作的资源，例如用于跨区域部署操作的 CodeDeploy 应用程序和部署组。*RegionB*

### 在管道中添加跨区域操作 (CLI)
<a name="actions-create-cross-region-cli"></a>

使用 AWS CLI 向管道添加跨区域操作。

**添加跨区域操作**

1. 对于中的管道*RegionA*，请运行**get-pipeline**命令将管道结构复制到 JSON 文件中。例如，对于名为 `MyFirstPipeline` 的管道，运行以下命令：

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

   该命令不会返回任何结果，但您创建的文件将出现在您运行命令所在的目录中。

1. 添加 `region` 字段以添加一个包含您的跨区域操作的新阶段，其中包含您的操作的区域和资源。以下 JSON 示例在新区域中添加了一个带有跨区域部署操作的 Deploy 阶段 CodeDeploy，其中提供者位于新区域`us-east-1`。

   ```
    {
                   "name": "Deploy",
                   "actions": [
                       {
                           "inputArtifacts": [
                               {
                                   "name": "SourceArtifact"
                               }
                           ],
                           "name": "Deploy",
                           "region": "RegionB",
                           "actionTypeId": {
                               "category": "Deploy",
                               "owner": "AWS",
                               "version": "1",
                               "provider": "CodeDeploy"
                           },
                           "outputArtifacts": [],
                           "configuration": {
                               "ApplicationName": "name",
                               "DeploymentGroupName": "name"
                           },
                           "runOrder": 1
                       }
   ```

1. 在管道结构中，删除 `artifactStore` 字段并为新的跨区域操作添加 `artifactStores` 映射。映射必须包括您在其中执行操作的每个 AWS 区域的条目。对于映射中的每个条目，资源必须位于相应的 AWS 区域中。在下面的示例中，`ID-A`是的加密密钥 ID*RegionA*，`ID-B`是的加密密钥 ID *RegionB*。

   ```
   "artifactStores":{  
      "RegionA":{  
         "encryptionKey":{  
            "id":"ID-A",
            "type":"KMS"
         },
         "location":"Location1",
         "type":"S3"
      },
      "RegionB":{  
         "encryptionKey":{  
            "id":"ID-B",
            "type":"KMS"
         },
         "location":"Location2",
         "type":"S3"
      }
   }
   ```

   下面的 JSON 示例将 us-west-2 存储桶显示为 `my-storage-bucket` 并添加名为 `my-storage-bucket-us-east-1` 的新 us-east-1 存储桶。

   ```
           "artifactStores": {
               "us-west-2": {
                   "type": "S3",
                   "location": "my-storage-bucket"
               },
               "us-east-1": {
                   "type": "S3",
                   "location": "my-storage-bucket-us-east-1"
               }
           },
   ```

1. 如果您要使用通过 **get-pipeline** 命令检索到的管道结构，请删除 JSON 文件中的 `metadata` 行。否则，**update-pipeline** 命令无法使用它。删除 `"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
   ```

   该命令会返回编辑后的管道的整个结构。输出类似于以下内容。

   ```
   {
       "pipeline": {
           "version": 4,
           "roleArn": "ARN",
           "stages": [
               {
                   "name": "Source",
                   "actions": [
                       {
                           "inputArtifacts": [],
                           "name": "Source",
                           "actionTypeId": {
                               "category": "Source",
                               "owner": "AWS",
                               "version": "1",
                               "provider": "CodeCommit"
                           },
                           "outputArtifacts": [
                               {
                                   "name": "SourceArtifact"
                               }
                           ],
                           "configuration": {
                               "PollForSourceChanges": "false",
                               "BranchName": "main",
                               "RepositoryName": "MyTestRepo"
                           },
                           "runOrder": 1
                       }
                   ]
               },
               {
                   "name": "Deploy",
                   "actions": [
                       {
                           "inputArtifacts": [
                               {
                                   "name": "SourceArtifact"
                               }
                           ],
                           "name": "Deploy",
                           "region": "us-east-1",
                           "actionTypeId": {
                               "category": "Deploy",
                               "owner": "AWS",
                               "version": "1",
                               "provider": "CodeDeploy"
                           },
                           "outputArtifacts": [],
                           "configuration": {
                               "ApplicationName": "name",
                               "DeploymentGroupName": "name"
                           },
                           "runOrder": 1
                       }
                   ]
               }
           ],
           "name": "AnyCompanyPipeline",
           "artifactStores": {
               "us-west-2": {
                   "type": "S3",
                   "location": "my-storage-bucket"
               },
               "us-east-1": {
                   "type": "S3",
                   "location": "my-storage-bucket-us-east-1"
               }
           }
       }
   }
   ```
**注意**  
**update-pipeline** 命令会停止管道。如果在运行 **update-pipeline** 命令时正在通过管道运行修订，则该运行会被停止。您必须手动启动管道，通过升级后的管道运行此修订。使用 **`start-pipeline-execution`** 命令手动启动您的管道。

1. 更新您的管道后，跨区域操作将显示在控制台中。  
![\[包含跨区域操作的管道的概要视图。\]](http://docs.aws.amazon.com/zh_cn/codepipeline/latest/userguide/images/cross-region-icon.png)

## 在管道中添加跨区域操作 (CloudFormation)
<a name="actions-create-cross-region-cfn"></a>

您可以使用 CloudFormation 向现有管道添加跨区域操作。

**使用添加跨区域操作 CloudFormation**

1. 将 `Region` 参数添加到模板中的 `ActionDeclaration` 资源，如以下示例所示：

   ```
   ActionDeclaration:
                 Type: Object
                 Properties:
                   ActionTypeId:
                     Type: ActionTypeId
                     Required: true
                   Configuration:
                     Type: Map
                   InputArtifacts:
                     Type: Array
                     ItemType:
                       Type: InputArtifact
                   Name:
                     Type: String
                     Required: true
                   OutputArtifacts:
                     Type: Array
                     ItemType:
                       Type: OutputArtifact
                   RoleArn:
                     Type: String
                   RunOrder:
                     Type: Integer
                   Region:
                     Type: String
   ```

1. 在 `Mappings` 下，为映射键 `RegionA` 和 `RegionB` 的值的名为 `SecondRegionMap` 的映射添加区域映射，如此示例所示。在 `Pipeline` 资源下的 `artifactStore` 字段下，为您的新跨区域操作添加 `artifactStores` 映射，如下所示：

   ```
   Mappings:
     SecondRegionMap:
       RegionA:
         SecondRegion: "RegionB"
       RegionB:
         SecondRegion: "RegionA"
   
   ...
   
             Properties:
               ArtifactStores:
                 -
                   Region: RegionB
                   ArtifactStore:
                     Type: "S3"
                     Location: test-cross-region-artifact-store-bucket-RegionB
                 -
                   Region: RegionA
                   ArtifactStore:
                     Type: "S3"
                     Location: test-cross-region-artifact-store-bucket-RegionA
   ```

   以下 YAML 示例将*RegionA*存储桶显示为`us-west-2`并添加了新的*RegionB*存储桶：`eu-central-1`

   ```
   Mappings:
     SecondRegionMap:
       us-west-2:
         SecondRegion: "eu-central-1"
       eu-central-1:
         SecondRegion: "us-west-2"
   
   ...
   
             Properties:
               ArtifactStores:
                 -
                   Region: eu-central-1
                   ArtifactStore:
                     Type: "S3"
                     Location: test-cross-region-artifact-store-bucket-eu-central-1
                 -
                   Region: us-west-2
                   ArtifactStore:
                     Type: "S3"
                     Location: test-cross-region-artifact-store-bucket-us-west-2
   ```

1. 将更新后的模板保存到本地计算机，然后打开 CloudFormation 控制台。

1. 选择堆栈，然后选择**为当前堆栈创建更改集**。

1. 上传模板，然后查看 CloudFormation中列出的更改。这些是要对堆栈进行的更改。您应在列表中看到新资源。

1. 选择**执行**。