

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

# 教程：创建使用 AWS CloudFormation 部署操作中的变量的管道
<a name="tutorials-cloudformation-action"></a>

在本教程中，您将使用 AWS CodePipeline 控制台创建带有部署操作的管道。管道运行时，模板会创建一个堆栈，另外还创建一个 `outputs` 文件。堆栈模板生成的输出是中 AWS CloudFormation 操作生成的变量 CodePipeline。

在从模板创建堆栈的操作中，您可以指定一个变量命名空间。然后，后续操作可以使用由 `outputs` 文件生成的变量。在此示例中，您将根据 AWS CloudFormation 操作生成的`StackName`变量创建更改集。手动批准后，执行更改集，然后创建删除堆栈操作，此操作根据 `StackName` 变量删除堆栈。

**重要**  
作为创建管道的一部分，客户提供的 S3 工件存储桶将 CodePipeline 用于项目。（这与用于 S3 源操作的存储桶不同。） 如果 S3 工件存储桶与您的管道账户位于不同的账户中，请确保 S3 工件存储桶归其所有 AWS 账户 ，该存储桶是安全且可靠的。

**Topics**
+ [先决条件：创建 AWS CloudFormation 服务角色和 CodeCommit 存储库](#tutorials-cloudformation-action-prereq)
+ [步骤 1：下载、编辑和上传示例 AWS CloudFormation 模板](#tutorials-cloudformation-action-upload)
+ [步骤 2：创建管道](#tutorials-cloudformation-action-pipeline)
+ [步骤 3：添加 CloudFormation 部署操作以创建更改集](#tutorials-cloudformation-action-changeset)
+ [步骤 4：添加手动审批操作](#tutorials-cloudformation-action-approval)
+ [步骤 5：添加 CloudFormation 部署操作以执行更改集](#tutorials-cloudformation-action-deployment)
+ [步骤 6：添加 CloudFormation 部署操作以删除堆栈](#tutorials-cloudformation-action-delete)

## 先决条件：创建 AWS CloudFormation 服务角色和 CodeCommit 存储库
<a name="tutorials-cloudformation-action-prereq"></a>

您必须已经具备以下各项：
+ 存储 CodeCommit 库。您可以使用您在中创建的 AWS CodeCommit 存储库[教程：创建简单的管道（CodeCommit 存储库）](tutorials-simple-codecommit.md)。
+ 此示例从模板创建 Amazon DocumentDB 堆栈。您必须使用 AWS Identity and Access Management (IAM) 为亚马逊文档数据库创建具有以下权限的 AWS CloudFormation 服务角色。

  ```
  "rds:DescribeDBClusters",
  "rds:CreateDBCluster",
  "rds:DeleteDBCluster",
  "rds:CreateDBInstance"
  ```

## 步骤 1：下载、编辑和上传示例 AWS CloudFormation 模板
<a name="tutorials-cloudformation-action-upload"></a>

下载示例 AWS CloudFormation 模板文件并将其上传到您的 CodeCommit 存储库。

1. 导航到您所在区域的示例模板。例如，使用表格（[https://docs.aws.amazon.com/documentdb/latest/developerguide/quick_start_cfn.html#quick_start_cfn-launch_stack](https://docs.aws.amazon.com/documentdb/latest/developerguide/quick_start_cfn.html#quick_start_cfn-launch_stack)）选择区域并下载模板。下载 Amazon DocumentDB 集群的模板。文件名为 `documentdb_full_stack.yaml`。

1. 解压缩 `documentdb_full_stack.yaml` 文件，然后在文本编辑器中打开它。进行以下更改。

   1. 对于此示例，将以下 `Purpose:` 参数添加到模板中的 `Parameters` 部分。

      ```
        Purpose:
          Type: String
          Default: testing
          AllowedValues:
            - testing
            - production
          Description: The purpose of this instance.
      ```

   1. 对于此示例，将以下 `StackName` 输出添加到模板中的 `Outputs:` 部分。

      ```
        StackName:
          Value: !Ref AWS::StackName
      ```

1. 将模板文件上传到您的 AWS CodeCommit 存储库。您必须将解压缩和编辑的模板文件上传到存储库的根目录。

   要使用 CodeCommit 控制台上传文件，请执行以下操作：

   1. 打开 CodeCommit 控制台，然后从 “存储库” 列表中选择您的**存储库**。

   1. 选择**添加文件**，然后选择**上传文件**。

   1. 选择**选择文件**，然后浏览找到您的文件。通过输入您的用户名和电子邮件地址来提交更改。选择**提交更改**。

   文件在存储库的根级别看起来应该像这样：

   ```
   documentdb_full_stack.yaml
   ```

## 步骤 2：创建管道
<a name="tutorials-cloudformation-action-pipeline"></a>

在此部分中，您将使用以下操作创建管道：
+ 一个源阶段，其 CodeCommit 操作中的源构件就是您的模板文件。
+ 包含部署操作的 CloudFormation 部署阶段。

分别向由向导创建的源和部署阶段中的每个操作分配一个变量命名空间 `SourceVariables` 和 `DeployVariables`。由于已向操作分配命名空间，因此在此示例中配置的变量可用于下游操作。有关更多信息，请参阅 [变量参考](reference-variables.md)。

**使用向导创建管道**

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

1. 在**欢迎**页面、**入门**页面或**管道**页面上，选择**创建管道**。

1. 在**步骤 1：选择创建选项**页面上的**创建选项**下，选择**构建自定义管道**选项。选择**下一步**。

1. 在**步骤 2：选择管道设置**的**管道名称**中，输入 **MyCFNDeployPipeline**。

1. CodePipeline 提供 V1 和 V2 类型的管道，它们的特性和价格各不相同。在控制台中，您只能选择 V2 类型。有关更多信息，请参阅[管道类型](https://docs.aws.amazon.com/codepipeline/latest/userguide/pipeline-types-planning.html?icmpid=docs_acp_help_panel)。有关定价的信息 CodePipeline，请参阅[定价](https://aws.amazon.com/codepipeline/pricing/)。

1. 在**服务角色**中，执行下列操作之一：
   + 选择 “**新建服务角色**” CodePipeline 以允许在 IAM 中创建服务角色。
   + 选择**现有服务角色**。在**角色名称**中，从列表中选择您的服务角色。

1. 在**构件存储**中：

   1. 选择**默认位置**以将默认构件存储（如指定为默认值的 Amazon S3 构件桶）用于为管道选择的区域中的管道。

   1. 如果您在管道所在的区域中已有构件存储（例如，Amazon S3 构件桶），请选择**自定义位置**。
**注意**  
这不是源代码的源存储桶。这是管道的项目存储。每个管道都需要一个单独的构件存储，例如 S3 存储桶。创建或编辑管道时，管道区域中必须有一个工件存储桶，并且每个运行操作的 AWS 区域都必须有一个工件存储桶。  
有关更多信息，请参阅[输入和输出构件](welcome-introducing-artifacts.md)和[CodePipeline 管道结构参考](reference-pipeline-structure.md)。

   选择**下一步**。

1. 在**步骤 3：添加源阶段**中：

   1. 在**源提供程序**中，选择 **AWS CodeCommit**。

   1. 在**存储库名称**中，选择您在中创建的 CodeCommit 存储库的名称[步骤 1：创建 CodeCommit 存储库](tutorials-simple-codecommit.md#codecommit-create-repository)。

   1. 在**分支名称**中，选择包含最新的代码更新的分支的名称。

   选择存储库名称和分支后，将显示要为此管道创建的 Amazon CloudWatch Events 规则。

   选择**下一步**。

1. 在**步骤 4：添加构建阶段**中，选择**跳过构建阶段**，并通过再次选择**跳过**接受警告消息。

   选择**下一步**。

1. 在**步骤 5：添加测试阶段**中，选择**跳过测试阶段**，并通过再次选择**跳过**接受警告消息。

   选择**下一步**。

1. 在**步骤 6：添加部署阶段**中：

   1. 在**操作名称**中，选择**部署**。在**部署提供商**中，选择**CloudFormation**。

   1. 在**操作模式**中，选择**创建或更新堆栈**。

   1. 在**堆栈名称**中，为堆栈输入名称。这是模板将创建的堆栈的名称。

   1. 在**输出文件名**中，输入输出文件的名称，如 **outputs**。这是创建堆栈后由操作创建的文件的名称。

   1. 展开**高级**。在**参数覆盖**下，作为键值对输入模板覆盖。例如，此模板需要以下覆盖。

      ```
      {
      "DBClusterName": "MyDBCluster",
      "DBInstanceName": "MyDBInstance",
      "MasterUser": "UserName",
      "MasterPassword": "Password",
      "DBInstanceClass": "db.r4.large",
      "Purpose": "testing"}
      ```

      如果不输入覆盖，则模板会创建一个具有默认值的堆栈。

   1. 选择**下一步**。

   1. 在 “**步骤 7：查看**” 中，选择 “**创建管道**”。您应该可以看到一个显示管道阶段的示意图。允许您的管道运行。您的两阶段管道已完成并准备好添加其他阶段。

## 步骤 3：添加 CloudFormation 部署操作以创建更改集
<a name="tutorials-cloudformation-action-changeset"></a>

在管道中创建下一个操作， CloudFormation 允许在手动批准操作之前创建变更集。



1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   在**管道**下，选择您的管道并选择**查看**。该图显示了您的管道源和部署阶段。

1. 选择以编辑管道，或继续在**编辑**模式下显示管道。

1. 选择以编辑**部署**阶段。

1. 添加一个部署操作，该操作将为在上一个操作中创建的堆栈创建更改集。您可以在阶段中的现有操作之后添加此操作。

   1. 在**操作名称**中，输入 **Change\$1Set**。对于**操作提供程序**，选择 **AWS CloudFormation **。

   1. 在**输入构件**中，选择**SourceArtifact**。

   1. 在**操作模式**中，选择**创建或替换更改集**。

   1. 在**堆栈名称**中，如下所示输入变量语法。这是为其创建更改集的堆栈的名称，其中，向操作分配默认命名空间 `DeployVariables`。

      ```
      #{DeployVariables.StackName}
      ```

   1. 在**更改集名称**中，输入更改集的名称。

      ```
      my-changeset
      ```

   1. 在**参数覆盖**中，将 `Purpose` 参数从 `testing` 更改为 `production`。

      ```
      {
      "DBClusterName": "MyDBCluster",
      "DBInstanceName": "MyDBInstance",
      "MasterUser": "UserName",
      "MasterPassword": "Password",
      "DBInstanceClass": "db.r4.large",
      "Purpose": "production"}
      ```

   1. 选择**完成**以保存操作。

## 步骤 4：添加手动审批操作
<a name="tutorials-cloudformation-action-approval"></a>

在管道中创建手动审批操作。



1. 选择以编辑管道，或继续在**编辑**模式下显示管道。

1. 选择以编辑**部署**阶段。

1. 在创建更改集的部署操作之后添加手动审批操作。此操作允许您在管道执行更改集 CloudFormation 之前验证中已创建的资源变更集。

## 步骤 5：添加 CloudFormation 部署操作以执行更改集
<a name="tutorials-cloudformation-action-deployment"></a>

在管道中创建下一个操作， CloudFormation 允许在手动批准操作之后执行变更集。



1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   在**管道**下，选择您的管道并选择**查看**。该图显示了您的管道源和部署阶段。

1. 选择以编辑管道，或继续在**编辑**模式下显示管道。

1. 选择以编辑**部署**阶段。

1. 添加将执行在上一个手动操作中审批的更改集的部署操作：

   1. 在**操作名称**中，输入 **Execute\$1Change\$1Set**。对于**操作提供程序**，选择 **AWS CloudFormation**。

   1. 在**输入构件**中，选择**SourceArtifact**。

   1. 在**操作模式**中，选择**执行更改集**。

   1. 在**堆栈名称**中，如下所示输入变量语法。这是为其创建更改集的堆栈的名称。

      ```
      #{DeployVariables.StackName}
      ```

   1. 在**更改集名称**中，输入您在上一个操作中创建的更改集的名称。

      ```
      my-changeset
      ```

   1. 选择**完成**以保存操作。

   1. 继续管道运行。

## 步骤 6：添加 CloudFormation 部署操作以删除堆栈
<a name="tutorials-cloudformation-action-delete"></a>

在管道中创建最后一个操作， CloudFormation 允许从输出文件中的变量中获取堆栈名称并删除堆栈。



1. 打开 CodePipeline 控制台，网址为[https://console.aws.amazon.com/codepipeline/](https://console.aws.amazon.com/codepipeline/)。

   在**管道**下，选择您的管道并选择**查看**。该图显示了您的管道源和部署阶段。

1. 选择以编辑管道。

1. 选择以编辑**部署**阶段。

1. 添加将删除堆栈的部署操作：

   1. 在**操作名称**中，选择**DeleteStack**。在**部署提供商**中，选择**CloudFormation**。

   1. 在**操作模式**下，选 **删除堆栈**。

   1. 在**堆栈名称**中，如下所示输入变量语法。这是操作将删除的堆栈的名称。

   1. 选择**完成**以保存操作。

   1. 选择**保存**以保存管道。

   管道在保存时运行。