

# 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)。在指定键值对后，选择 **\+** 以保存标签。您可以通过选择标签右侧的红色 **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`  
指定账户和区域中的操作已成功完成。