

# 使用 StackSets 跨账户和区域管理堆栈
<a name="what-is-cfnstacksets"></a>

CloudFormation StackSets 让您能够在单个操作中跨多个账户和 AWS 区域区域创建、更新或删除堆栈，从而扩展了堆栈的功能。通过使用管理员账户，您可定义和管理 CloudFormation 模板，并以该模板为基础，跨指定的 AWS 区域在选定目标账户中预置堆栈。

![\[StackSet 是在模板中跨多个账户和区域部署的资源的集合。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/stack_set_conceptual_sv.png)


本节介绍如何开始使用 StackSet，解答有关 StackSet 创建、更新和删除以及故障排除的常见问题。

**Topics**
+ [StackSets 概念](stacksets-concepts.md)
+ [使用 CloudFormation StackSet 的先决条件](stacksets-prereqs.md)
+ [使用示例模板开始使用 StackSet。](stacksets-getting-started.md)
+ [创建具有自行管理权限的 CloudFormation StackSet](stacksets-getting-started-create-self-managed.md)
+ [创建具有服务托管权限的 CloudFormation StackSet](stacksets-orgs-associate-stackset-with-org.md)
+ [为 AWS Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)
+ [更新 CloudFormation StackSet](stacksets-update.md)
+ [将堆栈添加到 CloudFormation 堆栈集](stackinstances-create.md)
+ [覆盖 CloudFormation StackSet 中的堆栈参数值](stackinstances-override.md)
+ [从 CloudFormation StackSet 中删除堆栈](stackinstances-delete.md)
+ [删除 CloudFormation StackSet](stacksets-delete.md)
+ [使用目标账户门防止 StackSet 部署失败](stacksets-account-gating.md)
+ [为 CloudFormation StackSet 选择并发模式](concurrency-mode.md)
+ [对 CloudFormation StackSets 进行偏差检测](stacksets-drift.md)
+ [将堆栈导入 CloudFormation StackSet](stacksets-import.md)
+ [使用 CloudFormation StackSet 的最佳实践](stacksets-bestpractices.md)
+ [CloudFormation StackSet 示例模板](stacksets-sampletemplates.md)
+ [CloudFormation StackSets 故障排除](stacksets-troubleshooting.md)

# StackSets 概念
<a name="stacksets-concepts"></a>

以下术语和概念对您了解和使用 StackSets 非常有用。

**Topics**
+ [管理员账户和目标账户](#stacksets-concepts-accts)
+ [CloudFormation 堆栈集](#stacksets-concepts-stackset)
+ [StackSet 的权限模型](#stacksets-concepts-stackset-permission-models)
+ [堆栈实例](#stacksets-concepts-stackinstances)
+ [StackSet 操作](#stacksets-concepts-ops)
+ [StackSet 操作选项](#stackset-ops-options)
+ [标签](#stackset-concepts-tags)
+ [StackSets 状态代码](#stackset-status-codes)
+ [堆栈实例状态代码](#stack-instance-status-codes)

## 管理员账户和目标账户
<a name="stacksets-concepts-accts"></a>

*管理员账户*是您用来创建 StackSet 的 AWS 账户。对于具有服务托管权限的 StackSet，管理员账户是组织的管理账户或委派管理员账户。您可以登录到创建 StackSet 的 AWS 管理员账户来管理 StackSet。

*目标账户*是在其中创建、更新或删除 StackSet 中一个或多个堆栈的账户。先在管理员账户与目标账户之间设置信任关系，然后才能使用 StackSet 在目标账户中创建堆栈。

## CloudFormation 堆栈集
<a name="stacksets-concepts-stackset"></a>

*StackSet* 充当跨指定 AWS 账户 和区域部署的多个堆栈的容器。每个堆栈都基于同一 CloudFormation 模板，但您可以使用参数自定义单个堆栈。

在定义 StackSet 后，您可以在指定的目标账户和 AWS 区域中创建、更新或删除堆栈。创建、更新或删除堆栈时，您还可以指定操作首选项。例如，包括要执行操作的区域顺序、堆栈操作停止前的容错阈值以及并发执行堆栈操作的账户数。

StackSet 是一种区域性资源。如果在一个 AWS 区域中创建 StackSet，则只能在查看该区域时查看或更改它。

## StackSet 的权限模型
<a name="stacksets-concepts-stackset-permission-models"></a>

您可以使用*自行管理*权限或*服务托管*权限创建 StackSet。

使用*自行管理*权限时，您将创建 StackSets 需要的 IAM 角色来跨账户和区域进行部署。对于在您管理 StackSet 所用的账户与您将堆栈实例部署到的账户之间建立信任关系，这些角色必不可少。使用此权限模型，StackSets 可以部署到您有权创建 IAM 角色的任何 AWS 账户 中。

使用*服务托管* 权限时，您可以将堆栈实例部署到 AWS Organizations 管理的账户。使用此权限模型，您不必创建必要的 IAM 角色；StackSets 会代表您创建 IAM 角色。使用此模型，您还可以为将来添加到组织的账户开启自动部署。

AWS Organizations 与 CloudFormation 集成，可帮助您在扩展和增长 AWS 资源时集中管理和治理您的环境。
+ 管理账户 - 您用于创建组织的账户。有关更多信息，请参阅 [AWS Organizations 术语和概念](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html)。
+ 委派管理员 - 兼容的 AWS 服务可以将组织中的 AWS 成员账户注册为该服务中组织账户的管理员。有关更多信息，请参阅[可与 AWS Organizations 一起使用的 AWS 服务](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrate_services_list.html)。

有关创建和管理具有服务托管权限的 StackSet 的更多信息，请参阅以下主题：
+ [使用 AWS Organizations 为 StackSet 激活可信访问权限](stacksets-orgs-activate-trusted-access.md)
+ [注册委派管理员成员账户](stacksets-orgs-delegated-admin.md)
+ [创建具有服务托管权限的 CloudFormation StackSet](stacksets-orgs-associate-stackset-with-org.md)

## 堆栈实例
<a name="stacksets-concepts-stackinstances"></a>

*堆栈实例* 是对区域内的目标账户中的堆栈的引用。堆栈实例可在没有堆栈的情况下存在。例如，如果出于某个原因无法创建堆栈，则堆栈实例将显示堆栈创建失败的原因。一个堆栈实例仅与一个 StackSet 关联。

下图显示 StackSet、堆栈操作和堆栈之间的逻辑关系。更新 StackSet 时，所有账户和区域中*所有*关联的堆栈实例都会更新。

![\[StackSet 可以跨账户和区域创建、更新或删除堆栈实例和堆栈。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/stack_sets_operations_stacks_sv.png)


## StackSet 操作
<a name="stacksets-concepts-ops"></a>

您可以在 StackSet 上执行以下操作。

创建 StackSet  
创建新 StackSet 涉及指定用于创建堆栈的 CloudFormation 模板、指定要在其中创建堆栈的目标账户以及指定要在其中将堆栈部署到目标账户的 AWS 区域。StackSet 可确保将具有相同设置的相同堆栈资源，一致地部署到所选区域内的所有指定目标账户。

更新 StackSet  
更新 StackSet 时，将更改推送到 StackSet 中的堆栈。您可以通过下列方法之一更新 StackSet。您的模板更新始终会影响所有堆栈；您不能选择只更新 StackSet 中部分堆栈的模板，但不更新其他堆栈的模板。  
+ 更改模板中的现有设置或添加新资源，例如，更新特定服务的参数设置或添加新的 Amazon EC2 实例。
+ 将该模板替换为其他模板。
+ 跨现有或其他区域在现有或其他目标账户中添加堆栈。

删除 堆栈  
在删除堆栈时，您将从指定的区域的指定目标账户中，删除堆栈及其所有关联资源。您可以通过以下方法删除堆栈。  
+ 从某些目标账户中删除堆栈，同时使其他目标账户中的其他堆栈保持运行。
+ 从某些区域中删除堆栈，同时使其他区域中的堆栈保持运行。
+ 从 StackSet 中删除堆栈，但保存它们，以便通过选择**保留堆栈**选项来使其独立于 StackSet 继续运行。之后，您便可以管理 CloudFormation 中 StackSet 之外的保留堆栈。
+ 在准备删除整个 StackSet 时，先删除 StackSet 中的所有堆栈。

删除 StackSet  
StackSet 中没有堆栈实例时，才能删除它。

## StackSet 操作选项
<a name="stackset-ops-options"></a>

本节描述的选项可以控制时间和允许的失败次数，以便成功执行 StackSet 操作并防止丢失堆栈资源。

最大并发账户数  
利用此设置（适用于创建、更新和删除工作流），您可以指定在其中一次执行一项操作的目标账户的最大数量或百分比。较小的数量或百分比意味着一次在较少的目标账户中执行一项操作。按照 **Deployment order**（部署顺序）框中指定的顺序一次在一个区域中执行操作。例如，如果您将堆栈部署到两个区域内的 10 个目标账户，将 **Maximum concurrent accounts**（最大并发账户数）设置为 **50** 和 **By percentage**（按百分比），则会在移到下一个区域并开始部署到前 5 个目标账户之前，将堆栈部署到第一个区域中的 5 个账户，然后部署到第一个区域内的另外 5 个账户。  
当选择**按百分比**时，如果指定的百分比不表示您指定的账户的整数数量，则 CloudFormation 会向下舍入。例如，如果您将堆栈部署到 10 个目标账户，并将**最大并发账户数**设置为 **25** 和**按百分比**，则 CloudFormation 会从同时部署 2.5 个堆栈（这是不可能的）向下舍入到同时部署 2 个堆栈。  
请注意，此设置可让您指定操作数的*最大值*。对于大型部署，在某些情况下，并行运行的实际账户的数量可能由于服务限制而减少。  
**最大并发账户数**可能取决于**容错**值，而后者又取决于您的**并发模式**。如果您将**并发模式**设置为**严格容错**，则**最大并发账户数**最多可以比**容错**设置大 1。

并发模式  
此设置可在创建、更新和删除工作流时使用，让您能够选择并发级别在 StackSet 操作期间的行为。有关更多信息，请参阅 [为 CloudFormation StackSet 选择并发模式](concurrency-mode.md)。

容错  
利用此设置（适用于创建、更新和删除工作流时），您可以指定每个区域中可发生的堆栈操作失败的最大数量或百分比，一旦超出此值，CloudFormation 就会自动停止操作。较小的数量或百分比意味着在较少的堆栈上执行该操作，但您能够更快地开始对失败的操作进行故障排除。例如，如果您将在 3 个区域内的 10 个目标账户中更新 10 个堆栈，则将 **Failure tolerance (容错)** 设置为 **20** 和 **By percentage (按百分比)** 意味着一个区域中最多 2 个堆栈更新可以失败，此操作继续。如果同一区域中的第三个堆栈失败，则 CloudFormation 将停止此操作。如果堆栈在第一个区域中无法进行更新，则更新操作将在该区域中继续进行，然后移到下一个区域。如果两个堆栈无法在第二个区域中进行更新，则容错能力达到 20%；如果该区域中的第三个堆栈失败，则 CloudFormation 停止更新操作，并且不会转入后续区域。  
当选择**按百分比**时，如果指定的百分比不表示每个区域内的堆栈的整数数量，则 CloudFormation 会向下舍入。例如，如果您将堆栈部署到 3 个区域中的 10 个目标账户，并且将**容错**设置为 **25** 和**按百分比**，则 CloudFormation 会从每个区域的 2.5 个堆栈的容错能力（这是不可能的）向下舍入到每个区域的 2 个堆栈的容错能力。

保留堆栈  
利用此设置（适用于删除堆栈工作流），您可以使堆栈及其资源继续运行，甚至在从 StackSet 中删除堆栈后也是如此。保留堆栈时，CloudFormation 会将堆栈按原样保留在各自的账户和区域中。这会取消堆栈与 StackSet 的关联，但将保存堆栈及其资源。删除堆栈操作完成后，您可在创建堆栈的目标账户（而不是管理员账户）中管理 CloudFormation 中的保留堆栈。

区域并发  
此设置可在创建、更新和删除工作流时使用，用于选择如何将 StackSets 部署到区域中。  
*顺序* - 只要区域的部署失败次数不超过指定的容错能力，就按照区域 **Deployment order**（部署顺序）框中指定的顺序，一次将 StackSets 操作部署到一个区域。顺序部署是默认选项。  
*并行* – 只要区域的部署失败次数不超过指定的容错值，就将 StackSets 操作同时部署到所有指定区域。

## 标签
<a name="stackset-concepts-tags"></a>

您可以通过指定键/值对在 StackSet 创建和更新操作期间添加标签。标签对于针对账单和成本分配来分类和筛选 StackSet 资源非常有用。有关如何在 AWS 中使用标签的更多信息，请参阅*《AWS 账单与成本管理 User Guide》*中的 [Organizing and tracking costs using AWS cost allocation tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。在指定键值对后，选择 **\$1** 以保存标签。您可以通过选择标签右侧的红色 **X** 来删除不再使用的标签。

您应用于 StackSet 的标签将应用于所有堆栈以及由您的堆栈创建的资源。您还可以在 CloudFormation 中的仅堆栈级别添加标签；但这些标签可能不会显示在 StackSets 中。

尽管 StackSets 目前未添加任何系统定义的标签，但您不应使用字符串 `aws:` 作为任何标签的键名称的开头。

## StackSets 状态代码
<a name="stackset-status-codes"></a>

CloudFormation StackSets 会为 StackSet 操作生成状态代码。

下表描述了 StackSet 操作的状态代码。

`RUNNING`  
操作目前正在进行中。

`SUCCEEDED`  
操作已完成，未超出操作的容错能力。

`FAILED`  
无法完成操作的堆栈的数量超出了用户定义的容错能力。您为操作设置的容错能力值将在堆栈创建和更新操作期间应用于每个区域。如果区域内的失败堆栈数超出了容错能力，则该区域中的操作的状态将更改为 `FAILED`。整个操作的状态也将设置为 `FAILED`，并且 CloudFormation 会在任何剩余区域中取消该操作。

`QUEUED`  
[`Service-managed permissions`] 对于需要一系列操作的自动部署，操作将排队等待执行。例如：  
+ 将账户从一个组织部门 (OU) `OU1` 移动到另一个组织部门 `OU2` 会触发自动部署。StackSets 运行删除操作，从目标区域中的目标 `OU1` 账户删除堆栈实例，并排队一个创建操作，用于将堆栈实例添加到目标区域中的目标 `OU2` 账户。
+ 将账户 `AccountA` 添加到 OU 会触发自动部署。StackSets 运行创建操作，将堆栈实例添加到目标区域中的 `AccountA`。如果在此创建操作运行时，您将另一个账户 `AccountB` 添加到 OU 中，StackSets 将排队第二个创建操作。第一个创建操作完成后，StackSets 运行第二个创建操作，将堆栈实例添加到目标区域中的 `AccountB`。

`STOPPING`  
根据用户请求，正在停止该操作。

`STOPPED`  
根据用户请求，已停止该操作。

## 堆栈实例状态代码
<a name="stack-instance-status-codes"></a>

CloudFormation StackSets 为堆栈实例生成状态代码。

下表描述了 StackSets 内堆栈实例的状态代码。

`CURRENT`  
堆栈与 StackSet 的最新状态保持一致。

`OUTDATED`  
如果存在下列原因之一，堆栈无法与 StackSet 的最新状态保持一致。  
+ 关联堆栈上的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackSet.html) 或 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html) 操作失败。
+ 堆栈是失败的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackSet.html) 或 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html) 操作的一部分，或在创建或更新堆栈前已停止。

`INOPERABLE`  
[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeleteStackInstances.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeleteStackInstances.html) 操作已失败，并且堆栈处于不稳定状态。将从进一步的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html) 操作中排除处于此状态的堆栈。您可能需要执行 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeleteStackInstances.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeleteStackInstances.html) 操作，同时将 `RetainStacks` 设置为 `true`，以删除堆栈实例，然后手动删除堆栈。

`CANCELLED`  
指定账户和区域中的操作已被取消。发生此情况可能是因为用户已停止 StackSet 操作，或者因为已超出 StackSet 操作的容错能力。

`FAILED`  
指定账户和区域中的操作失败。如果 StackSet 操作在一个区域内足够数量的账户中失败，则可能会超出整个 StackSet 操作的容错能力。

`FAILED_IMPORT`  
在指定账户和区域中导入堆栈实例失败，并且堆栈处于不稳定状态。修复导致失败的问题后，可以重试导入操作。如果在一个区域中，足够数量的 StackSet 操作在足够数量的账户中失败，则可能是超出了整个 StackSet 操作的容错能力。

`PENDING`  
指定账户和区域中的操作尚未开始。

`RUNNING`  
指定账户和区域中的操作当前正在进行中。

`SKIPPED_SUSPENDED_ACCOUNT`  
指定账户和区域中的操作已被跳过，因为操作时该账户已被暂停。

`SUCCEEDED`  
指定账户和区域中的操作已成功完成。

# 使用 CloudFormation StackSet 的先决条件
<a name="stacksets-prereqs"></a>

StackSets 扩展了堆栈的功能，因此您可以在一次操作中跨多个账户和区域创建、更新或删除堆栈。

由于 StackSet 会跨多个账户执行堆栈操作，您需要具有在 AWS 账户中定义的必要权限，然后才能创建第一个 StackSet。

您可以使用*自行管理*权限或*服务托管*权限管理 StackSets。
+ 对于*自行管理*的 StackSets，必须在每个目标账户和 AWS 区域中创建和管理 IAM 角色。有关更多信息，请参阅 [授予自行管理的权限](stacksets-prereqs-self-managed.md)。
+ 对于*服务托管*的 StackSets，则无需在每个账户中手动创建和管理 IAM 角色，AWS 为您处理角色的创建和权限。有关更多信息，请参阅 [激活可信访问权限](stacksets-orgs-activate-trusted-access.md)。

**Topics**
+ [准备在默认禁用的 AWS 区域执行 StackSet 操作](stacksets-opt-in-regions.md)
+ [授予自行管理的权限](stacksets-prereqs-self-managed.md)
+ [使用 AWS Organizations 为 StackSet 激活可信访问权限](stacksets-orgs-activate-trusted-access.md)

# 准备在默认禁用的 AWS 区域执行 StackSet 操作
<a name="stacksets-opt-in-regions"></a>

2019 年 3 月 20 日之后推出的 AWS 区域 默认处于禁用状态，如亚太地区（香港）。您必须先为您的账户启用这些区域，然后才能使用它们。有关更多信息，请参阅*《AWS 账户管理 参考指南》*中的[启用或禁用账户中的 AWS 区域](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html)。

要在默认为已被禁用的区域中在 StackSet 的管理员账户（如果使用自行管理的权限）或组织的管理账户（如果使用服务托管权限）创建 StackSet，必须首先为管理员账户或管理账户启用该区域。

要使 CloudFormation 成功创建或更新堆栈实例：
+ 目标账户必须位于当前已为该目标账户启用的区域中。
+ StackSet 的管理员账户或组织的管理账户必须已经启用了与目标账户相同的区域。

**重要**  
请注意，在 StackSet 操作期间，除了所涉及的 StackSet 和 StackSet 实例外，管理员账户和目标账户还会交换有关账户本身的元数据。  
此外，如果您禁用的区域包含 StackSet 实例所在的账户，您需要自行删除任何此类实例或资源（根据需要）。此外，请注意，关于禁用区域中目标账户的元数据将保留在管理员账户中。

# 授予自行管理的权限
<a name="stacksets-prereqs-self-managed"></a>

本主题提供有关如何创建 StackSets 所需的 IAM 服务角色，以通过*自行管理*权限跨账户和 AWS 区域 进行部署的说明。对于在您管理 StackSet 所用的账户与您将堆栈实例部署到的账户之间建立信任关系，这些角色必不可少。使用此权限模型，StackSets 可以部署到您有权创建 IAM 角色的任何 AWS 账户 中。

要使用*服务托管*权限，请参阅 [激活可信访问权限](stacksets-orgs-activate-trusted-access.md)。

**Topics**
+ [自行管理权限概述](#prereqs-self-managed-permissions)
+ [授予管理员账户的所有用户管理所有目标账户中堆栈的权限](#stacksets-prereqs-accountsetup)
+ [为 StackSet 操作设置高级权限选项](#stacksets-prereqs-advanced-perms)
+ [设置全局键以缓解混淆代理问题](#confused-deputy-mitigation)

## 自行管理权限概述
<a name="prereqs-self-managed-permissions"></a>

必须先在各个账户中创建 IAM 服务角色，然后才能创建具有自行管理权限的 StackSet。

基本步骤如下：

1. 确定哪个 AWS 账户是*管理员账户*。

   StackSet 是在该管理员账户中创建的。*目标账户*是在其中创建属于 StackSet 的各个堆栈的账户。

1. 确定您要如何为 StackSet 构建权限。

   利用最简单的（也是最宽松的）权限配置，您可以允许管理员账户中的*所有*用户和组创建和更新通过该账户管理的*所有* StackSet。如果您需要更精细的控制，则可设置权限以指定：
   + 哪些用户和组可在哪些目标账户中执行 StackSet 操作。
   + 用户和组可将哪些资源包含在 StackSet 中。
   + 特定用户和组可执行哪些 StackSet 操作。

1. 在管理员账户和目标账户中创建所需的 IAM 服务角色以定义所需的权限。

   具体而言，所需的两个角色是：
   + **AWSCloudFormationStackSetAdministrationRole** – 该角色将部署到管理员账户。
   + **AWSCloudFormationStackSetExecutionRole** – 该角色将部署到创建堆栈实例的所有账户。

## 授予管理员账户的所有用户管理所有目标账户中堆栈的权限
<a name="stacksets-prereqs-accountsetup"></a>

本节将介绍如何设置权限，以便管理员账户的所有用户和组在所有目标账户中执行 StackSet 操作。本节会指导您在管理员和目标账户中创建所需的 IAM 服务角色。而后，管理员账户中的任何人都可以创建、更新或删除任何目标账户中的任何堆栈。

如果以这种方式构建权限，用户在创建或更新 StackSet 时便不会传递管理员角色。

![\[在建立信任关系后，管理员账户中的任何用户都可以在目标账户中创建任何 StackSet。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/stacksets_perms_master_target.png)


------
#### [ Administrator account ]

在管理员账户中，创建一个名为 **AWSCloudFormationStackSetAdministrationRole** 的 IAM 角色。

为此，您可以通过 CloudFormation 模板创建堆栈，网址为 [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetAdministrationRole.yml)。

**Example 权限策略示例**  
前述模板创建的管理员角色包括以下权限策略：    
****  

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

**Example 示例信任策略 1**  
前述模板还包括以下信任策略，该策略授予使用管理员角色的服务权限以及附加到该角色的权限。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudformation.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

**Example 示例信任策略 2**  
要将堆栈实例部署到位于默认情况下禁用的区域中的目标账户，还需要包含该区域的区域服务主体。默认情况下禁用的每个区域都有自己的区域服务主体。  
以下示例信任策略授予在亚太地区（香港）区域 (`ap-east-1`) 使用管理员角色的服务权限，该区域在默认情况下禁用。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
            "cloudformation.amazonaws.com",
            "cloudformation.ap-east-1.amazonaws.com"
         ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```
有关更多信息，请参阅 [准备在默认禁用的 AWS 区域执行 StackSet 操作](stacksets-opt-in-regions.md)。有关区域代码的列表，请参阅*《AWS 一般参考 Guide》*中的 [Regional endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)。

------
#### [ Target accounts ]

在每个目标账户中，创建一个信任管理员账户的名为 **AWSCloudFormationStackSetExecutionRole** 的服务角色。该角色必须具有该确切名称。为此，您可以通过 CloudFormation 模板创建堆栈，网址为 [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetExecutionRole.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AWSCloudFormationStackSetExecutionRole.yml)。当您使用此模板时，系统将提示您提供目标账户必须与其具有信任关系的管理员账户的账户 ID。

**重要**  
请注意，此模板将向管理员授予访问权限。在您使用此模板创建目标账户执行角色之后，您必须将策略声明中的权限的范围限定为您正使用堆栈集创建的资源的类型。

目标账户服务角色需要权限才能执行 CloudFormation 模板中指定的任何操作。例如，如果您的模板正在创建 S3 存储桶，则您需要权限才能为 S3 创建新对象。目标账户始终需要完整的 CloudFormation 权限，其中包含创建、更新、删除和描述堆栈的权限。

**Example 权限策略示例 1**  
此模板创建的角色将在目标账户上启用以下策略。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*"
    }
  ]
}
```

**Example 权限策略示例 2**  
以下示例显示了一个包含让堆栈集运行所需的*最低* 权限的策略声明。要在使用 CloudFormation 以外的服务资源的目标账户中创建堆栈，必须将这些服务操作和资源添加到每个目标账户的 **AWSCloudFormationStackSetExecutionRole** 策略声明中。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
         "cloudformation:*"
      ],
      "Resource": "*"
    }
  ]
}
```

**Example 示例信任策略**  
以下信任关系是由此模板创建的。管理员账户的 ID 显示为 *admin\$1account\$1id*。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": "sts:AssumeRole"
        }
    ]
}
```
您可以配置现有目标账户执行角色的信任关系以信任管理员账户中的特定角色。如果您在管理员账户中删除此角色并创建一个新角色来替代它，则您必须使用新的管理员账户角色 (由上一示例中的 *admin\$1account\$1id* 表示) 配置您的目标账户信任关系。

------

## 为 StackSet 操作设置高级权限选项
<a name="stacksets-prereqs-advanced-perms"></a>

如果您需要更精细地控制用户和组通过单个管理员账户创建的 StackSet，您可以使用 IAM 角色指定：
+ 哪些用户和组可在哪些目标账户中执行 StackSet 操作。
+ 用户和组可将哪些资源包含在 StackSet 中。
+ 特定用户和组可执行哪些 StackSet 操作。

### 控制哪些用户可以在特定目标账户中执行 StackSet 操作
<a name="stacksets-prereqs-multiadmin"></a>

使用自定义管理员角色，控制哪些用户和组可以在哪些目标账户中执行 StackSet 操作。您可能希望控制管理员账户的哪些用户可以在哪些目标账户中执行 StackSet 操作。为此，您可以在每个目标账户和特定的自定义管理角色之间创建信任关系，而不是在管理员账户中创建 **AWSCloudFormationStackSetAdministrationRole** 服务角色。然后，激活特定用户和组以在特定目标账户中执行 StackSet 操作时使用自定义管理角色。

例如，您可以在管理员账户中创建角色 A 和角色 B。您可以授予角色 A 访问目标账户 1 至账户 8 的权限。您可以授予角色 B 访问目标账户 9 至账户 16 的权限。

![\[在自定义管理员角色和目标账户之间建立信任关系后，将允许用户创建 StackSet。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/stacksets_perms_admin_target.png)


设置必要的权限包括定义自定义管理员角色、为目标账户创建服务角色并授予用户在执行 StackSet 操作时传递自定义管理员角色的权限。

一般而言，下面是具有必要权限后的工作原理：在创建 StackSet 时，用户必须指定自定义管理员角色。用户必须具有将角色传递到 CloudFormation 的权限。此外，自定义管理员角色还必须与为 StackSet 指定的目标账户具有信任关系。CloudFormation 会创建 StackSet 并将自定义管理员角色与其关联。在更新 StackSet 时，用户必须明确指定自定义管理员角色，即使它与之前用于此 StackSet 的自定义管理员角色相同，也是如此。CloudFormation 根据上述要求使用该角色来更新堆栈。

------
#### [ Administrator account ]

**Example 权限策略示例**  
对于每个 StackSet，创建一个自定义管理员角色，该角色具有担任目标账户执行角色的权限。  
每个目标账户中的目标账户执行角色名称必须相同。如果角色名称为 **AWSCloudFormationStackSetExecutionRole**，StackSets 会在创建 StackSet 时会自动使用该名称。如果指定自定义角色名称，则用户在创建 StackSet 时必须提供执行角色名称。  
使用以下权限策略，创建具有自定义名称的 [IAM 服务角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)：在以下示例中，*custom\$1execution\$1role* 是指目标账户中的执行角色。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/custom_execution_role"
            ],
            "Effect": "Allow"
        }
    ]
}
```
要在单个语句中指定多个账户，请使用逗号将其隔开。  

```
"Resource": [
  "arn:aws:iam::target_account_id_1:role/custom_execution_role", 
  "arn:aws:iam::target_account_id_2:role/custom_execution_role"
]
```
您可以通过使用通配符 (\$1) 而不是账户 ID，指定所有目标账户。  

```
"Resource": [
  "arn:aws:iam::*:role/custom_execution_role"
]
```

**Example 示例信任策略 1**  
您必须为服务角色提供信任策略，从而定义哪些 IAM 主体可以担任该角色。    
****  

```
{ 
  "Version":"2012-10-17",		 	 	  
  "Statement": [ 
    { 
      "Effect": "Allow", 
      "Principal": { 
        "Service": "cloudformation.amazonaws.com" 
      }, 
      "Action": "sts:AssumeRole" 
    } 
  ] 
}
```

**Example 示例信任策略 2**  
要将堆栈实例部署到位于默认情况下禁用的区域中的目标账户，还需要包含该区域的区域服务主体。默认情况下禁用的每个区域都有自己的区域服务主体。  
以下示例信任策略授予在亚太地区（香港）区域 (`ap-east-1`) 使用管理员角色的服务权限，该区域在默认情况下禁用。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
            "cloudformation.amazonaws.com",
            "cloudformation.ap-east-1.amazonaws.com"
         ]
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```
有关更多信息，请参阅 [准备在默认禁用的 AWS 区域执行 StackSet 操作](stacksets-opt-in-regions.md)。有关区域代码列表，请参阅《AWS General Reference Guide**》中的 [Regional endpoints](https://docs.aws.amazon.com/general/latest/gr/rande.html#regional-endpoints)。

**Example 示例传递角色策略**  
您还需要为 IAM 用户提供 IAM 权限策略，允许该用户在执行 StackSet 操作时传递自定义管理员角色。有关更多信息，请参阅[向用户授予将角色传递给 AWS 服务的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。  
在以下示例中，*customized\$1admin\$1role* 是指用户需要传递的管理员角色。    
****  

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

------
#### [ Target accounts ]

在每个目标账户中，创建一个服务角色，该角色信任要用于此账户的自定义管理员角色。

目标账户角色需要权限才能执行 CloudFormation 模板中指定的任何操作。例如，如果您的模板正在创建 S3 存储桶，则您需要在 S3 中创建新对象的权限。目标账户始终需要完整的 CloudFormation 权限，其中包含创建、更新、删除和描述堆栈的权限。

每个目标账户中的目标账户角色名称必须相同。如果角色名称为 **AWSCloudFormationStackSetExecutionRole**，StackSets 会在创建 StackSet 时会自动使用该名称。如果指定自定义角色名称，则用户在创建 StackSet 时必须提供执行角色名称。

**Example 权限策略示例**  
以下示例显示了一个包含让堆栈集运行所需的*最低* 权限的策略声明。要在使用非 CloudFormation 服务资源的目标账户中创建堆栈，必须将这些服务操作和资源添加到权限策略。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:*"
      ],
      "Resource": "*"
    }
  ]
}
```

**Example 示例信任策略**  
在创建角色以定义信任关系时，必须提供以下信任策略：    
****  

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

------

### 控制用户可以在特定 StackSet 中包含哪些资源
<a name="stacksets-prereqs-executionrole"></a>

使用自定义执行角色可以控制用户和组可将哪些堆栈资源包含在 StackSet 中。例如，您可能希望设置一个组，该组只能将与 Amazon S3 相关的资源包含在他们创建的 StackSet 中，而另一个团队只能包含 DynamoDB 资源。为此，您可以在每个组的自定义管理员角色与每组资源的自定义执行角色之间建立信任关系。自定义执行角色定义可将哪些堆栈资源包含在 StackSet 中。自定义管理员角色位于管理员账户中，而自定义执行角色位于每个目标账户（要在其中使用定义的资源创建 StackSet 的账户）中。然后，激活特定用户和组以在执行 StackSet 操作时使用自定义管理角色。

例如，您可以在管理员账户中创建自定义管理员角色 A、B 和 C。有权使用角色 A 的用户和组可以创建相应的 StackSet，这些 StackSet 包含自定义执行角色 X 中专门列出的堆栈资源，而不包含角色 Y 或 Z 中的堆栈资源或任何执行角色中未包含的资源。

![\[在自定义管理员角色和目标账户中的自定义执行角色之间建立信任关系后，将允许用户创建 StackSet。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/stacksets_perms_admin_execution.png)


在更新 StackSet 时，用户必须明确指定自定义管理员角色，即使它与之前用于此 StackSet 的自定义管理员角色相同，也是如此。只要用户具有对该 StackSet 执行操作的权限，CloudFormation 就会使用指定的自定义管理员角色执行更新。

同样，用户还可以指定自定义的执行角色。如果用户指定了自定义执行角色，CloudFormation 将根据上述要求使用该角色来更新堆栈。如果用户未指定自定义执行角色，CloudFormation 将使用以前与 StackSet 关联的自定义执行角色来执行更新，只要用户具有对该 StackSet 执行操作的权限。

------
#### [ Administrator account ]

在管理员账户中创建自定义管理员角色，如 [控制哪些用户可以在特定目标账户中执行 StackSet 操作](#stacksets-prereqs-multiadmin) 中所述。包含自定义管理员角色和希望该角色使用的自定义执行角色之间的信任关系。

**Example 权限策略示例**  
以下示例是针对为目标账户定义的 **AWSCloudFormationStackSetExecutionRole** 以及自定义执行角色的权限策略。    
****  

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

------
#### [ Target accounts ]

在要在其中创建 StackSet 的目标账户中，创建一个自定义的执行角色，该角色授予对您要用户和组能够将其包含在 StackSet 中的服务和资源的权限。

**Example 权限策略示例**  
以下示例提供了 StackSet 的最小权限以及创建 Amazon DynamoDB 表的权限。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "cloudformation:*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "dynamoDb:createTable"
      ],
      "Resource": "*"
    }
  ]
}
```

**Example 示例信任策略**  
在创建角色以定义信任关系时，必须提供以下信任策略：    
****  

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

------

### 为特定 StackSet 操作设置权限
<a name="stacksets-prereqs-iam-actions"></a>

此外，您可以为能够执行特定的 StackSet 操作（例如，创建、更新或删除 StackSet 或堆栈实例）的用户和组设置权限。有关更多信息，请参阅*《服务授权参考》*中的 [CloudFormation 的操作、资源和条件键](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awscloudformation.html)。

## 设置全局键以缓解混淆代理问题
<a name="confused-deputy-mitigation"></a>

混淆代理问题是一个安全性问题，即不具有某操作执行权限的实体可能会迫使具有更高权限的实体执行该操作。在 AWS 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*) 调用另一项服务（*所谓的服务*)时，可能会发生跨服务模拟。可以操纵调用服务以使用其权限对另一个客户的资源进行操作，否则该服务不应有访问权限。为了防止这种情况，AWS 提供可帮助您保护所有服务的服务委托人数据的工具，这些服务委托人有权限访问账户中的资源。

建议在资源策略中使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，以限制 CloudFormation StackSets 为其他服务提供的资源访问权限。如果使用两个全局条件上下文键，在同一策略语句中使用时，`aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户必须使用相同的账户 ID。

防范混淆代理问题最有效的方法是使用 `aws:SourceArn` 全局条件上下文键和资源的完整 ARN。如果不知道资源的完整 ARN，或者正在指定多个资源，请针对 ARN 未知部分使用带有通配符（`*`）的 `aws:SourceArn` 全局上下文条件键。例如 `arn:aws:cloudformation::123456789012:*`。请尽可能使用 `aws:SourceArn`，因为它更具体。仅当无法确定正确的 ARN 或 ARN 模式时使用 `aws:SourceAccount`。

当 StackSets 在**管理员**账户中担任**管理**角色时，StackSets 会填充**管理员**账户 ID 和 StackSets Amazon 资源名称（ARN）。因此，您可以在信任关系中为[全局键](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) `aws:SourceAccount` 和 `aws:SourceArn` 定义条件，以防止[混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。以下示例演示如何使用 StackSets 中的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键来防范混淆代理问题。

------
#### [ Administrator account ]

**Example `aws:SourceAccount` 和 `aws:SourceArn` 的全局键示例**  
使用 StackSets 时，请在 **AWSCloudFormationStackSetAdministrationRole** 信任策略中定义全局键 `aws:SourceAccount` 和 `aws:SourceArn` 以防出现混淆代理问题。    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudformation.amazonaws.com"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:stackset/*"
        }
      }
    }
  ]
}
```

**Example StackSets ARN**  
指定关联的 StackSets ARN 以进行更精细的控制。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudformation.amazonaws.com"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "aws:SourceAccount": "111122223333",
                    "aws:SourceArn": [
                        "arn:aws:cloudformation:STACKSETS-REGION:111122223333:stackset/STACK-SET-ID-1",
                        "arn:aws:cloudformation:STACKSETS-REGION:111122223333:stackset/STACK-SET-ID-2"
                    ]
                }
            }
        }
    ]
}
```

------

# 使用 AWS Organizations 为 StackSet 激活可信访问权限
<a name="stacksets-orgs-activate-trusted-access"></a>

本主题提供有关如何使用 AWS Organizations 激活 StackSets 所需的可信访问，以通过*服务托管*权限跨账户和 AWS 区域 进行部署的说明。要使用*自行管理*权限，请参阅 [授予自行管理的权限](stacksets-prereqs-self-managed.md)。

在创建具有服务托管权限的 StackSet 之前，您必须先完成以下任务：
+ 在 AWS Organizations 中[启用所有功能](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_support-all-features.html)。仅启用了整合账单功能时，您无法创建具有服务托管权限的 StackSet。
+ 激活 AWS Organizations 的可信访问权限。此操作允许 CloudFormation 在管理帐户中创建服务关联角色。激活可信访问权限后，当您创建具有服务管理权限的 StackSet 时，CloudFormation 会在目标（成员）账户中创建必要的服务关联角色和名为 `stacksets-exec-*` 的服务角色。

  激活可信访问权限后，管理账户和委派管理员账户可以为组织创建和管理服务托管 StackSet。

要激活可信访问权限，您必须是管理账户的管理员用户。*管理员用户* 是对您的 AWS 账户拥有完全权限的用户。有关更多信息，请参阅*《AWS 账户管理 参考指南》*中的[创建管理员用户](https://docs.aws.amazon.com/accounts/latest/reference/getting-started-step4.html)。有关保护管理账户安全的建议，请参阅*《AWS Organizations 用户指南》*中的[管理账户最佳实践](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html)。

**激活可信访问权限**

1. 以管理账户的管理员身份登录 AWS，并通过 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation) 打开 CloudFormation 控制台。

1. 从导航窗格中，选择 **StackSets**。如果停用可信访问权限，则会显示一个横幅，提示您激活可信访问权限。  
![\[激活可信访问权限横幅。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/console-stacksets-enable-trusted-access-from-stacksets-list-new.png)

1. 选择**激活可信访问权限**。

   显示以下横幅即表明可信访问权限已成功激活。  
![\[可信访问权限已成功激活横幅。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/console-stackset-trusted-access-enabled-banner-new.png)
**注意**  
“激活组织访问权限”与“启用组织访问权限”相同，“停用组织访问权限”与“禁用组织访问权限”相同。这些术语已根据营销指南进行更新。

**停用可信访问权限**  
请参阅《AWS Organizations 用户指南》** 中的 [CloudFormation StackSets 和 AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-cloudformation.html)。

必须先注销所有委派管理员，然后才能停用 AWS Organizations 的可信访问权限。有关更多信息，请参阅 [注册委派管理员](stacksets-orgs-delegated-admin.md)。

**注意**  
有关如何使用 API 操作而不是控制台来激活或停用可信访问权限的信息，请参阅：  
[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ActivateOrganizationsAccess.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ActivateOrganizationsAccess.html)
[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeactivateOrganizationsAccess.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeactivateOrganizationsAccess.html)
[https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeOrganizationsAccess.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DescribeOrganizationsAccess.html)

## 服务关联角色
<a name="stacksets-orgs-service-linked-roles"></a>

管理账户使用 **AWSServiceRoleForCloudFormationStackSetsOrgAdmin** 服务相关角色。只有在停用了 AWS Organizations 的可信访问权限时，您才能修改或删除此角色。

各目标账户使用 **awsServiceRoleformationsStacksetsorgMember** 服务相关角色。只有在满足以下两个条件时，您才能修改或删除此角色：停用了 AWS Organizations 的可信访问权限时，或者从目标组织或组织部门（OU）中删除了账户。

有关更多信息，请参阅*《AWS Organizations 用户指南》*中的 [CloudFormation StackSets 和 AWS Organizations](https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-cloudformation.html)。

# 注册委派管理员成员账户
<a name="stacksets-orgs-delegated-admin"></a>

除了组织的管理账户，具有委派管理员权限的成员账户也可以为组织创建和管理具有服务托管权限的 StackSet。具有服务托管权限的 StackSet 是在管理账户中创建的，包括由委派管理员创建的 StackSet。要注册为组织的委派管理员，您的成员账户必须在组织中。有关加入组织的更多信息，请参阅[邀请 AWS 账户加入组织](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_accounts_invites.html)。

您的组织一次最多可以有五个注册的委派管理员。委派管理员可以选择部署到组织中的所有账户或部署到特定 OU。必须先激活 AWS Organizations 的可信访问权限，然后才能将委派管理员部署到 Organizations 托管的账户。有关更多信息，请参阅 [使用 AWS Organizations 为 StackSet 激活可信访问权限](stacksets-orgs-activate-trusted-access.md)。

**重要**  
请注意以下事项：  
委派管理员具有部署到组织中的账户的完全权限。管理账户不能限制委派管理员部署到特定 OU 或执行特定 StackSet 操作的权限。
确保您的委派管理员拥有 `organizations:ListDelegatedAdministrators` 权限，以避免任何潜在错误。

您可以在以下区域为组织注册委派管理员：美国东部（俄亥俄州）、美国东部（弗吉尼亚州北部）、美国西部（北加利福尼亚）、美国西部（俄勒冈州）、亚太地区（孟买）、亚太地区（首尔）、亚太地区（新加坡）、亚太地区（悉尼）、亚太地区（东京）、加拿大（中部）、欧洲地区（法兰克福）、欧洲地区（爱尔兰）、欧洲地区（伦敦）、欧洲地区（巴黎）、欧洲地区（斯德哥尔摩）、以色列（特拉维夫）、南美洲（圣保罗）、AWS GovCloud（美国东部）和 AWS GovCloud（美国西部）。

[CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)、[AWS CLI](https://aws.amazon.com/cli/) 或 [AWS 开发工具包](https://aws.amazon.com/developer/tools/)可用于注册和取消注册委派管理员。

## 要注册委派管理员（控制台），请执行以下操作：
<a name="stacksets-orgs-register-delegated-admin-console"></a>

1. 以管理账户的管理员身份登录 AWS，并通过 [https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/) 打开 CloudFormation 控制台。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **Delegated administrators**（委派管理员）下，选择 **Register delegated administrator**（注册委派管理员）。

1. 在 **Register delegated administrator**（注册委派管理员）对话框中，选择 **Register delegated administrator**（注册委派管理员）。

   成功消息表示成员账户已成功注册为委派管理员。

## 要取消注册委派管理员（控制台），请执行以下操作：
<a name="stacksets-orgs-deregister-delegated-admin-console"></a>

1. 以管理账户的管理员身份登录 AWS，并通过 [https://console.aws.amazon.com/](https://console.aws.amazon.com/) 打开 CloudFormation 控制台。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **Delegated administrators**（委派管理员）下，选择要取消注册的账户，然后选择 **Deregister**（取消注册）。

   成功消息表示成员账户的委派管理员身份已成功取消注册。

   您可以随时再次注册此账户。

## 注册委派管理员（AWS CLI）
<a name="stacksets-orgs-register-delegated-admin-cli"></a>

1. 打开 AWS CLI。

1. 运行 `register-delegated-administrator` 命令。

   ```
   $ aws organizations register-delegated-administrator \
     --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
     --account-id="memberAccountId"
   ```

1. 运行 `list-delegated-administrators` 命令验证指定的成员账户是否已成功注册为委派管理员。

   ```
   $ aws organizations list-delegated-administrators \
     --service-principal=member.org.stacksets.cloudformation.amazonaws.com
   ```

## 取消注册委派管理员（AWS CLI）
<a name="stacksets-orgs-deregister-delegated-admin-cli"></a>

1. 打开 AWS CLI。

1. 运行 `deregister-delegated-administrator` 命令。

   ```
   $ aws organizations deregister-delegated-administrator \
     --service-principal=member.org.stacksets.cloudformation.amazonaws.com \
     --account-id="memberAccountId"
   ```

1. 运行 `list-delegated-administrators` 命令验证指定的成员账户的委派管理员身份是否已成功取消注册。

   ```
   $ aws organizations list-delegated-administrators \
     --service-principal=member.org.stacksets.cloudformation.amazonaws.com
   ```

   您可以随时再次注册此账户。

# 使用示例模板开始使用 StackSet。
<a name="stacksets-getting-started"></a>

本教程将介绍如何通过 AWS 管理控制台开始使用 StackSet。它会指导您如何使用示例模板创建 StackSet。您将学会如何跨多个区域部署堆栈、监控 StackSet 操作以及查看结果。

在本教程中，您将在美国西部（俄勒冈州）(`us-west-2`) 区域和美国东部（弗吉尼亚州北部）区域 (`us-east-1`) 中的 AWS 账户中创建一个启用 AWS Config 的 StackSet。借助 StackSet，您可以在一次操作中跨多个账户和区域创建、更新或删除堆栈，因此它是大规模管理基础设施的理想解决方案。虽然为了方便起见，本教程使用单一账户，但它有效地演示了 StackSet 的多区域功能。

位于以下 S3 存储桶中的示例模板可供使用：[https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfig.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfig.yml)。

**注意**  
StackSet 使用免费，但您需要为创建 StackSet 使用的 AWS 资源付费，例如本教程中的 AWS Config。有关更多信息，请参阅 [AWS Config 定价](https://aws.amazon.com/config/pricing/)。

**Topics**
+ [先决条件](#stacksets-tutorial-prerequisites)
+ [使用控制台中的示例模板创建 StackSet](#stacksets-tutorial-create-stackset)
+ [监控 StackSet 创建](#stacksets-tutorial-monitor-creation)
+ [查看 StackSet 结果](#stacksets-tutorial-view-results)
+ [更新 StackSet](#stacksets-tutorial-update-stackset)
+ [将堆栈添加到 StackSet](#stacksets-tutorial-add-stacks)
+ [清理](#stacksets-tutorial-clean-up)
+ [后续步骤](#stacksets-tutorial-next-steps)

## 先决条件
<a name="stacksets-tutorial-prerequisites"></a>

开始本教程之前，请确保您已完成以下先决条件：
+ 您必须已设置自行管理权限所需的 IAM 角色。要创建 StackSet 并在单个账户中部署堆栈，您的账户中需要有以下角色：
  + `AWSCloudFormationStackSetAdministrationRole`
  + `AWSCloudFormationStackSetExecutionRole`

  有关这些角色设置的详细说明，请参阅[授予自行管理的权限](stacksets-prereqs-self-managed.md)。

## 使用控制台中的示例模板创建 StackSet
<a name="stacksets-tutorial-create-stackset"></a>

**创建启用 AWS Config 的 StackSet**

1. 打开 [ CloudFormation 控制台](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择要从中管理 StackSet 的 AWS 区域。

   您可以选择支持 StackSet 的任何区域。您选择的区域不会影响您可以使用 StackSet 部署的区域范围。

1. 从导航窗格中，选择 **StackSets**。

1. 从 **StackSets** 页面顶部，选择**创建 StackSet**。

1. 在**权限**下，选择**自助服务权限**，然后选择您在完成先决条件期间创建的 IAM 角色。
   + 在 IAM 管理员角色中，选择 **AWSCloudFormationStackSetAdministrationRole**。
   + 在 IAM 执行角色名称中，选择 **AWSCloudFormationStackSetExecutionRole**。

1. 在 **Prerequisite - Prepare template (先决条件 – 准备模板)** 下，选择 **Use a sample template (使用示例模板)**。

1. 在**选择示例模板**下，选择**启用 AWS Config** 模板。然后选择**下一步**。

   此模板会在账户中创建启用 AWS Config 所必需的资源，包括配置记录器和交付渠道。

1. 在**指定 StackSet 详细信息**页面的 **StackSet 名称**中，输入 **my-awsconfig-stackset**。

1. 在 **StackSet 描述**中，输入 **A StackSet that enables Config across multiple Regions**。

1. 在**参数**下，按以下方式配置 AWS Config 设置：

   1. 对于**支持所有资源类型**，请保留默认值 **true**，从而记录所有受支持的资源类型。

   1. 对于**包含全局资源类型**，保留默认值 **false**，从而排除 IAM 角色等全局资源。

   1. 请将**如非全部支持时的资源类型列表**设置为 **<All>**。

   1. 对于**包含 Config 服务相关角色资源的区域**，请将 **<DeployToAnyRegion>** 替换为 **us-west-2**。

      这表示仅在将堆栈部署到美国西部（俄勒冈州）区域时，才会创建名为 `AWSServiceRoleForConfig` 的服务相关角色。您将在此过程的后期阶段选择部署区域。

   1. 对于**配置记录器记录频率**，请选择**每日**记录。

1. 选择**下一步**以继续。

1. 在**配置 StackSet 选项**页面上，选择**添加新标签**，然后指定键/值对来添加标签。

   1. 对于**键**，输入 **Stage**。

   1. 对于**值**，输入 **Test**。

   您应用到 StackSet 的标签也将应用到堆栈创建的所有资源。

1. 在**执行配置**中，请选择**活动**，启用 CloudFormation 的优化操作处理：
   + 为了缩短部署时间，无冲突的操作会同时运行。
   + 存在冲突的操作会自动排入队列，按照请求的顺序进行处理。

   如果有操作正在运行或排队，CloudFormation 会将所有传入操作排入队列，即使这些操作没有冲突。在此期间，您不能更改执行设置。

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

1. 在**设置部署选项**页面的**向 StackSet 添加堆栈**中，选择**部署新堆栈**。

1. 对于 **Accounts (账户)**，选择 **Deploy stacks in accounts (在账户中部署堆栈)**。

1. 在文本框中输入 AWS 账户 ID。

1. 在**指定区域**中，按此顺序选择以下区域：

   1. 美国西部（俄勒冈州）区域 (`us-west-2`)

   1. 美国东部（弗吉尼亚州北部）区域 (`us-east-1`)

   如需要，选择美国西部（俄勒冈州）区域旁边的向上箭头，将其移至列表中的第一个条目。区域顺序决定了其部署顺序。

1. 在**部署选项**中，配置以下设置：

   1. 对于 **Maximum concurrent accounts**（最大并发账户数），请保留 **Number**（数量）和 **1** 的默认值。

      如果是多账户部署，此设置表示，CloudFormation 一次仅在一个账户中部署您的堆栈。

   1. 对于 **Failure tolerance (容错)**，请保留 **Number (数量)** 和 **0** 的默认值。

      这意味着，只要您指定区域之一中只要有一个堆栈部署失败，CloudFormation 就会停止当前区域中的部署并取消剩余区域中的部署。

   1. 在**区域并发**中，请选择**顺序**（默认设置）。

      此设置可确保 CloudFormation 完成一个区域的部署后，然后再移至下一个区域。

   1. 在**并发模式**中，保留默认值**严格容错**。

      对于多账户部署，这会在操作失败时降低账户并发级别，保持在**容错能力** \$11 的范围内。

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

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 准备好创建 StackSet 后，选择**提交**。

## 监控 StackSet 创建
<a name="stacksets-tutorial-monitor-creation"></a>

选择**提交**后，CloudFormation 会开始创建您的 StackSet 并将堆栈部署到您账户中的指定区域。StackSet 详细信息页面会自动打开，您可以在其中监控操作进度。

**监控 StackSet 创建**

1. 在 StackSet 详细信息页面上会默认显示**操作**选项卡，显示当前正在进行的操作。

1. 操作状态最开始应为 `RUNNING`。CloudFormation 根据您配置的部署选项在指定的区域中创建堆栈。

1. 要查看有关操作的更多详细信息，请在列表中选择操作 ID。

1. 在操作详细信息页面，可以查看每个区域中创建的堆栈实例的状态。

1. 操作状态变为 `SUCCEEDED` 后表示 StackSet 及其所有堆栈实例已成功创建。

## 查看 StackSet 结果
<a name="stacksets-tutorial-view-results"></a>

StackSet 创建完成后，您可以查看已部署的堆栈实例，验证您的账户是否已在各个指定区域中启用 AWS Config。

**查看 StackSet 结果**

1. 在 StackSet 详细信息页面上，选择**堆栈实例**选项卡。

1. 您应该会看到您的账户在各个指定区域中创建的堆栈实例列表。每个堆栈实例的状态都应为 `SUCCEEDED`，此状态表示已成功部署。

1. 要验证您的账户是否已启用 AWS Config，可以查看每个部署区域的 AWS Config 控制台。

## 更新 StackSet
<a name="stacksets-tutorial-update-stackset"></a>

创建 StackSet 后，您可能会需要对其进行更新以修改参数值或添加更多区域。本节介绍如何更新 AWS Config 记录频率参数。

**更新 StackSet**

1. 在 **StackSet** 页面上，选择 **my-awsconfig-stackset**。

1. 选定 StackSet 之后，从**操作**菜单中选择**编辑 StackSet 详细信息**。

1. 在**选择模板**页面的**先决条件 – 准备模板**中，选择**使用当前模板**。

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

1. 在**指定 StackSet 详细信息**页面的**参数**下，找到**配置记录器的记录频率**，将其从**每日**更改为**连续**。

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

1. 在**配置 StackSet 选项**页面上，保持所有设置不变，然后选择**下一步**。

1. 在**设置部署选项**页面上，指定您的账户 ID 以及您在创建 StackSet 时使用的区域。

1. 在**部署选项**中，保持与之前相同的设置。

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

1. 在**审核**页面上，检查您的更改内容，然后选择**提交**。

1. CloudFormation 会开始更新 StackSet。您可以在 StackSet 详细信息页面的**操作**选项卡上监控进度。

## 将堆栈添加到 StackSet
<a name="stacksets-tutorial-add-stacks"></a>

您可以通过部署到其他区域来向 StackSet 添加更多堆栈。本节介绍如何向新区域添加堆栈。

**将堆栈添加到 StackSet**

1. 在 **StackSet** 页面上，选择 **my-awsconfig-stackset**。

1. 选择 StackSet 后，从**操作**菜单中选择**将堆栈添加到 StackSet**。

1. 在**设置部署选项**页面的**向 StackSet 添加堆栈**中，选择**部署新堆栈**。

1. 在**账户**中，选择**在账户中部署堆栈**，然后输入您的账户 ID。

1. 在**指定区域**中，选择一个新的区域，例如**欧洲地区（爱尔兰）**(`eu-west-1`)。

1. 在**部署选项**中，保持与之前相同的设置。

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

1. 在**指定覆盖**页面上，将属性值保留为指定值，然后选择**下一步**。

1. 在**审核**页面上，检查您的选择，然后选择**提交**。

1. CloudFormation 会开始在指定区域中创建新堆栈。您可以在 StackSet 详细信息页面的**操作**选项卡上监控进度。

## 清理
<a name="stacksets-tutorial-clean-up"></a>

为避免因不需要的 AWS Config 资源产生费用，您应该从 StackSet 中删除堆栈、删除 StackSet 本身以及删除在本教程学习期间创建的 IAM 角色，以便进行清理。所有资源都部署在您的账户中，因此清理非常简单。

**从 StackSet 中删除堆栈**

1. 在 **StackSet** 页面上，选择 **my-awsconfig-stackset**。

1. 选定 StackSet 后，从**操作**菜单中选择**从 StackSet 中删除堆栈**。

1. 在**设置部署选项**页面的**账户**中，选择**在账户中部署堆栈**，然后输入您的账户 ID。

1. 在**指定区域**中，选择部署了堆栈的所有区域。

1. 在**部署选项**中，保留默认设置。

1. 确保*未*打开**保留堆栈**，以便删除堆栈及其资源。

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

1. 在**审核**页面上，检查您的选择，然后选择**提交**。

1. CloudFormation 会开始从 StackSet 中删除堆栈。您可以在 StackSet 详细信息页面的**操作**选项卡上监控进度。

**删除 StackSet**

1. 删除所有堆栈后，在 **StackSet** 页面上，选择 **my-awsconfig-stackset**。

1. 选定 StackSet 后，从**操作**菜单中选择**删除 StackSet**。

1. 当系统提示进行确认时，选择**删除**。

**删除 IAM 服务角色**

由于您只部署到自己的账户，因此您只需要从该单一账户中删除 IAM 角色即可，清理工作比多账户部署简单得多。

1. 打开 [IAM 控制台](https://console.aws.amazon.com/iam/)。

1. 从导航窗格中，选择 **Roles**。

1. 在搜索框中，输入 **AWSCloudFormationStackSet** 查找您在本教程学习期间创建的角色。

1. 勾选 **AWSCloudFormationStackSetAdministrationRole** 旁边的复选框。

1. 在该页面的顶部，选择**删除**。

1. 在确认对话框中，输入 **delete**，然后选择**删除**。

1. 重复同样的过程删除 **AWSCloudFormationStackSetExecutionRole**。

删除 StackSet 后，由于 `AWS::S3::Bucket` 资源的 `DeletionPolicy` 属性，每个 AWS 区域都将保留一个 Amazon S3 存储桶。这样可以保留您的 AWS Config 历史数据。如果您不再需要这些数据，可以安全地手动删除该存储桶。您必须先清空存储桶，然后才能删除存储桶。清空存储桶将删除存储桶中的所有对象。

**清空和删除 Amazon S3 存储桶**

1. 打开 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)。

1. 在控制台左侧的导航窗格中，选择 **Buckets（存储桶）**。

1. 在**存储桶**列表中，您将看到在部署的每个区域中为此 StackSet 创建的存储桶。选择为此 StackSet 创建的存储桶名称旁边的选项，然后选择**清空**。

1. 在**清空存储桶**页面上，通过在文本字段中键入 **permanently delete** 来确认要清空存储桶，然后选择**清空**。

1. 在**清空存储桶：状态**页面上监控存储桶清空过程的进度。

1. 要返回到存储桶列表，请选择**退出**。

1. 选择存储桶名称旁的选项，然后选择**删除**。

1. 在系统提示进行确认时，键入存储桶的名称，然后选择**删除存储桶**。

1. 在**存储桶**清单上监控存储桶删除过程的进度。Amazon S3 完成存储桶删除后，会将存储桶从列表中移除。

1. 重复此过程，删除不同区域中为此 StackSet 创建的存储桶。

## 后续步骤
<a name="stacksets-tutorial-next-steps"></a>

恭喜您！您已经成功使用示例模板创建了 StackSet，将堆栈部署到账户内的多个区域，更新了 StackSet，添加了更多堆栈，还清理了资源。通过学习单一账户部署，可以简化您的清理过程，同时还能让您学到 StackSet 的核心多区域功能。

要了解有关 StackSet 的更多信息，请参阅以下主题：
+ [覆盖 CloudFormation StackSet 中的堆栈参数值](stackinstances-override.md)：了解如何覆盖特定账户和区域的参数值。
+ [创建具有服务托管权限的 CloudFormation StackSet](stacksets-orgs-associate-stackset-with-org.md)：探索如何使用 AWS Organizations 为多账户部署创建 StackSet。

# 创建具有自行管理权限的 CloudFormation StackSet
<a name="stacksets-getting-started-create-self-managed"></a>

本主题介绍如何创建具有*自行管理*权限的 StackSet，以便跨 AWS 账户和区域部署堆栈。

**注意**  
在此之前，您必须首先创建 StackSet 所需的 IAM 角色，以便在 StackSet 的管理账户与需要部署堆栈的账户之间建立可信关系。有关更多信息，请参阅 [授予自行管理的权限](stacksets-prereqs-self-managed.md)。

**Topics**
+ [创建具有自行管理权限的 StackSet（控制台）](#stacksets-getting-started-create-self-managed-console)
+ [创建具有自行管理权限的 StackSet（AWS CLI）](#stacksets-getting-started-self-managed-cli)

## 创建具有自行管理权限的 StackSet（控制台）
<a name="stacksets-getting-started-create-self-managed-console"></a>

**创建 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择要从中管理 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。

1. 从 **StackSets** 页面顶部，选择**创建 StackSet**。

1. 在**权限**下，选择**自助服务权限**，然后选择您创建的 IAM 角色。

1. 在**先决条件 - 准备模板**下，选择**模板已就绪**。

1. 在 **Specify template (指定模板)** 下，选择指定包含堆栈模板的 S3 存储桶的 URL，或者上传堆栈模板文件。然后选择**下一步**。

1. 在**指定 StackSet 详细信息**页面上，提供 StackSet 名称，指定所有参数，然后选择**下一步**。

1. 选择**下一步**以继续。

1. 在 **Configure StackSet options (配置堆栈集选项)** 页面上，在 **Tags (标签)** 下指定要应用于堆栈中资源的所有标签。有关如何在 AWS 中使用标签的更多信息，请参阅《AWS 账单与成本管理 User Guide》**中的 [Organizing and tracking costs using AWS cost allocation tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

1. 在**执行配置**中，请选择**活动**，启用 CloudFormation 的优化操作处理：
   + 为了缩短部署时间，无冲突的操作会同时运行。
   + 存在冲突的操作会自动排入队列，按照请求的顺序进行处理。

   如果有操作正在运行或排队，CloudFormation 会将所有传入操作排入队列，即使这些操作没有冲突。在此期间，您不能更改执行设置。

1. 如果模板包含 IAM 资源，则对于**功能**，请选择**我确认该模板可能会创建 IAM 资源**以指定您要在模板中使用 IAM 资源。有关更多信息，请参阅 [确认 CloudFormation 模板中的 IAM 资源](control-access-with-iam.md#using-iam-capabilities)。

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

1. 在**设置部署选项**页面的**向 StackSet 添加堆栈**中，选择**部署新堆栈**。

1. 对于 **Accounts (账户)**，选择 **Deploy stacks in accounts (在账户中部署堆栈)**。在文本框中粘贴您的目标 AWS 账户编号，并使用逗号分隔多个编号。
**注意**  
如果您还想在该账户中部署堆栈，则可以将您的管理员账户 ID 也包含在其中。

1. 对于**指定区域**，选择要在其中部署堆栈的区域。

1. 对于**部署选项**，请执行以下操作：
   + 对于**最大并发账户数**，请指定并发处理的账户数量。
   + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
   + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
   + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
     + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
     + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。

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

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 准备好创建 StackSet 后，选择**提交**。

   CloudFormation 会开始创建 StackSet。选择**提交**后会打开 StackSet 详细信息页面，可以在其中查看 StackSet 中的堆栈创建进度和状态。

## 创建具有自行管理权限的 StackSet（AWS CLI）
<a name="stacksets-getting-started-self-managed-cli"></a>

请按照本部分中的步骤，使用 AWS CLI 来执行以下操作：
+ 创建 StackSet 容器。
+ 部署堆栈实例。

**创建 StackSet**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html) 命令创建一个新 StackSet（名为 `my-stackset`）。以下示例中，使用存储在 S3 存储桶中的模板，包含将 `KeyPairName` 设置为 `TestKey` 的参数。

   ```
   aws cloudformation create-stack-set \
     --stack-set-name my-stackset \
     --template-url https://s3.region-code.amazonaws.com/amzn-s3-demo-bucket/MyApp.template \
     --parameters ParameterKey=KeyPairName,ParameterValue=TestKey
   ```

1. 在 **create-stack-set** 命令完成后，运行 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html) 命令可查看您的 StackSet 是否已创建。您应在结果中看到新的 StackSet。

   ```
   aws cloudformation list-stack-sets
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html) 命令将堆栈部署到 StackSet 中。以下示例中，在两个区域（`us-west-2` 和 `us-east-1`）的两个 AWS 账户（`account_ID_1` 和 `account_ID_2`）中部署堆栈。

   使用 `--operation-preferences` 选项设置并发账户处理和其他部署首选项。此示例使用基于计数的设置。请注意，`MaxConcurrentCount` 不得大于 `FailureToleranceCount` \$1 1。对于基于百分比的设置，请改用 `FailureTolerancePercentage` 或 `MaxConcurrentPercentage`。

   ```
   aws cloudformation create-stack-instances \
     --stack-set-name my-stackset \
     --accounts account_ID_1 account_ID_2 \
     --regions us-west-2 us-east-1 \
     --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
   ```

   有关更多信息，请参阅《AWS CloudFormation API 参考》中的 [CreateStackInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackInstances.html)**。

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) 命令验证堆栈是否已成功创建。在 `--operation-id` 选项中，指定作为 **create-stack-instances** 输出部分内容返回的操作 ID。

   ```
   aws cloudformation describe-stack-set-operation \
     --stack-set-name my-stackset \
     --operation-id operation_ID
   ```

# 创建具有服务托管权限的 CloudFormation StackSet
<a name="stacksets-orgs-associate-stackset-with-org"></a>

使用*服务托管*权限时，您可以将堆栈部署到特定区域中由 AWS Organizations 托管的账户。使用此模型，您无需在每个目标账户和AWS 区域中创建 IAM 角色。CloudFormation 代表您创建 IAM 角色。有关更多信息，请参阅 [激活可信访问权限](stacksets-orgs-activate-trusted-access.md)。

**Topics**
+ [注意事项](#stacksets-orgs-considerations)
+ [创建具有服务管理权限的 StackSet（控制台）](#stacksets-orgs-associate-stackset-with-org-console)
+ [创建具有服务管理权限的 StackSet（AWS CLI）](#stacksets-orgs-associate-stackset-with-org-cli)

## 注意事项
<a name="stacksets-orgs-considerations"></a>

在创建具有服务托管权限的 StackSet 之前，请考虑以下事项：
+ 具有服务托管权限的 StackSets 可以由组织的管理账户或委派管理员账户启动，但所有操作均由管理账户执行。
+ CloudFormation 不会将堆栈部署到管理账户，即使该账户是您组织的一部分或属于某组织单元 (OU) 也是如此。
+ StackSet 可以整个组织（包括所有账户）或指定 OU 为目标。当 StackSet 以父 OU 为目标时，它会自动包含任何子 OU。默认情况下，当 StackSet 以特定 OU 为目标时，它会包含这些 OU 内的所有账户。但是，您可以使用账户筛选条件，来仅以特定账户为目标。
+ 多个堆栈集可以将同一组织或 OU 作为目标。
+ 不能以组织外的账户为目标。
+ 您部署 StackSets 的授权取决于分配给您用于登录管理账户的 IAM 主体（用户、角色或组）的权限。有关授予向组织进行部署的权限的示例 IAM policy，请参阅 [根据区域和资源类型限制堆栈集操作](security_iam_id-based-policy-examples.md#resource-level-permissions-service-managed-stack-set)。
+ 委派管理员具有部署到组织中的任何账户的完全权限。管理账户不能限制委派管理员部署到特定 OU 或 StackSet 操作的权限。
+ 自动部署设置在 StackSet 级别应用。您无法为 OU、账户或区域选择性地调整自动部署。
+ 使用服务托管权限的 StackSet 不支持包含宏或转换的嵌套堆栈或模板。

## 创建具有服务管理权限的 StackSet（控制台）
<a name="stacksets-orgs-associate-stackset-with-org-console"></a>

**创建 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择要从中管理 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。

1. 从 **StackSets** 页面顶部，选择**创建 StackSet**。

1. 在**权限**下方，选择**服务托管权限**。
**注意**  
如果为可信访问禁用 AWS Organizations，则会显示横幅。创建或更新具有服务托管权限的 StackSet 需要可信访问。只有组织管理账户中的管理员具有对 [使用 AWS Organizations 为 StackSet 激活可信访问权限](stacksets-orgs-activate-trusted-access.md) 的权限。

1. 在**先决条件 - 准备模板**下，选择**模板已就绪**。

1. 在 **Specify template (指定模板)** 下，选择指定包含堆栈模板的 S3 存储桶的 URL，或者上传堆栈模板文件。然后选择**下一步**。

1. 在**指定 StackSet 详细信息**页面上，提供 StackSet 名称，指定所有参数，然后选择**下一步**。

1. 在 **Configure StackSet options (配置堆栈集选项)** 页面上，在 **Tags (标签)** 下指定要应用于堆栈中资源的所有标签。有关如何在 AWS 中使用标签的更多信息，请参阅《AWS 账单与成本管理 User Guide》**中的 [Organizing and tracking costs using AWS cost allocation tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

1. 在**执行配置**中，请选择**活动**，启用 CloudFormation 的优化操作处理：
   + 为了缩短部署时间，无冲突的操作会同时运行。
   + 存在冲突的操作会自动排入队列，按照请求的顺序进行处理。

   如果有操作正在运行或排队，CloudFormation 会将所有传入操作排入队列，即使这些操作没有冲突。在此期间，您不能更改执行设置。

1. 如果模板包含 IAM 资源，则对于**功能**，请选择**我确认该模板可能会创建 IAM 资源**以指定您要在模板中使用 IAM 资源。有关更多信息，请参阅 [确认 CloudFormation 模板中的 IAM 资源](control-access-with-iam.md#using-iam-capabilities)。

1. 选择**下一步**以继续，并激活可信访问权限（如果尚未激活）。

1. 在**设置部署选项**页面的**部署目标**下，执行以下操作之一：
   + 要部署到您组织中的所有账户，请选择**部署到组织**。
   + 要部署到特定 OU 中的所有账户，请选择**部署到组织单位（OU）**。选择 **Add an OU (添加 OU)**，然后将目标 OU ID 粘贴到文本框中。对每个新目标 OU 重复执行此操作。

   如果您选择**部署到组织单元（OU）**，则对于**账户筛选条件类型**，可以通过选择以下选项之一并提供账号将部署目标设置为特定的个人账户。
   + **无**（默认）：将堆栈部署到指定 OU 中的所有账户。
   + **交集**：将堆栈部署到选定 OU 中特定的单独账户。
   + **差集**：除特定账户外，将堆栈部署到选定 OU 中的所有账户。
   + **并集**：将堆栈部署到指定 OU 以及额外单独账户。

1. 在**自动部署**下，选择是否自动部署到将来添加到目标组织或 OU 的账户。有关更多信息，请参阅 [为 AWS Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)。

1. 如果启用自动部署，请在 **Account removal behavior (账户删除行为)** 下，选择从目标组织或 OU 中删除账户时是保留还是删除堆栈资源。
**注意**  
选择**保留堆栈**后，堆栈将从 StackSet 中移除，但堆栈及其相关资源将会保留。资源会保持当前状态，但不再是 StackSet 的一部分。

1. 对于**指定区域**，选择要在其中部署堆栈的区域。

1. 对于**部署选项**，请执行以下操作：
   + 对于**最大并发账户数**，请指定并发处理的账户数量。
   + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
   + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
   + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
     + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
     + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。
   + 对于 StackSet **依赖项**，添加依赖的 StackSet ARN，最多保持在 10 个依赖项内。有关更多信息，请参阅 [为 AWS Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)。

1. 选择**下一步**以继续。

1. 在**审核**页面上，验证 StackSet 将部署到正确区域中的正确账户，然后选择**创建 StackSet**。

   将打开 **StackSet details (堆栈集详细信息)** 页面。您可以在 StackSet 中查看堆栈创建的进度和状态。

## 创建具有服务管理权限的 StackSet（AWS CLI）
<a name="stacksets-orgs-associate-stackset-with-org-cli"></a>

请按照本部分中的步骤，使用 AWS CLI 来执行以下操作：
+ 创建 StackSet 容器。
+ 部署堆栈实例。

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

------
#### [ Deploy to your organization ]

**创建 StackSet**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html) 命令创建一个新 StackSet（名为 `my-stackset`）。以下示例使用存储在 S3 存储桶中的模板，启用自动部署，会在删除账户时保留堆栈。有关更多信息，请参阅 [为 AWS Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)。

   ```
   aws cloudformation create-stack-set \
     --stack-set-name my-stackset \
     --template-url https://s3.region-code.amazonaws.com/amzn-s3-demo-bucket/MyApp.template \
     --permission-model SERVICE_MANAGED \
     --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=ARN1,ARN2
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html) 命令确认 StackSet 已创建。结果中会列出您的新 StackSet。

   ```
   aws cloudformation list-stack-sets
   ```
   + 如果您在登录成员账户时将 `--call-as` 选项设置为 `DELEGATED_ADMIN`，则 **list-stack-sets** 会返回组织管理账户中具有服务托管权限的所有堆栈集。
   + 如果您在登录您的 AWS 账户时将 `--call-as` 选项设置为 `SELF`，则 **list-stack-sets** 会返回 AWS 账户中所有自行管理的堆栈集。
   + 如果您在登录组织管理账户时将 `--call-as` 选项设置为 `SELF`，则 **list-stack-sets** 会返回组织管理账户中的所有堆栈集。

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html) 命令将堆栈添加到 StackSet 中。在 `--deployment-targets` 选项中，指定要部署到组织中所有账户的组织根 ID。

   使用 `--operation-preferences` 选项设置并发账户处理和其他部署首选项。此示例使用基于计数的设置。请注意，`MaxConcurrentCount` 不得大于 `FailureToleranceCount` \$1 1。对于基于百分比的设置，请改用 `FailureTolerancePercentage` 或 `MaxConcurrentPercentage`。

   ```
   aws cloudformation create-stack-instances --stack-set-name my-stackset \
     --deployment-targets OrganizationalUnitIds=r-a1b2c3d4e5 \
     --regions us-west-2 us-east-1 \
     --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
   ```

   有关更多信息，请参阅《AWS CloudFormation API 参考》中的 [CreateStackInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackInstances.html)**。

1. 使用在 **create-stack-instances** 输出中返回的 `operation-id` 以及以下 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) 命令，验证堆栈是否已成功创建。

   ```
   aws cloudformation describe-stack-set-operation \
     --stack-set-name my-stackset \
     --operation-id operation_ID
   ```

------
#### [ Deploy to organizational units (OUs) ]

**创建 StackSet**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-set.html) 命令创建一个新 StackSet（名为 `my-stackset`）。以下示例中，使用存储在 S3 存储桶中的模板，包含将 `KeyPairName` 设置为 `TestKey` 的参数

   ```
   aws cloudformation create-stack-set \
     --stack-set-name my-stackset \
     --template-url https://s3.region-code.amazonaws.com/amzn-s3-demo-bucket/MyApp.template \
     --permission-model SERVICE_MANAGED \
     --parameters ParameterKey=KeyPairName,ParameterValue=TestKey
   ```

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-sets.html) 命令确认 StackSet 已创建。结果中会列出您的新 StackSet。

   ```
   aws cloudformation list-stack-sets
   ```
   + 如果您在登录成员账户时将 `--call-as` 选项设置为 `DELEGATED_ADMIN`，则 **list-stack-sets** 会返回组织管理账户中具有服务托管权限的所有堆栈集。
   + 如果您在登录您的 AWS 账户时将 `--call-as` 选项设置为 `SELF`，则 **list-stack-sets** 会返回 AWS 账户中所有自行管理的堆栈集。
   + 如果您在登录组织管理账户时将 `--call-as` 选项设置为 `SELF`，则 **list-stack-sets** 会返回组织管理账户中的所有堆栈集。

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html) 命令将堆栈添加到 StackSet 中。在 `--deployment-targets` 选项中，指定部署目的地 OU ID。

   使用 `--operation-preferences` 选项设置并发账户处理和其他部署首选项。此示例使用基于计数的设置。请注意，`MaxConcurrentCount` 不得大于 `FailureToleranceCount` \$1 1。对于基于百分比的设置，请改用 `FailureTolerancePercentage` 或 `MaxConcurrentPercentage`。

   ```
   aws cloudformation create-stack-instances --stack-set-name my-stackset \
     --deployment-targets OrganizationalUnitIds=ou-rcuk-1x5j1lwo,ou-rcuk-slr5lh0a \
     --regions us-west-2 us-east-1 \
     --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
   ```

   有关更多信息，请参阅《AWS CloudFormation API 参考》中的 [CreateStackInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStackInstances.html)**。

1. 使用在 **create-stack-instances** 输出中返回的 `operation-id` 以及以下 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) 命令，验证堆栈是否已成功创建。

   ```
   aws cloudformation describe-stack-set-operation \
     --stack-set-name my-stackset \
     --operation-id operation_ID
   ```

------
#### [ Deploy to specific accounts in OUs ]

您可以特定的组织单元（OU）为目标，并使用账户筛选条件来精确控制哪些账户接收堆栈部署。默认情况下，如果未指定账户筛选条件，则堆栈会部署到指定 OU 内的所有账户。

在 AWS CLI 中，您可以使用 `--deployment-targets` 选项指定账户筛选条件。有关更多信息，请参阅 [DeploymentTargets](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeploymentTargets.html)。

使用 **create-stack-set** 命令创建 StackSet 容器后，使用以下示例之一将堆栈部署到特定账户。

**以 OU 中的特定账户为目标**  
以下示例中，仅向 OU1 中的账户 A1 和 A2 部署堆栈。

```
aws cloudformation create-stack-instances --stack-set-name my-stackset \
  --deployment-targets OrganizationalUnitIds=OU1,Accounts=A1,A2,AccountFilterType=INTERSECTION \
  --regions us-west-2 us-east-1
```

**从 OU 中排除账户**  
以下示例中，仅向 OU1 中账户 A1 和 A2 之外的所有账户部署堆栈。

```
aws cloudformation create-stack-instances --stack-set-name my-stackset \
  --deployment-targets OrganizationalUnitIds=OU1,Accounts=A1,A2,AccountFilterType=DIFFERENCE \
  --regions us-west-2 us-east-1
```

------

# 为 AWS Organizations 中的堆栈集启用或禁用自动部署
<a name="stacksets-orgs-manage-auto-deployment"></a>

将新的 AWS Organizations 账户添加到目标组织或组织单元（OU）后，CloudFormation 会自动将额外的堆栈部署到这些账户。您可以启用自动部署，并选择当账户从目标 OU 移出时，是删除还是保留堆栈及其相关资源。对于使用服务托管权限的堆栈集，这些设置可以随时修改。

## 自动部署的工作原理
<a name="stacksets-orgs-auto-deployment-example"></a>

启用自动部署后，当账户添加到目标组织或 OU、从目标组织或 OU 移除或在目标 OU 之间移动时，都会触发自动部署。

例如，考虑以 `us-east-1` 区域中的 `OU1` 为目标的 `StackSet1` 和以 `us-east-1` 区域中的 `OU2` 为目标的 `StackSet2`。`OU1` 包含 `AccountA`。

如果在启用自动部署的情况下将 `AccountA` 从 `OU1` 移至 `OU2`，CloudFormation 会自动运行删除操作，从 `AccountA` 中移除 `StackSet1` 堆栈，并在队列中排入一个将 `StackSet2` 堆栈添加到 `AccountA` 的创建操作。

## 注意事项
<a name="stacksets-orgs-auto-deployment-considerations"></a>

以下是使用自动部署时的注意事项：
+ 自动部署功能在 StackSet 级别启用。您无法为 OU、账户或区域选择性地调整自动部署。
+ 覆盖的参数值仅适用于当前已在目标 OU 及其子 OU 中的账户。将来添加到目标 OU 及其子 OU 的账户将使用 StackSet 默认值，而不使用覆盖的值。
+ 自动部署不考虑账户级别的目标筛选器。如果您的目标是特定账户，而且启用了自动部署，StackSet 将继续部署到已部署组织中任何新添加的账户。要防止部署到新添加的账户，请禁用自动部署。
+ 依赖项管理：每个 StackSet 最多定义 10 个依赖项，每个账户最多定义 100 个依赖项。例如，如果您有五个 StackSet，且每个都有五个依赖项，则您有 25 个依赖项计入 100 个依赖项上限。您可以通过[服务配额控制台](https://console.aws.amazon.com/servicequotas/home)请求增加限额。删除 StackSet 或停用 Organizations 时，依赖项将被移除。
+ 建议在使用自动部署时启用托管执行。托管执行将允许在多个目标账户中进行的自动部署操作在 StackSet 中同时执行，从而提高处理速度，对于规模较大的 Organizations 尤其如此。

## 启用或禁用自动部署（控制台）
<a name="stacksets-orgs-manage-auto-deployment-console"></a>

**启用或禁用自动部署**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSet** 页面上，选择要更新的 StackSet 名称旁边的选项。

1. 从右上角的**操作**菜单中选择**编辑自动部署**。

1. 在打开的对话框中，执行以下操作：

   1. 对于**自动部署**，选择**激活**或**停用**。

   1. 对于**账户移除行为**，请选择**删除堆栈**或**保留堆栈**。保留的资源会保持当前状态，但不再是 StackSet 的一部分。

   1. 对于 StackSet **依赖项**，添加依赖的 StackSet ARN，最多保持在 10 个依赖项内。

1. 选择**保存**。

## 启用或禁用自动部署（AWS CLI）
<a name="stacksets-orgs-manage-auto-deployment-cli"></a>

**启用或禁用自动部署**

1. 使用带 `--auto-deployment` 选项的 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html) 命令。

   以下命令可启用自动部署。

   ```
   aws cloudformation update-stack-set --stack-set-name my-stackset \
     --use-previous-template --auto-deployment Enabled=true,RetainStacksOnAccountRemoval=true,DependsOn=ARN1,ARN2
   ```

   或者，要禁用自动部署，可指定 `Enabled=false` 作为 `--auto-deployment` 选项的值，如下例所示。

   ```
   aws cloudformation update-stack-set --stack-set-name my-stackset \
     --use-previous-template --auto-deployment Enabled=false
   ```

1. 使用 **update-stack-set** 输出中返回的操作 ID，运行 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) 来验证 StackSet 是否已成功更新。

   ```
   aws cloudformation describe-stack-set-operation --operation-id operation_ID
   ```

# 更新 CloudFormation StackSet
<a name="stacksets-update"></a>

您可以使用 CloudFormation 控制台或 AWS CLI 更新您的 StackSet。

要在 StackSet 中添加和移除账户和区域，请参阅[将堆栈添加到 StackSets](stackinstances-create.md)和[从堆栈集中删除堆栈](stackinstances-delete.md)。要覆盖堆栈的参数值，请参阅[覆盖堆栈参数](stackinstances-override.md)。

**Topics**
+ [更新 StackSet（控制台）](#stacksets-update-console)
+ [更新 StackSet（AWS CLI）](#stacksets-update-cli)

## 更新 StackSet（控制台）
<a name="stacksets-update-console"></a>

**更新 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSet** 页面上，选择您要更新的 StackSet。

1. 选定 StackSet 之后，从**操作**菜单中选择**编辑 StackSet 详细信息**。

1. 在**选择模板**页面上，根据需要更新**权限**部分，或跳到下一步。

1. 在**先决条件 - 准备模板**中，选择**使用当前模板**以使用当前模板，或选择**替换当前模板**以指定另一个模板的 S3 URL，或上传新模板。

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

1. 在**指定 StackSet 详细信息**页面的 **StackSet 描述**中，根据需要更新 StackSet 的描述。

1. 对于**参数**，请根据需要更新参数值。

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

1. 在**配置 StackSet 选项**页面上，对于**标签**，根据需要修改标签。您可以添加、更新或删除标签。有关如何在 AWS 中使用标签的更多信息，请参阅《AWS 账单与成本管理 User Guide》**中的 [Organizing and tracking costs using AWS cost allocation tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html)。

1. 对于**执行配置**，您可以根据需要更新执行配置。
**注意**  
请记住，当操作正在运行或已排队时，您无法更改执行设置。

1. 如果模板包含 IAM 资源，则对于**功能**，请选择**我确认该模板可能会创建 IAM 资源**以指定您要在模板中使用 IAM 资源。有关更多信息，请参阅 [确认 CloudFormation 模板中的 IAM 资源](control-access-with-iam.md#using-iam-capabilities)。

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

1. 在**设置部署选项**页面上，提供用于更新的账户和区域。

   CloudFormation 将在第一个区域内的指定账户中部署堆栈更新，然后移到下一个区域，依此类推，前提是区域的部署失败不超过指定的容错能力。

   1. [自行管理权限] 对于**账户**、**部署位置**，选择**在账户中部署堆栈**。在文本框中粘贴用于创建 StackSet 的目标账户 ID，用逗号分隔多个数字。

      [服务管理权限] 请执行下列操作之一：
      + 选择 **Deploy to organizational units (OUs) (部署到组织单位 (OU))**。输入用于创建 StackSet 的目标 OU。
      + 选择 **Deploy to accounts (部署到账户)**。粘贴用于创建 StackSet 的目标 OU ID 或账户 ID。

   1. 对于**在指定区域**，指定您希望 CloudFormation 部署更新的顺序。

   1. 对于**部署选项**，请执行以下操作：
      + 对于**最大并发账户数**，请指定并发处理的账户数量。
      + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
      + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
      + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
        + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
        + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。
      + [服务管理权限] 对于 StackSet **依赖项**，添加依赖的 StackSet ARN，最多保持在 10 个依赖项内。有关更多信息，请参阅 [为 AWS Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)。

   1. 选择**下一步**以继续。

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 如果准备继续，则请选择**提交**。

   CloudFormation 会开始对您的 StackSet 应用更新，然后显示 StackSet 详细信息的**操作**选项卡。您可在**操作**选项卡上查看更新操作的进度和状态。

## 更新 StackSet（AWS CLI）
<a name="stacksets-update-cli"></a>

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

1. 

**更新 StackSet**

   使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html) 命令对 StackSet 进行更改。

   在以下示例命令中，我们使用 `--parameters` 选项来更新 StackSet。具体来说，我们将传递通道配置的默认快照传输频率从 `TwentyFour_Hours` 更改为 `Twelve_Hours`。由于我们仍在使用当前模板，因此添加了 `--use-previous-template` 选项。

   使用 `--operation-preferences` 选项设置并发账户处理和其他部署首选项。这些示例使用基于计数的设置。请注意，`MaxConcurrentCount` 不得大于 `FailureToleranceCount` \$1 1。对于基于百分比的设置，请改用 `FailureTolerancePercentage` 或 `MaxConcurrentPercentage`。

   [自行管理权限] 对于 `--accounts` 选项，提供您希望更新到目标的账户 ID。

   ```
   aws cloudformation update-stack-set --stack-set-name my-stackset \
     --use-previous-template \
     --parameters ParameterKey=MaximumExecutionFrequency,ParameterValue=Twelve_Hours \
     --accounts account_ID_1 account_ID_2 \
     --regions us-west-2 us-east-1 \
     --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
   ```

   [服务托管权限] 对于 `--deployment-targets` 选项，提供您希望更新到目标的组织（根）ID 或组织单元（OU）ID。

   ```
   aws cloudformation update-stack-set --stack-set-name my-stackset \
     --use-previous-template \
     --parameters ParameterKey=MaximumExecutionFrequency,ParameterValue=Twelve_Hours \
     --deployment-targets OrganizationalUnitIds=ou-rcuk-1x5j1lwo,ou-rcuk-slr5lh0a \
     --regions us-west-2 us-east-1 \
     --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
   ```

   有关更多信息，请参阅 *AWS CloudFormation API 参考*中的 [UpdateStackSet](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_UpdateStackSet.html)。

1. 通过运行 **describe-stack-set-operation** 命令显示更新操作的状态和结果，来验证是否已成功更新 StackSet。对于 `--operation-id`，使用由您的 **update-stack-set** 命令返回的操作 ID。

   ```
   aws cloudformation describe-stack-set-operation \
     --operation-id operation_ID
   ```

# 将堆栈添加到 CloudFormation 堆栈集
<a name="stackinstances-create"></a>

创建 StackSet 时，可以为 StackSet 创建堆栈。利用 CloudFormation，您还能在创建 StackSet 后的任何时间为其他账户和区域添加更多堆栈。您可以使用 CloudFormation 控制台或 AWS CLI 添加堆栈。

**Topics**
+ [将堆栈添加到 StackSet（控制台）](#stackinstances-create-console)
+ [将堆栈添加到 StackSet（AWS CLI）](#stackinstances-create-cli)

## 将堆栈添加到 StackSet（控制台）
<a name="stackinstances-create-console"></a>

**将堆栈添加到 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。在 StackSet 页面上，选择您创建的 StackSet。

1. 选择 StackSet 后，从**操作**菜单中选择**将堆栈添加到 StackSet**。

1. 在**设置部署选项**页面上，执行以下操作：

   1. 对于**将堆栈添加到 StackSet**，选择**部署新堆栈**。

   1. 接下来，根据 StackSet 的权限配置执行以下操作：
      + [自行管理权限] 对于**账户**、**部署位置**，选择**在账户中部署堆栈**。在文本框中粘贴您的目标账号，并使用逗号分隔多个号码。
      + [服务管理权限] 对于**部署目标**，请执行以下操作之一：
        + 选择 **Deploy to organization (部署到组织)** 可部署到您组织中的所有账户。
        + 选择 **Deploy to organizational units (OUs) (部署到组织单位 (OU))** 可部署到特定 OU 中的所有账户。选择 **Add another OU (添加其他 OU)**，然后将目标 OU ID 粘贴到文本框中。对每个新目标 OU 重复执行此操作。CloudFormation 还可以所选目标的任何子 OU 为目标。
**注意**  
如果您添加的 OU 已是 StackSet 的目标，同时该 OU 中有任何账户尚未具有 StackSet 中的堆栈（例如，在创建 StackSet 后添加到 OU 并且已禁用自动部署的账户），则 CloudFormation 会在该账户中创建新的堆栈。

   1. 对于**指定区域**，指定要部署到在上一步中所指定目标账户中的哪个 AWS 区域。默认情况下，CloudFormation 将在第一个区域内的指定账户中部署堆栈，然后移到下一个区域，依此类推，前提是区域的部署失败不超过指定的容错能力。

   1. 对于**部署选项**，请执行以下操作：
      + 对于**最大并发账户数**，请指定并发处理的账户数量。
      + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
      + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
      + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
        + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
        + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。

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

1. 在 **Specify Overrides (指定覆盖)** 页面上，将属性值保留为指定值。您不会覆盖您要创建的堆栈的任何属性值。选择**下一步**。

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 如果准备继续，则请选择**提交**。

   CloudFormation 会开始创建堆栈。选择**提交**后会打开 StackSet 详细信息页面，可以在其中查看 StackSet 中的堆栈创建进度和状态。完成后，新堆栈应该会在**堆栈实例**选项卡上列出。

## 将堆栈添加到 StackSet（AWS CLI）
<a name="stackinstances-create-cli"></a>

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

**将堆栈添加到具有自行管理权限的 StackSet**  
使用 **create-stack-instances** CLI 命令。在 `--accounts` 选项中，请提供您要为其创建堆栈的账户 ID。

```
aws cloudformation create-stack-instances --stack-set-name my-stackset \
  --accounts account_id --regions eu-west-1 us-west-2
```

**将堆栈添加到具有服务托管权限的 StackSet**  
使用 **create-stack-instances** CLI 命令。在 `--deployment-targets` 选项中，请提供要为其创建堆栈的组织（根）ID 或 OU ID。有关针对特定账户的命令示例，请参阅[创建具有服务管理权限的 StackSet（AWS CLI）](stacksets-orgs-associate-stackset-with-org.md#stacksets-orgs-associate-stackset-with-org-cli)。

```
aws cloudformation create-stack-instances --stack-set-name my-stackset \
  --deployment-targets OrganizationalUnitIds=ou-rcuk-r1qi0wl7 --regions eu-west-1 us-west-2
```

**注意**  
如果您添加的 OU 已是 StackSet 的目标，同时该 OU 中有任何账户尚未具有 StackSet 中的堆栈（例如，在创建 StackSet 后添加到 OU 并且已禁用自动部署的账户），则 CloudFormation 会在该账户中创建新的堆栈。

# 覆盖 CloudFormation StackSet 中的堆栈参数值
<a name="stackinstances-override"></a>

在某些情况下，您可能希望特定区域或账户中堆栈的属性值与 StackSet 中指定的属性值不同。例如，您可能希望根据账户是用于开发还是生产来为给定参数指定不同的值。对于这些情况，CloudFormation 允许您按账户和区域覆盖堆栈中的参数值。您可在首次创建堆栈时覆盖模板参数值，也可以覆盖现有堆栈的参数值。您只能将之前在堆栈中覆盖的参数还原为 StackSet 中指定的值。

参数值覆盖适用于选定账户和区域中的堆栈。StackSet 更新期间，不会更新任何堆栈覆盖参数值，而是会保留覆盖值。

您只能覆盖在 StackSet 中指定的参数*值*；要添加或删除参数本身，您需要更新 StackSet 模板。如果将参数添加到 StackSet 模板，则必须先使用 StackSet 中指定的新参数和值更新所有堆栈，然后才能覆盖堆栈中的参数值。使用新参数更新所有堆栈后，您可按需覆盖各个堆栈中的参数值。

要了解在创建堆栈时如何覆盖 StackSet 参数值，请参阅[将堆栈添加到 StackSets](stackinstances-create.md)。

**Topics**
+ [覆盖堆栈参数（控制台）](#stackinstances-override-console)
+ [覆盖堆栈参数（AWS CLI）](#stackinstances-override-cli)

## 覆盖堆栈参数（控制台）
<a name="stackinstances-override-console"></a>

**覆盖特定堆栈的参数**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。在 StackSet 页面上，选择您的 StackSet。

1. 选定 StackSet 后，从**操作**菜单中选择**覆盖 StackSet 参数**。

1. 在**设置部署选项**页面上，提供要为其创建覆盖的堆栈的账户和区域。

   默认情况下，CloudFormation 将在第一个区域内的指定账户中部署堆栈，然后移到下一个区域，依此类推，前提是区域的部署失败不超过指定的容错能力。

   1. [自行管理权限] 对于**部署位置**，选**在账户中部署堆栈**。粘贴创建 StackSet 时用的部分或全部目标账户 ID。

      [服务管理权限] 请执行下列操作之一：
      + 选择 **Deploy to organizational units (OUs) (部署到组织单位 (OU))**。输入一个或多个创建 StackSet 时使用的目标 OU。覆盖的参数值仅适用于当前已在目标 OU 及其子 OU 中的账户。将来添加到目标 OU 及其子 OU 的账户将使用 StackSet 默认值，而不使用覆盖的值。
      + 选择 **Deploy to accounts (部署到账户)**。粘贴创建 StackSet 时使用的部分或全部目标 OU ID 或账户 ID。

   1. 在**指定区域**中，添加已为此 StackSet 部署堆栈的一个或多个区域。

      如果您添加多个区域，**Specify regions (指定区域)** 下的区域顺序决定其部署顺序。

   1. 对于**部署选项**，请执行以下操作：
      + 对于**最大并发账户数**，请指定并发处理的账户数量。
      + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
      + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
      + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
        + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
        + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。

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

1. 在**指定覆盖**页面上，选中要覆盖的参数的复选框，然后从**编辑覆盖值**菜单中选择**覆盖 StackSet 值**。

1. 在**覆盖 StackSet 参数值**页面上，进行更改，然后选择**保存更改**。
**注意**  
要将任何覆盖参数设置回使用在堆栈中指定的值，请检查所有参数，然后从**编辑覆盖值**菜单中选择**设置为 StackSet值**。这样将会在更新堆栈后移除所有覆盖值。

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 如果准备继续，则请选择**提交**。

   CloudFormation 会开始更新堆栈。在选择**提交**后打开的 StackSet 详细信息页面中查看堆栈的进度和状态。

## 覆盖堆栈参数（AWS CLI）
<a name="stackinstances-override-cli"></a>

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

**覆盖特定堆栈的参数**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-instances.html) AWS CLI 命令并指定 `--parameter-overrides` 选项。

   [自行管理权限] 对于 `--accounts` 选项，提供要为其覆盖堆栈参数值的账户 ID。

   ```
   aws cloudformation update-stack-instances --stack-set-name my-stackset \
     --parameter-overrides ParameterKey=Subnets,ParameterValue=subnet-1baa3351\\,subnet-27b86940 \
     --accounts account_id --regions us-east-1
   ```

   [服务托管权限] 对于 `--deployment-targets` 选项，提供要为其覆盖堆栈参数的组织根 ID、OU ID 或 AWS Organizations 账户 ID。在此示例中，我们使用 `ou-rcuk-1x5j1lwo` ID 覆盖 OU 中所有账户内的堆栈参数值。

   覆盖的参数值仅适用于当前位于目标 OU 及其子 OU 中的账户。将来添加到此目标 OU 及其子 OU 的账户将使用 StackSet 默认值，而不是覆盖值。

   ```
   aws cloudformation update-stack-instances --stack-set-name my-stackset \
     --parameter-overrides ParameterKey=Subnets,ParameterValue=subnet-1baa3351\\,subnet-27b86940 \
     --deployment-targets OrganizationalUnitIds=ou-rcuk-1x5j1lwo \
     --regions us-east-1
   ```

1. 通过运行 **describe-stack-set-operation** 命令来显示更新操作的状态和结果，验证堆栈上的参数值是否已被成功覆盖。对于 `--operation-id`，使用由您的 **update-stack-instances** 命令返回的操作 ID。

   ```
   aws cloudformation describe-stack-set-operation --operation-id operation_ID
   ```

# 从 CloudFormation StackSet 中删除堆栈
<a name="stackinstances-delete"></a>

您可以使用 CloudFormation 控制台或 AWS CLI 从堆栈集中删除堆栈。

**Topics**
+ [从 StackSet 中删除堆栈（控制台）](#stackinstances-delete-console)
+ [从 StackSet 中删除堆栈（AWS CLI）](#stackinstances-delete-cli)

**注意**  
删除顶层组织单元（OU）的堆栈后，该 OU 将不再是 StackSet 的目标。

## 从 StackSet 中删除堆栈（控制台）
<a name="stackinstances-delete-console"></a>

**删除堆栈**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 从导航窗格中，选择 **StackSets**。在 StackSet 页面上，选择 StackSet。

1. 选择 StackSet 后，从**操作**菜单中选择**从 StackSet 中删除堆栈**。

1. 在**设置部署选项**页面上，首先选择要删除堆栈的账户和区域。

   1. [自行管理权限] 对于**账户**，选择**在账户中部署堆栈**或**在组织单元中部署堆栈**。

      如果选择**在账户中部署堆栈**，请将目标账号粘贴到**目标账号**文本框中，并使用逗号分隔多个账号。

      如果选择**在组织单元中部署堆栈**，请将目标 OU ID 粘贴到**组织编号**文本框中，以将指定组织所属的所有账户作为目标。

   1. [服务管理权限] 对于**组织单位（OU）**，请指定目标 OU ID。
**重要**  
CloudFormation 将从指定目标 OU 及其子组织单元中删除的堆栈。

      对于**账户筛选条件类型**，您可以选择以下选项之一并提供账号，从而细化要删除堆栈的账户。
      + **无**（默认）– 从指定 OU 中的所有账户内删除堆栈。
      + **交集** – 仅从选定 OU 中特定单独账户内删除堆栈。
      + **差集** – 除特定账户外，从选定 OU 中的所有账户内删除堆栈。
      + **并集** – 从指定 OU 以及额外单独账户中删除堆栈。

   1. 对于**指定区域**，请选择要从其中的目标账户删除堆栈的区域。

1. 对于**部署选项**，请执行以下操作：
   + 对于**最大并发账户数**，请指定并发处理的账户数量。
   + 在**容错**中，请指定每个区域允许的账户失败次数上限。达到此次数限制后，该操作将停止，不会继续到其他区域。
   + 对于**保留堆栈**，启用此选项可在从 StackSet 中移除堆栈时保存堆栈及其关联的资源。资源会保持当前状态，但不再是 StackSet 的一部分。
   + 对于**区域并发**，请选择处理区域的方式：**顺序**（一次处理一个区域）或**并行**（并发处理多个区域）。
   + 对于**并发模式**，请选择在操作执行期间的并发行为方式。
     + **严格容错**：操作失败时降低账户并发级别，保持在**容错** \$11 范围内。
     + **软容错** – 即使失败，仍保持您指定的并发级别（**最大并发账户数**的值）。

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

1. 在**审核**页面上，审核您的选择。要进行更改，请在相关部分选择**编辑**。

1. 准备好从 StackSet 中删除堆栈后，请选择**提交**。

   完成堆栈删除后，您可在 StackSet 详细信息页面的**堆栈实例**选项卡上验证相关堆栈是否已从 StackSet 中删除。

## 从 StackSet 中删除堆栈（AWS CLI）
<a name="stackinstances-delete-cli"></a>

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

使用 **delete-stack-instances** 命令和 StackSet 的名称。

在这些示例中，我们使用 `--no-retain-stacks`选项，因为我们将不会保留任何堆栈。如果要保留堆栈及其资源，请使用 `--retain-stacks`，而不是 `--no-retain-stacks`。

对于 `--regions`，请指定要从中删除堆栈的 AWS 区域，例如 `us-west-2` 和 `us-east-1`。

使用 `--operation-preferences` 选项设置并发账户处理和其他首选项。这些示例使用基于计数的设置。请注意，`MaxConcurrentCount` 不得大于 `FailureToleranceCount` \$1 1。对于基于百分比的设置，请改用 `FailureTolerancePercentage` 或 `MaxConcurrentPercentage`。

**删除堆栈（自行管理权限）**  
在 `--accounts` 选项中，指定要从中删除堆栈的账户 ID。

```
aws cloudformation delete-stack-instances --stack-set-name my-stackset \
  --accounts account_ID_1 account_ID_2 \
  --regions us-west-2 us-east-1 \
  --no-retain-stacks \
  --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
```

**删除堆栈（服务管理权限）**  
在 `--deployment-targets` 中，指定要从中删除堆栈的组织根 ID 或组织单元（OU）ID。

**重要**  
CloudFormation 将从指定目标 OU 及其子组织单元中删除的堆栈。

```
aws cloudformation delete-stack-instances --stack-set-name my-stackset \
  --deployment-targets OrganizationalUnitIds=ou-rcuk-1x5jlwo,ou-rcuk-slr5lh0a \ 
  --regions us-west-2 us-east-1 \
  --no-retain-stacks \
  --operation-preferences MaxConcurrentCount=1,FailureToleranceCount=0
```

有关更多信息，请参阅《AWS CloudFormation API 参考》中的 [DeleteStackInstances](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_DeleteStackInstances.html)**。

在完成堆栈删除后，您也可以选择运行 **describe-stack-set-operation** 命令来显示堆栈删除操作的状态和结果，验证是否已从 StackSet 中删除堆栈。对于 `--operation-id`，使用由您的 **delete-stack-instances** 命令返回的操作 ID。

```
aws cloudformation describe-stack-set-operation --stack-set-name my-stackset \
  --operation-id ddf16f54-ad62-4d9b-b0ab-3ed8e9example
```

# 删除 CloudFormation StackSet
<a name="stacksets-delete"></a>

要删除 StackSet，您必须首先删除 StackSet 中的所有堆栈。有关如何删除所有堆栈的信息，请参阅[从堆栈集中删除堆栈](stackinstances-delete.md)。

**Topics**
+ [删除 StackSet（控制台）](#stacksets-delete-set)
+ [删除 StackSet（AWS CLI）](#stacksets-delete-set-cli)
+ [删除服务角色 (可选)](#stacksets-delete-roles)

## 删除 StackSet（控制台）
<a name="stacksets-delete-set"></a>

**删除 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在屏幕顶部的导航栏中，选择您在其中创建了 StackSet 的 AWS 区域。

1. 在 **StackSet** 页面上，选择 StackSet。

1. 选定 StackSet 后，从**操作**菜单中选择**删除 StackSet**。

1. 当系统提示您确认是否要删除该 StackSet 时，选择**删除 StackSet**。

## 删除 StackSet（AWS CLI）
<a name="stacksets-delete-set-cli"></a>

**注意**  
担任委派管理员时，您必须在命令中包含 `--call-as DELEGATED_ADMIN`。

**删除 StackSet**

1. 使用以下 **delete-stack-set** 命令。在提示您确认时，键入 **y**，然后按 **Enter**。

   ```
   aws cloudformation delete-stack-set --stack-set-name my-stackset
   ```

1. 通过运行 **list-stack-sets** 命令验证 StackSet 是否已删除。list-stack-sets 命令的结果应显示状态为 `DELETED` 的堆栈。

   ```
   aws cloudformation list-stack-sets
   ```

## 删除服务角色 (可选)
<a name="stacksets-delete-roles"></a>

如果您不再需要使用 CloudFormation 执行 StackSet 操作所需的 IAM 服务角色，则建议您删除这些角色。

*对于自行管理的堆栈集*，指您创建的角色。有关这些角色的更多信息，请参阅 [授予自行管理的权限](stacksets-prereqs-self-managed.md)。

*对于服务托管的 StackSet*，为 StackSet 自动创建的角色，在组织管理账户中的后缀为 `CloudFormationStackSetsOrgAdmin`，在每个目标账户中的后缀为 `CloudFormationStackSetsOrgMember`。有关更多信息，请参阅 [服务关联角色](stacksets-orgs-activate-trusted-access.md#stacksets-orgs-service-linked-roles)。

**删除服务角色（控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 从导航窗格中，选择**角色**，然后选中要删除的角色旁的复选框。

1. 在页面顶部的 **Role actions** 菜单中，选择 **Delete role**。

1. 在确认对话框中，选择 **Yes, Delete**（是的，删除）。如果确定，您就可以继续执行删除操作，即使仍在加载上次访问服务数据。

**删除服务角色（AWS CLI）**
+ 使用以下 **delete-role** 命令。在提示您确认时，键入 **y**，然后按 Enter。

  ```
  aws iam delete-role --role-name role name
  ```

有关删除角色的更多信息，请参阅《IAM 用户指南》**中的[删除角色或实例配置文件](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html)。

# 使用目标账户门防止 StackSet 部署失败
<a name="stacksets-account-gating"></a>

账户门是一项可选功能，用于 CloudFormation 在目标账户中开始执行 StackSet 操作之前验证该账户是否满足特定要求。此验证是通过充当先决条件检查的 AWS Lambda 函数执行。

账户门的一个常见示例是确认目标账户上无有效或未解决的 CloudWatch 警报。CloudFormation 将在您每次在目标账户中启动堆栈操作时调用此 Lambda 函数，并且仅在此函数返回 `SUCCEEDED` 代码时继续。如果 Lambda 函数返回 `FAILED` 状态，则 CloudFormation 不会继续执行请求的操作。如果您未配置账户门 Lambda 函数，CloudFormation 会跳过检查并继续执行操作。

如果您的目标账户的账户门检查失败，则失败的操作将计入您指定的堆栈容错数量或百分比。有关容错能力的更多信息，请参阅[StackSet 操作选项](stacksets-concepts.md#stackset-ops-options)。

账户门仅适用于 StackSets 操作。此功能不适用于 StackSet 外部的其他 CloudFormation 操作。

## 要求
<a name="stacksets-accountgating_reqs"></a>

必须满足以下要求才能使用账户门：
+ Lambda 函数必须命名为 `AWSCloudFormationStackSetAccountGate` 才能使用此功能。
+ **AWSCloudFormationStackSetExecutionRole** 要有权调用 Lambda 函数。如果没有这些权限，CloudFormation 会跳过账户门检查，并继续堆栈操作。
+ 必须在目标账户中添加 Lambda `InvokeFunction` 权限，账户门才能正常工作。目标账户信任策略必须具有与管理员账户的信任关系。下面是一个示例策略语句，可授予 Lambda `InvokeFunction` 权限。

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

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": [
                  "lambda:InvokeFunction"
              ],
              "Resource": "*"
          }
      ]
  }
  ```

------

## 用于创建 Lambda 函数的 CloudFormation 模板
<a name="stacksets-sample-accountgate"></a>

使用以下示例模板创建 Lambda `AWSCloudFormationStackSetAccountGate` 函数。要使用这些模板中的任意一种创建新堆栈，请参阅[通过 CloudFormation 控制台创建堆栈](cfn-console-create-stack.md)。


|  模板位置  |  说明  | 
| --- | --- | 
|  [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AccountGateSucceeded.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AccountGateSucceeded.yml)  |  创建实现 Lambda 账户门函数（将返回 `SUCCEEDED` 状态）的堆栈。  | 
|  [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AccountGateFailed.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/AccountGateFailed.yml)  |  创建实现 Lambda 账户门函数（将返回 `FAILED` 状态）的堆栈。  | 

# 为 CloudFormation StackSet 选择并发模式
<a name="concurrency-mode"></a>

**并发模式**是 [https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_StackSetOperationPreferences.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_StackSetOperationPreferences.html) 的参数，允许您选择并发级别在 StackSet 操作期间的行为方式。您可以在以下模式之间进行选择：
+ **严格容错**：此选项可动态降低并发级别，确保失败账户的数量永远不会超过**容错**值 \$11。初始实际并发数设置为**最大并发账户数**值或**容错**值 \$11 中的较小值。然后，实际并发数按失败次数成比例减少。这是默认行为。
+ **软容错**：此选项将**容错**与实际并发数分离。这允许 StackSet 操作在**最大并发账户数**值设置的并发级别上运行，而不管失败次数是多少。

**严格容错**会降低 StackSet 操作失败时的部署速度，因为每次失败都会降低并发数。**软容错**会优先考虑部署速度，同时仍能利用 CloudFormation 安全功能。这可以让您查看和解决因常见问题而导致的 StackSet 操作失败，例如与现有资源、服务配额和权限有关的问题。

有关 StackSets 堆栈操作失败的更多信息，请参阅 [堆栈操作失败的常见原因](stacksets-troubleshooting.md#common-reasons-for-stack-operation-failure)。

有关**最大并发账户数**和**容错**的更多信息，请参阅 [StackSet 操作选项](stacksets-concepts.md#stackset-ops-options)。

## 每种并发模式的工作原理
<a name="concurrency-mode-example"></a>

下图直观地显示了每种**并发模式**在 StackSet 操作期间的工作原理。节点字符串表示对单个 AWS 区域 的部署，且每个节点都是一个目标 AWS 账户。

**严格容错**  
如果使用**严格容错**的 StackSet 操作将**容错**值设置为 5，**最大并发账户数**的值设置为 10 时，实际并发数为 6。实际并发数为 6，因为 5\$11 的**容错**值低于**最大并发账户数**的值。  
下图显示了**容错**值对**最大并发账户数**值的影响，以及它们对 StackSet 操作实际并发数的影响：  

![\[使用严格容错的 StackSet 操作。容错率为 5，最大并发账户数为 10，并发水平为 6。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-1.png)

当部署开始且出现失败的堆栈实例时，为了提供安全的部署体验，实际并发数会降低。当 StackSets 部署 1 个堆栈实例失败时，实际并发数从 6 个降低到 5 个。  

![\[该使用严格容错的 StackSet 操作有 2 次成功部署和 1 次失败。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-2.png)


![\[由于有一次失败，所以这个使用严格容错的 StackSet 操作的实际并发数降至 5。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-3.png)

**严格容错**模式按失败堆栈实例的数量成比例降低实际并发数。在以下示例中，当 StackSets 再部署的 2 个堆栈实例失败时，实际并发数从 5 个减少到 3 个，从而使失败的堆栈实例总数降至 3 个。  

![\[该使用严格容错的 StackSet 操作现在有 3 次失败的部署。并发水平已降至 3。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-4.png)

如果失败的堆栈实例数等于定义的**容错**值 \$11 时，StackSets 的 StackSet 操作失败。在以下示例中，当有 6 个失败的堆栈实例且**容错**值为 5 时，StackSets 操作失败。  

![\[该使用严格容错的 StackSet 操作现在有 6 次失败的部署。该 StackSet 操作失败。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-5.png)

在此示例中，CloudFormation 在停止 StackSet 操作之前部署了 9 个堆栈实例（3 个成功，6 个失败）。

**软容错**  
当使用**软容错**的 StackSet 操作将**容错**值设置为 5，**最大并发账户数**的值设置为 10 时，实际并发数为 10。  

![\[使用软容错的 StackSet 操作。容错率为 5，最大并发账户数和实际并发水平均为 10。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-1.png)

当部署开始且出现失败的堆栈实例时，实际并发数不会改变。在以下示例中，1 个堆栈操作失败，但实际并发数仍为 10。  

![\[该使用软容错的 StackSet 操作出现第一次失败。实际并发水平仍为 10。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-2.png)

即使再有 2 个堆栈实例失败，实际并发数仍保持在 10。  

![\[该使用软容错的 StackSet 操作现在有 2 次成功和 3 次失败，但实际并发数仍为 10。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-3.png)

当失败的堆栈实例超过**容错**值时，StackSets 的 StackSet 操作失败。在以下示例中，当有 6 个失败的堆栈实例且**容错**计数为 5 时，StackSets 操作失败。不过，在并发队列中的其余操作完成之前，操作不会结束。  

![\[该使用软容错的 StackSet 操作有 6 次失败，但必须完成并发队列中剩下的操作。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-4.png)

StackSets 继续部署已在并发队列中的堆栈实例。这意味着失败的堆栈实例的数量可能高于**容错**。在以下示例中，有 8 个失败的堆栈实例，因为尽管 StackSet 操作的**容错**已达到 5，但并发队列仍有 7 个操作要执行。  

![\[该 StackSet 操作总计有 8 次失败，因为在达到失败阈值后，队列中还剩 7 个部署。\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-5.png)

在此示例中，StackSets 在停止堆栈操作之前部署了 15 个堆栈实例（7 个成功，8 个失败）。

## 根据部署速度在“严格容错”和“软容错”之间进行选择
<a name="concurrency-mode-comparison"></a>

在**严格容错**模式和**软容错**模式之间进行选择，具体取决于 StackSet 部署的首选速度以及允许的部署失败次数。

下表显示了每种并发模式如何处理在尝试部署总共 1000 个堆栈实例时失败的 StackSet 操作。在每种情况下，**容错**的值设置为 100 个堆栈实例，**最大并发账户数**的值设置为 250 个堆栈实例。

虽然 StackSets 实际上以滑动窗口的形式对账户进行排队（参阅 [每种并发模式的工作原理](#concurrency-mode-example)），但此示例通过分批显示操作的方式来演示每种模式的速度。

### 严格容错
<a name="concurrency-mode-comparison-strict"></a>

这个示例使用**严格容错**模式，相对于前面每个批次中发生的失败数量，降低了实际并发数。每个批次有 20 个失败的实例，这会将下一个批次的实际并发数降低 20，直到 StackSet 操作达到**容错**值 100。

在下表中，第一批的初始实际并发数为 101 个堆栈实例。实际并发数为 101，因为这是**最大并发账户数**（250）和**容错**（100）\$11 中的较低值。每个批次包含 20 个失败的堆栈实例部署，这会使后续每个批次的实际并发数降低 20 个堆栈实例。


| **严格容错** | **第 1 批** | **第 2 批** | **第 3 批** | **第 4 批** | **第 5 批** | **第 6 批** | 
| --- | --- | --- | --- | --- | --- | --- | 
| 实际并发数 | 101 | 81 | 61 | 41 | 21 | - | 
| 失败的实例数 | 20 | 20 | 20 | 20 | 20 | - | 
| 成功的堆栈实例数 | 81 | 61 | 41 | 21 | 1 | - | 

当 StackSet 操作达到 100 个堆栈实例的**容错**时，使用**严格容错**的操作分五批完成了 305 个堆栈实例部署。StackSet 操作在失败之前成功部署了 205 个堆栈实例。

### 软容错
<a name="concurrency-mode-comparison-soft"></a>

此示例使用**软容错**模式，无论失败实例的数量如何，都将保持相同的实际并发数，该值由 250 个堆栈实例的**最大并发账户**值定义。在达到 100 个实例的**容错**值之前，StackSet 操作会保持相同的实际并发数。

在下表中，第一批的初始实际并发数为 250 个堆栈实例。实际并发数为 250，因为**最大并发账户数**的值设置为 250，且**软容错**模式允许 StackSets 使用此值作为实际并发数，不管失败数量是多少。虽然此示例的每个批次中都有 50 个失败的操作，但实际并发数仍不受影响。


| **软容错** | **第 1 批** | **第 2 批** | **第 3 批** | **第 4 批** | **第 5 批** | **第 6 批** | 
| --- | --- | --- | --- | --- | --- | --- | 
| 实际并发数 | 250 | 250 | - | - | - | - | 
| 失败的实例数 | 50 | 50 | - | - | - | - | 
| 成功的堆栈实例数 | 200 | 200 | - | - | - | - | 

通过相同的**最大并发账户**值和**容错**值，使用**软容错**模式的操作分两批完成了 500 个堆栈实例部署。StackSet 操作在失败之前成功部署了 400 个堆栈实例。

## 选择并发模式（控制台）
<a name="concurrency-mode-console"></a>

创建或更新 StackSet 时，在**设置部署选项**页面上，为**并发模式**选择**严格容错**或**软容错**。

## 选择并发模式（AWS CLI）
<a name="concurrency-mode-cli"></a>

您可以通过以下 StackSets 命令使用 `ConcurrencyMode` 参数：
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-instances.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/delete-stack-instances.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/import-stacks-to-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/import-stacks-to-stack-set.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-instances.html)
+ [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/update-stack-set.html)

这些命令有一个名为 `--operation-preferences` 的现有参数，可以使用 `ConcurrencyMode` 设置。`ConcurrencyMode` 可以设置为以下任一值：
+ `STRICT_FAILURE_TOLERANCE`
+ `SOFT_FAILURE_TOLERANCE`

以下示例使用 `STRICT_FAILURE_TOLERANCE` `ConcurrencyMode` 创建堆栈实例，`FailureToleranceCount` 设置为 10，`MaxConcurrentCount` 设置为 5。

```
aws cloudformation create-stack-instances \
  --stack-set-name example-stackset \
  --accounts 123456789012 \
  --regions eu-west-1  \
  --operation-preferences ConcurrencyMode=STRICT_FAILURE_TOLERANCE,FailureToleranceCount=10,MaxConcurrentCount=5
```

**注意**  
有关创建和更新 StackSet 的详细步骤，请参阅以下主题：  
[创建 StackSets（自行管理权限）](stacksets-getting-started-create-self-managed.md)
[创建 StackSets（服务托管权限）](stacksets-orgs-associate-stackset-with-org.md)
[更新 StackSets](stacksets-update.md)

# 对 CloudFormation StackSets 进行偏差检测
<a name="stacksets-drift"></a>

即使在您通过 CloudFormation 管理堆栈及其包含的资源时，用户也可以在 CloudFormation 外部更改这些资源。用户可以使用创建资源的底层服务直接编辑资源。通过对 StackSet 执行偏移检测，您可以确定属于该 StackSet 的任何堆栈实例是否与它们的预期配置不同或*已偏移*。

**Topics**
+ [CloudFormation 如何对 StackSet 执行偏移检测](#stacksets-drift-how)
+ [检测 StackSet 上的偏移（控制台）](#stacksets-drift-console-procedure)
+ [检测 StackSet 上的偏移（AWS CLI）](#stacksets-drift-cli-procedure)
+ [停止对 StackSet 的偏移检测](#stacksets-drift-stop)

## CloudFormation 如何对 StackSet 执行偏移检测
<a name="stacksets-drift-how"></a>

在 CloudFormation 对 StackSet 执行偏移检测时，它对与 StackSet 中的每个堆栈实例关联的堆栈执行偏移检测。为此，CloudFormation 将堆栈中的每个资源的当前状态与该资源的预期状态进行比较，该状态是堆栈的模板以及任何指定的输入参数中定义的。如果资源的当前状态不同于预期状态，则认为该资源已偏离。如果堆栈中的一个或多个资源已偏离，则将堆栈本身视为已偏离，并将与堆栈关联的堆栈实例也视为已偏离。如果 StackSet 中的一个或多个堆栈实例已偏移，则将 StackSet 本身视为已偏移。

偏差检测确定非托管更改；即，在 CloudFormation 外部对堆栈进行的更改。直接通过 CloudFormation 对堆栈进行的更改（而不是在 StackSet 级别）不会被视为偏移。例如，假设您具有一个与 StackSet 的堆栈实例关联的堆栈。如果您使用 CloudFormation 更新该堆栈以使用不同的模板，则不会将其视为偏移，即使该堆栈现在具有与属于 StackSet 的任何其他堆栈不同的模板。这是因为，该堆栈仍与它在 CloudFormation 中的预期模板和参数配置匹配。

有关 CloudFormation 如何对堆栈执行偏差检测的详细信息，请参阅[使用偏移检测功能检测堆栈和资源的非托管配置更改](using-cfn-stack-drift.md)。

由于分别 CloudFormation 对每个堆栈执行偏差检测，因此，它在确定堆栈是否偏离时考虑任何覆盖的参数值。有关在堆栈实例中覆盖模板参数的更多信息，请参阅[覆盖 CloudFormation StackSet 中的堆栈参数值](stackinstances-override.md)。

如果[直接](using-cfn-stack-drift.md)对与堆栈实例关联的堆栈执行偏差检测，则无法在 **StackSets** 控制台页面中查看这些偏差结果。

## 检测 StackSet 上的偏移（控制台）
<a name="stacksets-drift-console-procedure"></a>

**检测 StackSet 上的偏移**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在 **StackSet** 页面上，选择要执行偏移检测的 StackSet。

1. 从 **Actions (操作)** 菜单中，选择 **Detect drifts (检测偏差)**。

   CloudFormation 会显示一个信息栏，指示已为选定堆栈启动偏移检测。

1. 可选：要监控偏差检测操作进度，请执行以下操作：

   1. 选择 StackSet 名称以显示 **Stackset 详细信息**页面。

   1. 选择 **Operations (操作)** 选项卡，选择偏差检测操作，然后选择 **View drift details (查看偏差详细信息)**。

   CloudFormation 显示 **Operation details** (操作详细信息) 对话框。

1. 请耐心等待，直到 CloudFormation 完成偏差检测操作。偏移检测操作完成后，CloudFormation 会更新堆栈的**偏移状态**和**上次偏移检查时间**。这些字段在所选 StackSet 的 **StackSet 详细信息**页面的**概述**选项卡上列出。

   偏移检测操作可能需要一些时间，具体取决于 StackSet 中包含的堆栈实例数量以及 StackSet 中包含的资源数量。您一次只能在一个 StackSet 上运行一个偏移检测操作。即使您关闭信息栏，CloudFormation 也会继续执行偏差检测操作。

1. 要查看 StackSet 中的堆栈实例的偏移检测结果，请选择**堆栈实例**选项卡。

   **Stack name (堆栈名称)** 列列出与每个堆栈实例关联的堆栈的名称，**Drift status (偏差状态)** 列列出该堆栈的偏差状态。如果堆栈的一个或多个资源已偏离，则认为堆栈已偏离。

1. 要查看与特定堆栈实例关联的堆栈的偏差检测结果，请执行以下操作：

   1. 选择**操作**选项卡。

   1. 选择要查看其偏差检测结果的偏差操作。拆分面板将显示堆栈实例状态和所选操作的原因。对于偏差操作，状态原因列显示堆栈实例的偏差状态。

   1. 选择要查看其偏差详细信息的堆栈实例，然后选择**查看资源偏差**。在**资源偏差**页面上的**资源偏差状态**中，会列出每个堆栈资源及其偏差状态，以及最后一次在资源上启动偏差检测的时间。将会显示每个资源的逻辑 ID 和物理 ID，以帮助您识别它们。

1. 您可以使用**偏差状态**列根据资源偏差状态对资源排序。

   查看已修改资源的详细信息：

   1. 选定资源后，选择**查看偏差详细信息**。

     CloudFormation 会显示该资源的偏差详细信息页面。此页面列出资源的差异。其中还列出资源的预期和当前属性值。
**注意**  
如果堆栈所属的区域和账户与您当前登录的地区和账户不同，则**检测偏差**按钮将被禁用，您将无法查看详细信息。

## 检测 StackSet 上的偏移（AWS CLI）
<a name="stacksets-drift-cli-procedure"></a>

要使用 AWS CLI 在整个堆栈上检测偏差，请使用以下步骤：

**检测 StackSet 上的偏移**

1. 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/detect-stack-set-drift.html) 命令检测整个 StackSet 及其关联堆栈实例上的偏移。

   以下示例中，对 `stack-set-drift-example` StackSet 启动偏移检测。

   ```
   aws cloudformation detect-stack-set-drift \
       --stack-set-name stack-set-drift-example
   ```

   输出：

   ```
   {
       "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
   }
   ```

1. 由于 StackSet 偏移检测操作可能是长时间运行的操作，因此，请使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set-operation.html) 命令监控偏移操作的状态。该命令使用 **detect-stack-set-drift** 命令返回的 StackSet 操作 ID。

   以下示例使用上一示例中的操作 ID 返回有关 StackSet 偏移检测操作的信息。在此示例中，该操作仍在运行。在与该 StackSet 关联的七个堆栈实例中，发现一个堆栈实例已偏移，两个实例正在进行同步，而其余四个堆栈实例仍在进行偏移检测。由于一个实例已偏移，StackSet 本身的偏移状态现在为 `DRIFTED`。

   ```
   aws cloudformation describe-stack-set-operation \
       --stack-set-name stack-set-drift-example \
       --operation-id c36e44aa-3a83-411a-b503-cb611example
   ```

   输出：

   ```
   {
       "StackSetOperation": {
           "Status": "RUNNING",
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "OperationPreferences": {
               "RegionOrder": []
           },
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 1,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:34:28.543Z",
               "InSyncStackInstancesCount": 2,
               "InProgressStackInstancesCount": 4,
               "DriftStatus": "DRIFTED",
               "FailedStackInstancesCount": 0
           },
           "Action": "DETECT_DRIFT",
           "CreationTimestamp": "2019-12-04T20:33:13.673Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

   该示例稍后执行相同的命令，以显示在偏差检测操作完成后返回的信息。在与该 StackSet 关联的总共 7 个堆栈实例中，有两个实例已偏移，从而使 StackSet 本身的偏移状态显示为 `DRIFTED`。

   ```
   aws cloudformation describe-stack-set-operation \
       --stack-set-name stack-set-drift-example \
       --operation-id c36e44aa-3a83-411a-b503-cb611example
   ```

   输出：

   ```
   {
       "StackSetOperation": {
           "Status": "SUCCEEDED",
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "OperationPreferences": {
               "RegionOrder": []
           } 
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "EndTimestamp": "2019-12-04T20:37:32.829Z",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 2,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z",
               "InSyncStackInstancesCount": 5,
               "InProgressStackInstancesCount": 0,
               "DriftStatus": "DRIFTED",
               "FailedStackInstancesCount": 0
           },
           "Action": "DETECT_DRIFT",
           "CreationTimestamp": "2019-12-04T20:33:13.673Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "OperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

1. 在 StackSet 偏移检测操作完成后，请使用 **describe-stack-set**、**list-stack-instances**、**describe-stack-instance** 和 **list-stack-instance-resource-drifts** 命令查看结果。

   [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-set.html) 命令包括 **describe-stack-set-operation** 命令返回的相同详细偏差信息。

   ```
   aws cloudformation describe-stack-set \
       --stack-set-name stack-set-drift-example
   ```

   输出：

   ```
   {
       "StackSet": {
           "Status": "ACTIVE",
           "Description": "Demonstration of drift detection on stack sets.",
           "Parameters": [],
           "Tags": [
               {
                   "Value": "Drift detection",
                   "Key": "Feature"
               }
           ], 
           "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
           "Capabilities": [],
           "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
           "StackSetDriftDetectionDetails": {
               "DriftedStackInstancesCount": 2,
               "TotalStackInstancesCount": 7,
               "LastDriftCheckTimestamp": "2019-12-04T20:36:55.612Z",
               "InProgressStackInstancesCount": 0,
               "DriftStatus": "DRIFTED",
               "DriftDetectionStatus": "COMPLETED",
               "InSyncStackInstancesCount": 5,
               "FailedStackInstancesCount": 0
           },
           "StackSetARN": "arn:aws:cloudformation:us-east-1:123456789012:stackset/stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22example",
           "TemplateBody": [details omitted],
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22ebexample",
           "StackSetName": "stack-set-drift-example"
       }
   }
   ```

   您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instances.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instances.html) 命令返回有关与 StackSet 关联的堆栈实例的摘要信息，包括每个堆栈实例的偏移状态。

   在本示例中，通过对示例 StackSet 执行 **list-stack-instances** 并将偏移状态筛选设置为 `DRIFTED`，我们可以确定哪两个堆栈实例具有 `DRIFTED` 偏移状态。

   ```
   aws cloudformation list-stack-instances \
       --stack-set-name stack-set-drift-example \
       --filters Name=DRIFT_STATUS,Values=DRIFTED
   ```

   输出：

   ```
   {
   "Summaries": [
           {
   "StackId": "arn:aws:cloudformation:eu-west-1:123456789012:stack/StackSet-stack-set-drift-example-b0fb6083-60c0-4e39-af15-2f071e0db90c/0e4f0940-16d4-11ea-93d8-0641cexample",
               "Status": "CURRENT",
               "Account": "012345678910",
               "Region": "eu-west-1",
               "LastDriftCheckTimestamp": "2019-12-04T20:37:32.687Z",
               "DriftStatus": "DRIFTED",
               "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
               "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
           },
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example",
               "Status": "CURRENT",
               "Account": "123456789012",
               "Region": "us-east-1",
               "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z",
               "DriftStatus": "DRIFTED",
               "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
               "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
           },
           
           [additional stack instances omitted]
    
       ]
   }
   ```

   [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-instance.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-instance.html) 命令也返回该信息，但仅为单个堆栈实例返回该信息，如以下示例所示。

   ```
   aws cloudformation describe-stack-instance \
       --stack-set-name stack-set-drift-example \
       --stack-instance-account 012345678910 --stack-instance-region us-east-1
   ```

   输出：

   ```
   {
       "StackInstance": {
           "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/StackSet-stack-set-drift-example-b7fde68e-e541-44c2-b33d-ef2e2988071a/008e6030-16d4-11ea-8090-12f89example",
           "Status": "CURRENT",
           "Account": "123456789012",
           "Region": "us-east-1",
           "ParameterOverrides": [],
           "DriftStatus": "DRIFTED",
           "LastDriftCheckTimestamp": "2019-12-04T20:34:28.275Z",
           "StackSetId": "stack-set-drift-example:bd1f4017-d4f9-432e-a73f-8c22eexample",
           "LastOperationId": "c36e44aa-3a83-411a-b503-cb611example"
       }
   }
   ```

1. 在确定哪些堆栈实例已偏离后，您可以使用有关 **list-stack-instances** 或 **describe-stack-instance** 命令返回的堆栈实例的信息以运行 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instance-resource-drifts.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-instance-resource-drifts.html) 命令。该命令会返回详细信息，说明对于特定偏差操作而言，堆栈中的哪些资源已产生偏差。

   以下示例使用 `--stack-instance-resource-drift-statuses` 参数来请求在上一个偏差操作示例中已修改或删除的资源的堆栈偏差信息。该请求会返回有关已修改的一个资源的信息，包括有关其中两个属性及其已更改值的详细信息。不会删除任何资源。

   ```
   aws cloudformation list-stack-instance-resource-drifts \
       --stack-set-name my-stack-set-with-resource-drift \
       --stack-instance-account 123456789012 \
       --stack-instance-region us-east-1 \
       --operation-id c36e44aa-3a83-411a-b503-cb611example \
       --stack-instance-resource-drift-statuses MODIFIED DELETED
   ```

   输出：

   ```
   {
       "Summaries": [
           {
               "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/my-stack-set-with-resource-drift/489e5570-df85-11e7-a7d9-50example",
               "ResourceType": "AWS::SQS::Queue",
               "Timestamp": "2018-03-26T17:23:34.489Z",
               "PhysicalResourceId": "https://sqs.us-east-1.amazonaws.com/123456789012/my-stack-with-resource-drift-Queue-494PBHCO76H4",
               "StackResourceDriftStatus": "MODIFIED",
               "PropertyDifferences": [
                   {
                       "PropertyPath": "/DelaySeconds",
                       "ActualValue": "120",
                       "ExpectedValue": "20",
                       "DifferenceType": "NOT_EQUAL"
                   },
                   {
                       "PropertyPath": "/RedrivePolicy/maxReceiveCount",
                       "ActualValue": "12",
                       "ExpectedValue": "10",
                       "DifferenceType": "NOT_EQUAL"
                   }
               ],
               "LogicalResourceId": "Queue"
           }
       ]
   }
   ```

## 停止对 StackSet 的偏移检测
<a name="stacksets-drift-stop"></a>

由于对 StackSet 的偏移检测可能是长时间运行的操作，因此，在某些情况下，您可能希望停止当前对 StackSet 运行的偏移检测操作。

**停止对 StackSet 的偏移检测（控制台）**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 在 **StackSet** 页面上，选择 StackSet 的名称。

   CloudFormation 将显示所选 StackSet 的 **StackSet 详细信息**页面。

1. 在 **StackSets details (堆栈集详细信息)** 页面上，选择 **Operations (操作)** 选项卡，然后选择偏差检测操作。

1. 选择 **Stop operation (停止操作)**。

**停止对 StackSet 的偏移检测（AWS CLI）**
+ 使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/stop-stack-set-operation.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/stop-stack-set-operation.html) 命令。您必须同时提供 StackSet 名称和偏移检测 StackSet 操作的操作 ID。

  ```
  aws cloudformation stop-stack-set-operation \
      --stack-set-name stack-set-drift-example \
      --operation-id 624af370-311a-11e8-b6b7-500cexample
  ```

# 将堆栈导入 CloudFormation StackSet
<a name="stacksets-import"></a>

堆栈导入操作可以将现有堆栈导入新的或现有的 StackSet，因此您可以通过一次操作将现有堆栈迁移到 StackSet。

对于*自行管理*的 StackSets，导入操作可以导入管理员账户或不同目标账户和 AWS 区域 中的堆栈。对于*服务托管*的 StackSets，导入操作可以导入与管理账户相同的 AWS Organizations 中的任何堆栈。

以下是将堆栈导入 StackSets 时的注意事项和限制：
+ 导入操作使用内联堆栈 ID 时最多可以导入 10 个堆栈，使用 Amazon S3 对象时最多可以导入 200 个堆栈。
+  不支持 `NoEcho` 属性。包含 `NoEcho` 的堆栈不会通过 StackSet 导入功能导入到新的 StackSet 中。
+ 堆栈只能属于一个 StackSet。
+ 在堆栈导入操作中将标签明确指定为参数，就可以将堆栈标签实现到 StackSet。
+ 堆栈的自定义参数覆盖在导入操作期间不受影响。
+ 不能使用**编辑 StackSet 详细信息**选项更新已导入堆栈实例的参数。必须使用**覆盖 StackSet 参数**。有关覆盖参数的更多信息，请参阅[覆盖堆栈参数](stackinstances-override.md)。
+ StackSets 配额和堆栈实例在导入堆栈时适用。有关限额的更多信息，请参阅[了解 CloudFormation 配额](cloudformation-limits.md)。

**Topics**
+ [CloudFormation StackSets 的自行管理堆栈导入](self-managed-import.md)
+ [CloudFormation StackSets 的服务托管堆栈导入](service-managed-import.md)
+ [恢复堆栈导入至 CloudFormation StackSet](revert-stackset-import.md)

# CloudFormation StackSets 的自行管理堆栈导入
<a name="self-managed-import"></a>

CloudFormation 堆栈导入操作可以将现有堆栈导入新的或现有的 StackSet，因此您通过一次操作就可以将现有堆栈迁移到 StackSet。通过使用堆栈导入，您可以避免停机和中断，而无需删除和重新创建这些资源。将堆栈导入 StackSet后，原来的堆栈将成为指定的 StackSet 的堆栈实例。

**自行管理式堆栈导入的注意事项**
+ 堆栈导入操作需要在其中创建 StackSet 的管理员账户和包含堆栈的目标账户。
+ 目标账户必须有权使用 `GetTemplate` 操作，输入堆栈 ID 或 ARN。因此，您的管理员账户必须被授予 **AWSCloudFormationStackSetAdministrationRole** 或 **AWSCloudFormationStackSetsExectionRole** 权限。

**Topics**
+ [将现有堆栈导入新 StackSet（控制台）](#import-stacks-to-stack-set)
+ [将现有堆栈导入现有 StackSet（控制台）](#import-stack-to-existing-stackset)
+ [将堆栈导入 StackSet（AWS CLI）](#importing-stack-to-stackset.cli)

## 将现有堆栈导入新 StackSet（控制台）
<a name="import-stacks-to-stack-set"></a>

开始之前，请标识要导入的堆栈。

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSets (堆栈集)** 页面顶部，选择 **Create StackSet (创建堆栈集)**。

1. 在**选择模板**页面上，通过以下选项之一指定模板，然后选择**下一步**。
   + 选择 **Amazon S3 URL**，然后在文本框中指定您的模板的 URL。
   + 选择 **Upload a template file**（上传模板文件），然后浏览您的模板。
   + 选择 **From stack ID**（从堆栈 ID），然后输入堆栈 ID。

1. 在**指定 StackSet 详细信息**页面中，输入要创建的 StackSet 的名称，然后选择**下一步**。

   （可选）输入 StackSet 的描述。

1. 在**配置堆栈集选项**页面上，查看您的选项，然后选择**下一步**。

1. 在**设置部署选项**页面上，选择**将堆栈导入堆栈集**。

1. 在 **Stacks to import**（要导入的堆栈）字段中，输入要导入的堆栈的堆栈 ID。例如 `arn:aws:cloudformation:us-east-1:123456789012:stack/StackToImport/f449b250-b969-11e0-a185-5081d0136786`。

   （可选）选择**添加另一个堆栈 ID**，然后输入您要导入的另一个堆栈的堆栈 ID。每个堆栈导入操作最多可添加 10 个堆栈。

1. 查看您的部署选项，然后选择**下一步**。

1. 在**审核**页面上，检查您的选择和 StackSet 的属性。准备好将堆栈导入 StackSet 后，选择**提交**。

**结果**：导入的堆栈现在是指定 StackSet 的堆栈实例。要了解有关堆栈导入状态的更多信息，请参阅 [StackSets 状态代码](stacksets-concepts.md#stackset-status-codes)。

## 将现有堆栈导入现有 StackSet（控制台）
<a name="import-stack-to-existing-stackset"></a>

开始之前，请标识要导入的堆栈。

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSet** 页面中，选择要导入堆栈的 StackSet。

1. 选择 StackSet 后，从**操作**菜单中选择**将堆栈添加到 StackSet**。

1. 在**设置部署选项**页面中，选择**将堆栈导入堆栈集**，然后在**要导入的堆栈**字段中输入要导入的堆栈的堆栈 ID。例如 `arn:aws:cloudformation:us-east-1:123456789012:stack/StackToImport/f449b250-b969-11e0-a185-5081d0136786`。

   （可选）选择**添加另一个堆栈 ID**，然后输入您要导入的另一个堆栈的堆栈 ID。每个堆栈导入操作最多可添加 10 个堆栈。

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

1. 在**指定覆盖**页面上，查看您的选择，然后选择**下一步**。

1. 在**审核**页面上，检查您的选择和 StackSet 的属性。准备好创建 StackSet 后，选择**提交**。

**结果**：导入的堆栈现在是指定 StackSet 的堆栈实例。要了解有关堆栈导入状态的更多信息，请参阅 [StackSets 状态代码](stacksets-concepts.md#stackset-status-codes)。

## 将堆栈导入 StackSet（AWS CLI）
<a name="importing-stack-to-stackset.cli"></a>

**将现有堆栈导入新 StackSet**  
以下 `create-stack-set` 命令将创建一个 StackSet 并导入指定堆栈。要导入的堆栈由其 ARN 标识。将占位符文本替换为您自己的信息。

```
aws cloudformation create-stack-set \
  --stack-set-name MyStackSet \
  --stack-id arn:aws:cloudformation:us-east-1:123456789012:stack/StackToImport/466df9e0-0dff-08e3-8e2f-5088487c4896 \
  --administration-role-arn arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole \
  --execution-role-name AWSCloudFormationStackSetExecutionRole
```

**将现有堆栈导入现有 StackSet**  
以下 `import-stacks-to-stack-sets` 命令会将指定堆栈导入到 *MyStackSet* StackSet。要导入的堆栈由其 ARN 标识。将占位符文本替换为您自己的信息。

```
aws cloudformation import-stacks-to-stack-set \
  --stack-set MyStackSet \
  --stack-ids arn:aws:cloudformation:us-east-1:123456789012:stack/StackToImport/f449b250-b969-11e0-a185-5081d0136786
```

要指定多个堆栈，请使用以下格式作为 `--stack-ids` 选项的值。

```
--stack-ids "arn_1" "arn_2"
```

**将导入的堆栈克隆到其他区域和账户**  
运行 `create-stack-instances` 命令会将堆栈实例添加到 StackSet。将占位符文本替换为您自己的信息。

```
aws cloudformation create-stack-instances \
  --stack-set-name MyStackSet \
  --accounts '["account_ID_1","account_ID_2"]' \
  --regions '["region_1","region_2"]'
```

# CloudFormation StackSets 的服务托管堆栈导入
<a name="service-managed-import"></a>

CloudFormation 堆栈导入操作可以将现有堆栈导入新的或现有的 StackSet，因此您通过一次操作就可以将现有堆栈迁移到 StackSet。StackSets 扩展了堆栈的功能，因此您可以在一次操作中跨多个账户和区域创建、更新或删除堆栈。

**服务托管式堆栈导入的注意事项**
+ 堆栈导入操作需要一个管理账户或委派管理员账户，您可以在其中管理关联的 AWS Organizations 组织，例如使用 StackSets 启用信任访问。
+ 目标账户必须是由管理账户或委派管理员账户管理的 AWS Organizations 成员。
+ 目标堆栈位于其中一个目标 OU 中。
+ 目标账应为 AWS Organizations 的成员。
+ AWS Organizations 访问对于 Organizations 应处于 `ACTIVATED` 状态。
+ 所导入的堆栈应位于任意成员账户中，而不是管理账户中。

**Topics**
+ [将服务托管堆栈导入新 StackSet（控制台）](#import-service-managed-stack-to-new-stackset)
+ [创建服务托管堆栈并将其导入现有 StackSet（控制台）](#import-service-managed-stack-to-existing-stackset)
+ [将服务托管堆栈导入现有 StackSet（控制台）](#import-service-managed-stack-to-existing-stackset-console)
+ [将服务托管堆栈导入 StackSet（AWS CLI）](#import-service-managed-stack-to-stackset.cli)

## 将服务托管堆栈导入新 StackSet（控制台）
<a name="import-service-managed-stack-to-new-stackset"></a>

使用 AWS 管理控制台 将堆栈导入新 StackSet

要将新堆栈导入 StackSet，请标识包含要导入资源的堆栈。

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSets (堆栈集)** 页面顶部，选择 **Create StackSet (创建堆栈集)**。

1. 在**选择模板**页面上，执行以下操作：

   1. 在**堆栈集权限模型**中，选择**服务托管权限**。

   1. 在**先决条件 – 准备模板**中，选择**模板已准备就绪**，然后使用以下选项之一选择您的模板：
      + 对于 **Amazon S3 URL**，请在“Amazon S3 URL”字段中输入您的 **Amazon S3 URL**。
      + 在**上传模板文件**中，选择本地计算机中的 CloudFormation 模板。

   接受您的设置并选择 **Next**（下一步）。

1. 在**指定堆栈集详细信息**页面上，执行以下操作：

   1. 在 **StackSet 名称**框中输入 StackSet 名称。

   1. （可选）在 **StackSet description**（堆栈集描述）部分中输入描述。

   在**配置堆栈集选项**页面上，查看您的选项，然后选择**下一步**。

1. 在**设置部署选项**页面上，执行以下操作：

   1. 在**将堆栈添加到堆栈集**中，选择**将堆栈导入堆栈集**。

   1. 对于 **Stacks to import**（要导入的堆栈），选择堆栈导入方法。

      1. 对于 **Stack ID**（堆栈 ID），输入您的堆栈 ID。

      1. 对于**堆栈 URL**，请输入该 Amazon S3 URL。

1. 在**关联组织单位**下，执行以下操作：

   1. 选择**与组织关联**以使用根 OU。

   1. 选择**与组织单位（OU）关联**以输入要导入堆栈的父 OU ID。例如，如果 `Stack 1` 和 `Stack 2` 位于 `OU1` 下，而 `Stack 3` 位于 `OU2` 下，则输入 `OU1` 和 `OU2`。

   接受您的设置并选择 **Next**（下一步）。

1. 在 **Review**（审核）页面上，检查您的设置，然后选择 **Submit**（提交）。

## 创建服务托管堆栈并将其导入现有 StackSet（控制台）
<a name="import-service-managed-stack-to-existing-stackset"></a>

要将现有堆栈导入新 StackSet，请标识包含要导入资源的堆栈。

**创建 StackSet 并导入堆栈**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从导航窗格中，选择 **StackSets**。

1. 在 **StackSets (堆栈集)** 页面顶部，选择 **Create StackSet (创建堆栈集)**。

1. 在**选择模板**页面上，执行以下操作：

   1. 在**堆栈集权限模型**中，选择**服务托管权限**。

   1. 在**先决条件 – 准备模板**中，选择**模板已准备就绪**，然后使用以下选项之一选择您的模板：
      + 对于 **Amazon S3 URL**，请在“Amazon S3 URL”字段中输入您的 **Amazon S3 URL**。
      + 在**上传模板文件**中，选择本地计算机中的 CloudFormation 模板。

   接受您的设置并选择 **Next**（下一步）。

1. 在**指定堆栈集详细信息**页面上，执行以下操作：

   1. 在 **StackSet 名称**框中输入 StackSet 名称。

   1. （可选）在 **StackSet description**（堆栈集描述）部分中输入描述。

   在**配置堆栈集选项**页面上，查看您的选项，然后选择**下一步**。

1. 在**设置部署选项**页面上，执行以下操作：

   1. 对于 **Add stacks to stack set**（将堆栈添加到堆栈集），选择 **Deploy new stacks**（部署新堆栈）。

1. 在**关联组织单位**部分，执行以下操作：

   1. 选择**与组织关联**以使用根 OU。

   1. 选择**与组织单位（OU）关联**以输入要导入堆栈的父 OU ID。例如，如果 `Stack 1` 和 `Stack 2` 位于 `OU1` 下，而 `Stack 3` 位于 `OU2` 下，则输入 `OU1` 和 `OU2`。

1. 对于 **Specify regions**（指定区域）和 **Deployment options**（部署选项），查看您的选择。

   接受您的设置并选择 **Next**（下一步）。

1. 在 **Review**（审核）页面上，检查您的设置，然后选择 **Submit**（提交）。

## 将服务托管堆栈导入现有 StackSet（控制台）
<a name="import-service-managed-stack-to-existing-stackset-console"></a>

选择 StackSet 并确定您要导入的堆栈。

**将堆栈导入现有 StackSet**

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 从导航窗格中，选择 **StackSets**。

1. 选择要将堆栈导入到的 StackSet，然后从**操作**下拉列表中选择**将堆栈添加到 StackSet**。

1. 在**设置部署选项**页面上，执行以下操作：

   1. 在**将堆栈添加到堆栈集**中，选择**将堆栈导入堆栈集**。

   1. 在**要导入的堆栈**下，执行以下操作：

      1. 对于 **Stack ID**（堆栈 ID），输入您的堆栈 ID。

      1. 对于**堆栈 URL**，请输入该 Amazon S3 URL。

   1. 在**关联组织单位**下，执行以下操作：

      1. 选择**与组织关联**以使用根 OU。

      1. 选择**与组织单位（OU）关联**以输入要导入堆栈的父 OU ID。例如，如果 `Stack 1` 和 `Stack 2` 位于 `OU1` 下，而 `Stack 3` 位于 `OU2` 下，则输入 `OU1` 和 `OU2`。

      接受您的设置并选择 **Next**（下一步）。

1. 查看 **Specify overrides**（指定覆盖）页面，然后选择 **Next**（下一步）。

1. 确认并检查 **Review**（审核）页面，然后选择 **Submit**（提交）。

## 将服务托管堆栈导入 StackSet（AWS CLI）
<a name="import-service-managed-stack-to-stackset.cli"></a>

创建 StackSet 后，可以通过传递所导入堆栈的堆栈 ID 来导入堆栈。您还可以传递要将其映射到的 OU ID 列表。

CloudFormation 将在这些 OU 中导入用户提供的堆栈，并将这些 OU 用作 StackSet 的部署目标。输入中显示的堆栈 ID 将在内部映射到 OU ID 列表输入中最近的 OU。如果堆栈不属于输入列表中的现有 OU ID，则 AWS CLI 将返回 `StackNotFoundException` 错误。

`import-stacks-to-stack-set` 操作为 OU ID 输入中的堆栈创建堆栈实例。以下 AWS CLI 示例使用 `import-stacks-to-stack-set` 操作将堆栈导入 StackSet。
+ 要使用 `import-stacks-to-stack-sets` 操作，请指定要导入到堆栈集的 `stack-ids` 或 `stack-ids-url`。

  ```
  aws cloudformation import-stacks-to-stack-set \
    --stack-set-name ServiceMangedStackSet \
    --stack-ids "arn:123456789012:us-east-1:Stack1" \
    --organizational-unit-ids ou-examplerootid111-exampleouid111
  ```

  ```
  aws cloudformation import-stacks-to-stack-set \
    --stack-set-name ServiceMangedStackSet \
    --stack-ids-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/file-name.json \
    --organizational-unit-ids ou-examplerootid111-exampleouid111
  ```

**注意**  
`import-stacks-to-stack-sets` 操作要求您指定至少一个组织单位 ID（OU ID），以便它可以将要导入的堆栈关联到该特定 OU。此操作不会为关联 OU 中的其他成员账户创建堆栈实例。要更新关联 OU 的成员账户，请使用 `create-stack-instances` 或 `update-stack-instances`。

`create-stack-set` 使用用户提供的模板（直接上传或来自 Amazon S3）为 OU 下的所有账户创建堆栈实例。以下 AWS CLI 示例使用 `create-stack-set` 操作将堆栈导入新 StackSet。
+ 要使用 `create-stack-set` 操作，请指定 StackSet 名称并将堆栈导入新创建的 StackSet。

  ```
  aws cloudformation create-stack-set \
    --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/file-name.json \
    --permission-model SERVICE_MANAGED \
    --auto-deployment Enabled=true
  ```

# 恢复堆栈导入至 CloudFormation StackSet
<a name="revert-stackset-import"></a>

如果堆栈实例中有不必要的更改，可以恢复堆栈实例的导入。

恢复堆栈实例导入时，CloudFormation 会从 StackSet 中删除堆栈实例，但保留堆栈的资源。

要恢复堆栈导入操作，请完成以下步骤：

1. 将堆栈实例删除后要保留的每个资源的 `DeletionPolicy` 属性指定为 `Retain`。有关更多信息，请参阅 [恢复导入操作](resource-import-revert.md)。

1. 从 StackSet 中删除堆栈实例。有关更多信息，请参阅 [从 CloudFormation StackSet 中删除堆栈](stackinstances-delete.md)。

1. 删除 StackSet。有关更多信息，请参阅 [删除 CloudFormation StackSet](stacksets-delete.md)。

# 使用 CloudFormation StackSet 的最佳实践
<a name="stacksets-bestpractices"></a>

本节介绍了定义 StackSet 模板、创建堆栈或将堆栈添加到 StackSet 或更新 StackSet 的最佳实践。

如果不熟悉 CloudFormation，请查看 [CloudFormation 最佳实践](best-practices.md) 主题获取更多有助于您更高效、安全地使用 CloudFormation 的建议。

**Topics**
+ [定义模板](#w2aac15c41b9)
+ [创建堆栈或将堆栈添加到 StackSet](#w2aac15c41c11)
+ [更新 StackSet 中的堆栈](#w2aac15c41c13)

## 定义模板
<a name="w2aac15c41b9"></a>
+ 定义要在多个区域内的多个账户中标准化的模板。
+ 在创建模板时，如果在同一账户的多个区域中创建全局资源（如 IAM 角色和 Amazon S3 桶），请确保全局资源没有发生命名冲突。
+ 每个 StackSet 都有一个模板和参数集。与 StackSet 关联的所有账户中创建的堆栈都相同。在创作模板时，使其足够精细以便您能够实现控制与标准化的良好平衡。
+ 建议您将模板存储在 Amazon S3 桶中。

## 创建堆栈或将堆栈添加到 StackSet
<a name="w2aac15c41c11"></a>
+ 在将大量堆栈实例添加到 StackSet 之前，验证是否能将堆栈实例添加到初始 StackSet。
+ 选择适用于您的使用案例的部署 (推出) 选项。
  + 对于更传统的部署，请将 **Maximum Concurrent Accounts** 设置为 1，并将 **Failure Tolerance** 设置为 0。在 **Region Order** 列表中将影响最小的区域设置为第一位。从一个区域开始。
  + 要更快地进行部署，请根据需要增大 **Maximum Concurrent Accounts** 和 **Failure Tolerance** 的值。
+ 针对 StackSet 的操作可能需要花费大量时间，具体取决于包含的堆栈实例数量。

## 更新 StackSet 中的堆栈
<a name="w2aac15c41c13"></a>
+ 默认情况下，更新 StackSet 时会更新所有堆栈实例。如果您在两个区域中各有 20 个账户，则您将有 40 个堆栈实例，并且所有实例都将在您更新 StackSet 时进行更新。

  对于具有大量堆栈实例的 StackSet，建议您先选择更新几个测试账户中的堆栈实例以测试更新的模板版本，然后再更新所有堆栈实例。
+ 要对 StackSet 中的各个堆栈更新进行更精细的控制，请计划创建多个 StackSet。
+ 更新包含大量堆栈的 StackSet 可能需要花费大量时间。在此版本中，一次仅允许对 StackSet 执行一项操作。提前计划更新，以免妨碍您在 StackSet 上执行其他操作。

# CloudFormation StackSet 示例模板
<a name="stacksets-sampletemplates"></a>

本节包含一些链接，它们指向可以帮助您在企业中使用 CloudFormation StackSet 的 CloudFormation 示例模板。该部分中列出的模板启用 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 或 [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html) 及其包含的规则。

**重要**  
作为允许 AWS Config 访问 Amazon S3 存储桶时的最佳安全实践，强烈建议您在存储桶策略中使用 `AWS:SourceAccount` 条件来限制访问权限。新模板已更新，含有 `AWS:SourceAccount`。如果现有的存储桶策略未遵循此最佳安全实践，强烈建议您编辑该存储桶策略纳入此保护。这样可以确保 AWS Config 仅代表预期用户授予访问权限。


| 描述 | S3 链接 | 
| --- | --- | 
| 启用了 AWS 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) | 
| 启用了 AWS Config | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfig.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfig.yml) | 
| 使用集中式日志记录启用 AWS Config | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfigForOrganizations.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/EnableAWSConfigForOrganizations.yml) | 
| 跨 AWS 组织或特定 AWS 账户启用 Amazon Data Lifecycle Manager 默认策略 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/AWSCloudFormation/latest/UserGuide/stacksets-sampletemplates.html) [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEncryptedVolumes.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEncryptedVolumes.yml) | 
| 配置 AWS Config 规则以确定是否启用 CloudTrail | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleCloudtrailEnabled.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleCloudtrailEnabled.yml) | 
| 配置 AWS Config 规则以确定是否启用根 MFA | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleRootAccountMFAEnabled.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleRootAccountMFAEnabled.yml) | 
| 配置 AWS Config 规则以确定是否附加 EIP | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEipAttached.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEipAttached.yml) | 
| 配置 AWS Config 规则以确定是否加密 EBS 卷 | [https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEncryptedVolumes.yml](https://s3.amazonaws.com/cloudformation-stackset-sample-templates-us-east-1/ConfigRuleEncryptedVolumes.yml) | 

# CloudFormation StackSets 故障排除
<a name="stacksets-troubleshooting"></a>

本主题包含一些常见的 StackSets 问题以及这些问题的建议的解决方案。

**Topics**
+ [堆栈操作失败的常见原因](#common-reasons-for-stack-operation-failure)
+ [重试失败的堆栈创建或更新操作](#retrying-failed-stack-creation-or-update-operations)
+ [堆栈实例删除操作失败](#stack-instance-delete-fails)
+ [堆栈导入操作失败](#stack-import-fails)
+ [StackSets 操作的堆栈实例失败计数](#stack-instance-failure-count-for-stackset-operations)

## 堆栈操作失败的常见原因
<a name="common-reasons-for-stack-operation-failure"></a>

**问题：**堆栈操作失败，并且堆栈实例状态为 `OUTDATED`。

**原因：**有几个导致堆栈操作失败的常见原因。
+ 目标账户中的权限不足，无法创建模板中指定的资源。
+ CloudFormation 模板可能存在错误。验证 CloudFormation 中的模板并修复错误，然后再尝试创建 StackSet。
+ 模板可能尝试创建必须唯一但不唯一的全球资源 (如 S3 存储桶)。
+ 指定的目标账号不存在。检查您在向导的 **Set deployment options** 页面上指定的目标账号。
+ 管理员账户与目标账户没有信任关系。
+ 目标账户中已存在模板中指定的资源的最大数量。例如，您可能已达到目标账户中允许的 IAM 角色数限制，但模板创建更多 IAM 角色。
+ 您已达到 StackSet 中允许的最大堆栈数量。有关每个 StackSet 的最大堆栈数，请参阅 [了解 CloudFormation 配额](cloudformation-limits.md)。

**解决方案：**有关创建 StackSet 之前目标和管理员账户所需权限的更多信息，请参阅[授予管理员账户的所有用户管理所有目标账户中堆栈的权限](stacksets-prereqs-self-managed.md#stacksets-prereqs-accountsetup)。

## 重试失败的堆栈创建或更新操作
<a name="retrying-failed-stack-creation-or-update-operations"></a>

**问题：**堆栈创建或更新失败，并且堆栈实例状态为 `OUTDATED`。要查找堆栈创建或更新失败的原因，请打开 CloudFormation 控制台，查看堆栈的事件，这些事件的状态为 `DELETED`（创建操作失败时）或 `FAILED`（更新操作失败时）。浏览堆栈事件，然后查找 **Status reason** 列。**Status reason** 的值解释了堆栈操作失败的原因。

在确定堆栈创建失败的根本原因并准备好重试堆栈创建后，请执行下列步骤。

**解决方案：**执行下列步骤以重试堆栈操作。

1. 在控制台中，选择包含操作失败的堆栈的 StackSet。

1. 在**操作**菜单上，选择 **Edit StackSet details (编辑堆栈集详细信息)** 以重试创建或更新堆栈。

1. 在**指定模板**页面上，要使用相同的 CloudFormation 模板，请保留默认选项**使用当前模板**。如果您的堆栈操作因模板需要更改而失败，并且您想上传修订后的模板，请改为选择 **Upload a template to Amazon S3**，然后选择 ** Browse** 以选择更新的模板。上传完修订后的模板后，选择 **Next**。

1. 在**指定堆栈详细信息**页面上，如果您不更改特定于模板的任何参数，请选择**下一步**。

1. 在 **Set deployment options** 页上，更改 **Maximum concurrent accounts** 和 **Failure tolerance** 的默认值 (如果需要)。有关这些设置的更多信息，请参阅 [StackSet 操作选项](stacksets-concepts.md#stackset-ops-options)。

1. 在**审核**页面上，检查所选的内容，然后选中相应的复选框以确认所需的 IAM 功能。选择**提交**。

1. 如果您的堆栈未成功更新，请在解决任何阻止堆栈创建的基本问题后重复此过程。

## 堆栈实例删除操作失败
<a name="stack-instance-delete-fails"></a>

**问题：**堆栈删除操作失败。

**原因：**对于任何已启用终止保护的堆栈，堆栈删除操作将失败。

**解决方案：**确定该堆栈是否已启用终止保护。如果已启用，则禁用终止保护，然后再重新执行堆栈实例删除操作。

## 堆栈导入操作失败
<a name="stack-import-fails"></a>

**问题：**堆栈导入操作无法将现有堆栈导入新的或现有的 StackSet。堆栈实例处于 `INOPERABLE` 状态。

**解决方案：**通过完成以下任务恢复堆栈导入操作。

1. 使用**从 StackSet 删除堆栈**选项，并在配置过程中启用 **RetainStacks**，然后继续从 StackSet 中删除堆栈实例。有关更多信息，请参阅 [从 CloudFormation StackSet 中删除堆栈](stackinstances-delete.md)。

1. 您将看到 StackSet 的堆栈实例会更新，删除 `INOPERABLE` 堆栈实例。

1. 根据导入失败错误修复堆栈实例，然后重试堆栈导入操作。

## StackSets 操作的堆栈实例失败计数
<a name="stack-instance-failure-count-for-stackset-operations"></a>

如果堆栈实例无法预置或更新，堆栈实例失败计数会发出警报。由于以下一个或多个原因，这些堆栈实例未部署：
+ 现有资源具有类似配置
+ 缺少依赖项，例如 AWS Identity and Access Management（IAM）角色
+ 其他冲突因素

如果您想以最大并发进行部署，则最大并发计数最多比容错计数多一。例如，如果容错计数为 9，则最大并发计数不能超过 10。即使某些堆栈实例无法更新，这也会导致操作返回 `SUCCEEDED`。新的堆栈实例失败计数让您能够确定，操作是否仅在符合条件的情况下成功，因为容错计数设置为允许所有失败。

您可以使用 AWS 管理控制台、AWS SDK 或 AWS CLI 获取失败计数并筛选堆栈实例，以确定需要重新部署哪些实例。

### 使用控制台
<a name="stack-instance-failure-count-for-stackset-operations-console-examples"></a>

**若要查看失败堆栈实例的数量，请执行以下操作：**

1. 打开 [CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)，然后选择 **StackSet**。

1. 选择您的 StackSet，然后选择 **Operations**（操作）选项卡。

1. 在 **Status**（状态）列中选择状态以查看状态详细信息。您将在状态详细信息中找到特定操作的失败堆栈实例的数量。

**若要查看操作的堆栈实例的账户、区域和状态，请执行以下操作：**

1. 在状态详细信息中，选择失败的堆栈实例计数。*示例：***Stack instances: `<number of failed stack instances>`**（堆栈实例：）。

1. 通过选择面板标头来展开侧面板。侧面板中的结果是所选操作完成后堆栈实例的状态。

**若要查看操作的当前堆栈实例详细信息，请执行以下操作：**

1. 选择 **Stack Instances**（堆栈实例）选项卡。

1. 按 **Last operation ID**（上次操作 ID）筛选。结果为上次修改实例的操作的当前状态和状态原因。您可以将此筛选条件与 **AWS 账户**、**AWS 区域**、**详细状态**和 **偏差状态**结合使用，以进一步优化搜索结果。

### 使用 AWS CLI
<a name="stack-instance-failure-count-for-stackset-operations-cli-examples"></a>

若要获取失败的堆栈实例数量，请调用 `describe-stack-set-operation` 或 `list-stack-set-operations` 并参阅 `StatusDetails`。

```
aws cloudformation describe-stack-set-operation --stack-set-name ss1 \
    --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60
```

```
{
    "StackSetOperation": {
        "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60",
        "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f",
        "Action": "CREATE",
        "Status": "SUCCEEDED",
        "OperationPreferences": {
            "RegionOrder": [],
            "FailureToleranceCount": 10,
            "MaxConcurrentCount": 10
        },
        "AdministrationRoleARN": "arn:aws:iam::123456789012:role/AWSCloudFormationStackSetAdministrationRole",
        "ExecutionRoleName": "AWSCloudFormationStackSetExecutionRole",
        "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00",
        "EndTimestamp": "2022-10-26T17:19:35.304000+00:00",
        "StatusDetails": {
            "FailedStackInstancesCount": 3
        }
    }
}
```

```
aws cloudformation list-stack-set-operations --stack-set-name ss1
```

```
{
    "Summaries": [
        {
            "OperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60",
            "Action": "CREATE",
            "Status": "SUCCEEDED",
            "CreationTimestamp": "2022-10-26T17:18:53.947000+00:00",
            "EndTimestamp": "2022-10-26T17:19:35.304000+00:00",
            "StatusDetails": {
                "FailedStackInstancesCount": 3
            },
            "OperationPreferences": {
                "RegionOrder": [],
                "FailureToleranceCount": 10,
                "MaxConcurrentCount": 10
            }
        }
    ]
}
```

若要获取特定操作的历史概述，请使用 `list-stack-set-operation-results` 查看操作完成后每个堆栈实例的状态和状态原因。参阅以下实例以找到 `Status` 和 `StatusReason`：

```
aws cloudformation list-stack-set-operation-results --stack-set-name ss1 \
  --operation-id 5550e62f-c822-4331-88fa-21c1d7bafc60 --filters Name=OPERATION_RESULT_STATUS,Values=FAILED
```

```
{
    "Summaries": [
        {
            "Account": "123456789012",
            "Region": "us-west-2",
            "Status": "FAILED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "AccountGateResult": {
                "Status": "SKIPPED",
                "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'."
            },
            "OrganizationalUnitId": ""
        },
        {
            "Account": "123456789012",
            "Region": "us-west-1",
            "Status": "FAILED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "AccountGateResult": {
                "Status": "SKIPPED",
                "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'."
            },
            "OrganizationalUnitId": ""
        },
        {
            "Account": "123456789012",
            "Region": "us-east-1",
            "Status": "FAILED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "AccountGateResult": {
                "Status": "SKIPPED",
                "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'."
            },
            "OrganizationalUnitId": ""
        }
    ]
}
```

将 `list-stack-instances` 和 `DETAILED_STATUS` 以及 `LAST_OPERATION_ID` 筛选条件一起使用，以获取在上次尝试部署堆栈实例的操作中失败的堆栈实例列表。请参阅示例中带有 `DETAILED_STATUS` 和 `LAST_OPERATION_ID` 的 `--filters` 标志：

```
aws cloudformation list-stack-instances --stack-set-name ss1 \
  --filters Name=DETAILED_STATUS,Values=FAILED Name=LAST_OPERATION_ID,Values=5550e62f-c822-4331-88fa-21c1d7bafc60
```

```
{
    "Summaries": [
        {
            "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f",
            "Region": "us-east-1",
            "Account": "123456789012",
            "Status": "OUTDATED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "StackInstanceStatus": {
                "DetailedStatus": "FAILED"
            },
            "OrganizationalUnitId": "",
            "DriftStatus": "NOT_CHECKED",
            "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60"
        },
        {
            "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f",
            "Region": "us-west-1",
            "Account": "123456789012",
            "Status": "OUTDATED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "StackInstanceStatus": {
                "DetailedStatus": "FAILED"
            },
            "OrganizationalUnitId": "",
            "DriftStatus": "NOT_CHECKED",
            "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60"
        },
        {
            "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f",
            "Region": "us-west-2",
            "Account": "123456789012",
            "Status": "OUTDATED",
            "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
            "StackInstanceStatus": {
                "DetailedStatus": "FAILED"
            },
            "OrganizationalUnitId": "",
            "DriftStatus": "NOT_CHECKED",
            "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60"
        }
    ]
}
```

要查找上一个操作 ID 来修改堆栈实例，请使用 `list-stack-instances` 或 `describe-stack-instance` 来获取 `LastOperationId`：

```
aws cloudformation describe-stack-instance --stack-set-name ss1 \
  --stack-instance-account 123456789012 --stack-instance-region us-east-2
```

```
{
    "StackInstance": {
        "StackSetId": "ss1:9101ca57-49fc-4a61-a5a6-4c97b8adb08f",
        "Region": "us-west-2",
        "Account": "123456789012",
        "ParameterOverrides": [],
        "Status": "OUTDATED",
        "StackInstanceStatus": {
            "DetailedStatus": "FAILED"
        },
        "StatusReason": "Account 123456789012 should have 'AWSCloudFormationStackSetExecutionRole' role with trust relationship to Role 'AWSCloudFormationStackSetAdministrationRole'.",
        "OrganizationalUnitId": "",
        "DriftStatus": "NOT_CHECKED",
        "LastOperationId": "5550e62f-c822-4331-88fa-21c1d7bafc60"
    }
}
```