

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

# 教程：使用 AWS CloudFormation StackSets 部署操作创建管道
<a name="tutorials-stackset-deployment"></a>

在本教程中，您将使用 AWS CodePipeline 控制台创建带有部署操作的管道，用于创建堆栈集和创建堆栈实例。管道运行时，模板会创建堆栈集，还会创建和更新部署了堆栈集的实例。

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

有两种方法可以管理堆栈集的权限：自我管理的 IAM 角色和托 AWS管的 IAM 角色。本教程提供了自托管权限的示例。

要在中最有效地使用 Stackset CodePipeline，您应该清楚地了解其背后的概念 CloudFormation StackSets 及其工作原理。参见《*AWS CloudFormation 用户指南*》中的[StackSets 概念](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-concepts.html)。

**Topics**
+ [先决条件](#tutorials-stackset-deployment-prereq)
+ [步骤 1：上传示例 AWS CloudFormation 模板和参数文件](#tutorials-stackset-deployment-upload)
+ [步骤 2：创建管道](#tutorials-stackset-action-pipeline)
+ [步骤 3：查看初始部署](#tutorials-stackset-action-initial)
+ [步骤 4：添加动 CloudFormationStackInstances 作](#tutorials-stacksets-instances)
+ [步骤 5：查看部署的堆栈集资源](#tutorials-stacksets-view)
+ [第 6 步：更新您的堆栈集](#tutorials-stacksets-update)

## 先决条件
<a name="tutorials-stackset-deployment-prereq"></a>

对于堆栈集操作，您可以使用两个不同的账户：管理账户和目标账户。在管理员账户中创建堆栈集。在目标账户中创建属于堆栈集的单个堆栈。

**使用管理员账户创建管理员角色**
+ 按照[为堆栈集操作设置基本权限](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#stacksets-prereqs-accountsetup)中的说明进行操作。您的角色必须命名为 **`AWSCloudFormationStackSetAdministrationRole`**。

**在目标账户中创建服务角色**
+ 在信任管理员账户的目标账户中创建服务角色。按照[为堆栈集操作设置基本权限](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-prereqs-self-managed.html#stacksets-prereqs-accountsetup)中的说明进行操作。您的角色必须命名为 **`AWSCloudFormationStackSetExecutionRole`**。

## 步骤 1：上传示例 AWS CloudFormation 模板和参数文件
<a name="tutorials-stackset-deployment-upload"></a>

为您的堆栈集模板和参数文件创建源桶。下载示例 AWS CloudFormation 模板文件，设置参数文件，然后压缩文件，然后再上传到 S3 源存储桶。

**注意**  
即使唯一的源文件是模板，也要确保先压缩源文件，再上传到 S3 源桶。



**创建 S3 源桶**

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

1. 选择**创建存储桶**。

1. 在**桶名称**中，输入桶的名称。

   在**区域**中，选择要在其中创建管道的区域。请选择**创建存储桶**。

1. 创建存储桶后，系统会显示成功横幅。选择**转到存储桶详细信息**。

1. 在**属性**选项卡上，选择**版本控制**。选择**启用版本控制**，然后选择**保存**。

**创建 AWS CloudFormation 模板文件**

1. 下载以下示例模板文件，用于生成堆栈集的 CloudTrail 配置:[https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSCloudtrail.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSCloudtrail.yml).

1. 将该文件保存为 `template.yml`。

**创建 parameters.txt 文件**

1. 创建包含部署参数的文件。参数是您要在运行时在堆栈中更新的值。以下示例文件将更新堆栈集的模板参数，以启用日志验证和全局事件。

   ```
   [
     {
       "ParameterKey": "EnableLogFileValidation",
       "ParameterValue": "true"
     }, 
     {
       "ParameterKey": "IncludeGlobalEvents",
       "ParameterValue": "true"
     }
   ]
   ```

1. 将该文件保存为 `parameters.txt`。

**创建 accounts.txt 文件**

1. 创建包含账户（您要从中创建实例）的文件，如以下示例文件所示。

   ```
   [
       "111111222222","333333444444"
   ]
   ```

1. 将该文件保存为 `accounts.txt`。

**创建和上传源文件**

1. 将文件合并为单个 ZIP 文件。您的文件应该在您的 ZIP 文件中如下所示。

   ```
   template.yml
   parameters.txt
   accounts.txt
   ```

1. 将 ZIP 文件上传到 S3 桶。此文件是由 “创建**管道” 向导为中的部署操作创建**的源项目 CodePipeline。

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

在此部分中，您将使用以下操作创建管道：
+ 具有 S3 源操作的源阶段，其中源构件是您的模板文件和任何支持源文件。
+ 一个部署阶段，其中包含用于创建 CloudFormation 堆栈集的堆栈集部署操作。
+ 带有 CloudFormation 堆栈实例部署操作的部署阶段，用于在目标账户中创建堆栈和实例。

**使用 CloudFormationStackSet 操作创建管道**

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

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

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

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

1. 在本教程中，为**管道类型**选择 **V1**。也可以选择 **V2**；但请注意，不同管道类型具有不同的特性和价格。有关更多信息，请参阅 [管道类型](pipeline-types.md)。

1. 在**服务角色**中，选择**新建服务角色** CodePipeline 以允许在 IAM 中创建服务角色。

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

   选择**下一步**。

1. 在**步骤 3：添加源阶段**页面上，在**源提供程序**中，选择 **Amazon S3**。

1. 在**桶**中，输入您在本教程中创建的 S3 源桶，例如 `BucketName`。在 **S3 对象键**中，输入 ZIP 文件的文件路径和文件名，例如 `MyFiles.zip`。

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

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

   选择**下一步**。

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

   选择**下一步**。

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

   1. 在**部署提供程序**中，选择 **AWS CloudFormation 堆栈集**。

   1. 在**堆栈集名称**中，为堆栈集输入名称。这是模板将创建的堆栈集的名称。
**注意**  
记下您的堆栈集名称。当您将第二个 StackSets 部署操作添加到管道中时，您将使用它。

   1. 在**模板路径**中，输入构件名称和上传模板文件的文件路径。例如，使用默认源构件名称 `SourceArtifact` 输入以下内容。

      ```
      SourceArtifact::template.yml
      ```

   1. 在**部署目标**中，输入构件名称和上传账户文件的文件路径。例如，使用默认源构件名称 `SourceArtifact` 输入以下内容。

      ```
      SourceArtifact::accounts.txt
      ```

   1. 在**部署目标**中 AWS 区域，输入一个用于部署初始堆栈实例的区域，例如`us-east-1`。

   1. 展开**部署选项**。在**参数**中，输入构件名称和上传参数文件的文件路径。例如，使用默认源构件名称 `SourceArtifact` 输入以下内容。

      ```
      SourceArtifact::parameters.txt
      ```

      要将参数作为文字输入而不是文件路径，请输入以下内容：

      ```
      ParameterKey=EnableLogFileValidation,ParameterValue=true
      ParameterKey=IncludeGlobalEvents,ParameterValue=true
      ```

   1. 在**功能**中，选择 CAPABILITY\$1IAM 和 CAPABILITY\$1NAMED\$1IAM。

   1. 在**权限模式**中，选择 SELF\$1MANAGED。

   1. 在**失效容限百分比**中，输入 `20`。

   1. 在**最大并发百分比**中，输入 `25`。

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

   1. 在**步骤 7：审核**中，选择**创建管道**。将显示您的管道。

   1. 允许您的管道运行。

## 步骤 3：查看初始部署
<a name="tutorials-stackset-action-initial"></a>

查看初始部署的资源和状态。验证部署已成功创建堆栈集后，您可以将另一个操作添加到**部署**阶段。

**查看资源**

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

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

1. 选择对 CloudFormation 管道中**CloudFormationStackSet**操作的操作。您的堆栈集的模板、资源和事件显示在 CloudFormation 控制台中。

1. 在左侧导航面板中，选择**StackSets**。在列表中，选择新的堆栈集。

1. 选择**堆栈实例**选项卡。验证已在 us-east-1 区域中为您提供的每个账户创建了一个堆栈实例。验证每个堆栈实例的状态为 `CURRENT`。

## 步骤 4：添加动 CloudFormationStackInstances 作
<a name="tutorials-stacksets-instances"></a>

在管道中创建下一个操作 CloudFormation StackSets 以允许创建剩余堆栈实例。

**在管道中创建下一操作**

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

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

1. 选择以编辑管道。管道将在**编辑**模式下显示。

1. 在**部署**阶段上，选择**编辑**。

1. 在 **AWS CloudFormation 堆栈集**部署操作下，选择**添加操作组**。

1. 在**编辑操作**页面上，添加操作详细信息：

   1. 在**操作名称**中，为操作输入名称。

   1. 在**操作提供程序**中，选择 **AWS CloudFormation 堆栈实例**。

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

   1. 在**堆栈集名称**中，为堆栈集输入名称。这是您在第一个操作中提供的堆栈集的名称。

   1. 在**部署目标**中，输入构件名称和上传账户文件的文件路径。例如，使用默认源构件名称 `SourceArtifact` 输入以下内容。

      ```
      SourceArtifact::accounts.txt
      ```

   1. 在**部署目标**中 AWS 区域，输入用于部署剩余堆栈实例的区域，`eu-central-1`例如`us-east-2`和如下：

      ```
      us-east2, eu-central-1
      ```

   1. 在**失效容限百分比**中，输入 `20`。

   1. 在**最大并发百分比**中，输入 `25`。

   1. 选择**保存**。

   1. 手动发布更改。更新的管道将在“部署”阶段显示两个操作。

## 步骤 5：查看部署的堆栈集资源
<a name="tutorials-stacksets-view"></a>

查看堆栈集部署的资源和状态。

**查看资源**

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

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

1. 选择对 CloudFormation 管道中**`AWS CloudFormation Stack Instances`**操作的操作。您的堆栈集的模板、资源和事件显示在 CloudFormation 控制台中。

1. 在左侧导航面板中，选择**StackSets**。在列表中，选择您的堆栈集。

1. 选择**堆栈实例**选项卡。验证已在预期区域中创建或更新您提供的每个账户的所有剩余堆栈实例。验证每个堆栈实例的状态为 `CURRENT`。

## 第 6 步：更新您的堆栈集
<a name="tutorials-stacksets-update"></a>

更新您的堆栈集并将更新部署到实例。在此示例中，您还将更改您指定进行更新的部署目标。不属于更新的实例将变为已过期状态。

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

1. 在**管道**下，选择您的管道，然后选择**编辑**。在**部署**阶段上，选择**编辑**。

1. 选择编辑管道中的 **AWS CloudFormation 堆栈集**操作。在**描述**中，使用堆栈集的新描述覆盖现有描述。

1. 选择编辑管道中的 **AWS CloudFormation 堆栈实例**操作。在**部署目标**中 AWS 区域，删除创建操作时输入的`us-east-2`值。

1. 保存更改。选择**发布更改**以运行管道。

1. 在 CloudFormation中打开您的操作。选择 “**StackSet 信息**” 选项卡。在**StackSet 描述**中，验证是否显示了新的描述。

1. 选择**堆栈实例**选项卡。在**状态**下，验证 us-east-2 中堆栈实例的状态为 `OUTDATED`。