使用 StackSets 跨账户和区域管理堆栈
AWS CloudFormation StackSets 让您能够在单个操作中跨多个账户和 AWS 区域区域创建、更新或删除堆栈,从而扩展了堆栈的功能。通过使用管理员账户,您可定义和管理 CloudFormation 模板,并以该模板为基础,跨指定的 AWS 区域在选定目标账户中预置堆栈。
此部分将帮助您开始使用 StackSets,并解答有关如何使用堆栈集创建、更新和删除操作并对其进行故障排除的常见问题。
主题
StackSets 概念
当您使用 StackSets 时,使用堆栈集、堆栈实例和堆栈。
管理员账户和目标账户
管理员账户是您用来创建堆栈集的 AWS 账户。对于具有服务托管权限的堆栈集,管理员账户是组织的 管理账户 或委托管理员账户。您可以通过登录到创建堆栈集的 AWS 管理员账户来管理堆栈集。
目标账户 是您用来创建、更新或删除堆栈集中的一个或多个堆栈的账户。先在管理员账户与目标账户之间设置信任关系,然后才能使用堆栈集在目标账户中创建堆栈。
AWS CloudFormation 堆栈集
利用堆栈集,您可使用一个 CloudFormation 模板在 AWS 账户 中跨区域创建堆栈。堆栈集的 CloudFormation 模板定义每个堆栈中的所有资源。在创建堆栈集时,指定要使用的模板以及模板所需的任何参数和功能。
在定义堆栈集后,您可以在指定的目标账户和 AWS 区域 中创建、更新或删除堆栈。创建、更新或删除堆栈时,您还可以指定操作首选项。例如,包括要执行操作的区域顺序、堆栈操作停止前的容错阈值以及并发执行堆栈操作的账户数。
堆栈集是一种区域性资源。如果在一个 AWS 区域 中创建堆栈集,则只能在查看该区域时查看或更改它。
堆栈集的权限模型
您可以使用自行管理 权限或服务托管 权限创建堆栈集。
使用自行管理权限时,您将创建 StackSets 需要的 IAM 角色来跨账户和区域进行部署。对于在您管理堆栈集所用的账户与您将堆栈部署到的账户之间建立信任关系,这些角色是必需的。使用此权限模型,StackSets 可以部署到您有权创建 IAM 角色的任何 AWS 账户 中。
使用服务托管 权限时,您可以将堆栈实例部署到 AWS Organizations 管理的账户。使用此权限模型,您不必创建必要的 IAM 角色;StackSets 会代表您创建 IAM 角色。使用此模型,您还可以为将来添加到组织的账户开启自动部署。
AWS Organizations 与 CloudFormation 集成,可帮助您在扩展和增长 AWS 资源时集中管理和治理您的环境。
-
管理账户 - 您用于创建组织的账户。有关更多信息,请参阅 AWS Organizations 术语和概念。
-
委托管理员 - 兼容的 AWS 服务可以将组织中的 AWS 成员账户注册为该服务中组织账户的管理员。有关更多信息,请参阅可与 AWS Organizations 一起使用的 AWS 服务。
有关创建和管理具有服务托管权限的堆栈集的更多信息,请参阅以下主题:
堆栈实例
堆栈实例 是对区域内的目标账户中的堆栈的引用。堆栈实例可在没有堆栈的情况下存在。例如,如果出于某个原因无法创建堆栈,则堆栈实例将显示堆栈创建失败的原因。一个堆栈实例仅与一个堆栈集关联。
下图显示堆栈集、堆栈操作和堆栈之间的逻辑关系。当您更新堆栈集时,将在所有账户和区域中更新所有 关联的堆栈实例。
堆栈集操作
您可以在堆栈集上执行以下操作。
- 创建堆栈集
-
创建新堆栈集包含指定要用于创建堆栈的 CloudFormation 模板、指定要在其中创建堆栈的目标账户以及标识要在其中将堆栈部署到您的目标账户的 AWS 区域。堆栈集可确保将具有相同设置的相同堆栈资源,一致地部署到所选区域内的所有指定目标账户。
- 更新堆栈集
-
在更新堆栈集时,将更改推送到堆栈集中的堆栈。您可以通过下列方法之一更新堆栈集。您的模板更新始终会影响所有堆栈;您不能选择更新堆栈集中某些堆栈的模板,但可以选择更新其他堆栈的模板。
-
更改模板中的现有设置或添加新资源,例如,更新特定服务的参数设置或添加新的 Amazon EC2 实例。
-
将该模板替换为其他模板。
-
跨现有或其他区域在现有或其他目标账户中添加堆栈。
-
- 删除堆栈
-
在删除堆栈时,您将从指定的区域的指定目标账户中,删除堆栈及其所有关联资源。您可以通过以下方法删除堆栈。
-
从某些目标账户中删除堆栈,同时使其他目标账户中的其他堆栈保持运行。
-
从某些区域中删除堆栈,同时使其他区域中的堆栈保持运行。
-
从堆栈集中删除堆栈,但保存它们,以便通过选择 Retain Stacks 选项来使其独立于堆栈集继续运行。然后,您可以管理 AWS CloudFormation 中堆栈集之外的保留堆栈。
-
在准备删除您的整个堆栈集时删除堆栈集中的所有堆栈。
-
- 删除堆栈集
-
您只能在您的堆栈集中没有堆栈实例时删除它。
堆栈集操作选项
此部分中描述的选项有助于控制时间和允许的失败次数,以便成功执行堆栈集操作并防止您丢失堆栈资源。
- 最大并发账户数
-
利用此设置(适用于创建、更新和删除工作流),您可以指定在其中一次执行一项操作的目标账户的最大数量或百分比。较小的数量或百分比意味着一次在较少的目标账户中执行一项操作。按照 Deployment order(部署顺序)框中指定的顺序一次在一个区域中执行操作。例如,如果您将堆栈部署到两个区域内的 10 个目标账户,将 Maximum concurrent accounts(最大并发账户数)设置为 50 和 By percentage(按百分比),则会在移到下一个区域并开始部署到前 5 个目标账户之前,将堆栈部署到第一个区域中的 5 个账户,然后部署到第一个区域内的另外 5 个账户。
当选择按百分比时,如果指定的百分比不表示您指定的账户的整数数量,则 CloudFormation 会向下舍入。例如,如果您将堆栈部署到 10 个目标账户,并将最大并发账户数设置为 25 和按百分比,则 CloudFormation 会从同时部署 2.5 个堆栈(这是不可能的)向下舍入到同时部署 2 个堆栈。
请注意,此设置可让您指定操作数的最大值。对于大型部署,在某些情况下,并行运行的实际账户的数量可能由于服务限制而减少。最大部署速度为每个堆栈集 100 个并发堆栈实例。
最大并发账户数可能取决于容错值,而后者又取决于您的并发模式。如果您将并发模式设置为严格容错,则最大并发账户数最多可以比容错设置大 1。
- 并发模式
-
此设置可在创建、更新和删除工作流时使用,让您能够选择并发级别在堆栈集操作期间的行为。有关更多信息,请参阅 为 CloudFormation StackSets 选择并发模式。
- 容错
-
利用此设置(适用于创建、更新和删除工作流时),您可以指定每个区域中可发生的堆栈操作失败的最大数量或百分比,一旦超出此值,CloudFormation 就会自动停止操作。较小的数量或百分比意味着在较少的堆栈上执行该操作,但您能够更快地开始对失败的操作进行故障排除。例如,如果您将在 3 个区域内的 10 个目标账户中更新 10 个堆栈,则将 Failure tolerance (容错) 设置为 20 和 By percentage (按百分比) 意味着一个区域中最多 2 个堆栈更新可以失败,此操作继续。如果同一区域中的第三个堆栈失败,则 CloudFormation 将停止此操作。如果堆栈在第一个区域中无法进行更新,则更新操作将在该区域中继续进行,然后移到下一个区域。如果两个堆栈无法在第二个区域中进行更新,则容错能力达到 20%;如果该区域中的第三个堆栈失败,则 CloudFormation 停止更新操作,并且不会转入后续区域。
当选择按百分比时,如果指定的百分比不表示每个区域内的堆栈的整数数量,则 CloudFormation 会向下舍入。例如,如果您将堆栈部署到 3 个区域中的 10 个目标账户,并且将容错设置为 25 和按百分比,则 CloudFormation 会从每个区域的 2.5 个堆栈的容错能力(这是不可能的)向下舍入到每个区域的 2 个堆栈的容错能力。
- 保留堆栈
-
利用此设置(适用于删除堆栈工作流),您可以使堆栈及其资源继续运行,甚至在从堆栈集中删除堆栈后也是如此。保留堆栈时,AWS CloudFormation 会将堆栈按原样保留在各自的账户和区域中。将取消堆栈与堆栈集的关联,但将保存堆栈及其资源。删除堆栈操作完成后,您可在创建堆栈的目标账户(而不是管理员账户)中管理 CloudFormation 中的保留堆栈。
- 区域并发
-
此设置可在创建、更新和删除工作流时使用,用于选择如何将 StackSets 部署到区域中。
顺序 - 只要区域的部署失败次数不超过指定的容错能力,就按照区域 Deployment order(部署顺序)框中指定的顺序,一次将 StackSets 操作部署到一个区域。顺序部署是默认选项。
并行 – 只要区域的部署失败次数不超过指定的容错值,就将 StackSets 操作同时部署到所有指定区域。
标签
您可以通过指定键/值对在堆栈集创建和更新操作期间添加标签。标签对于针对账单和成本分配来分类和筛选堆栈集资源非常有用。有关如何在 AWS 中使用标签的更多信息,请参阅《AWS Billing and Cost Management User Guide》中的 Organizing and tracking costs using AWS cost allocation tags。在指定键值对后,选择 + 以保存标签。您可以通过选择标签右侧的红色 X 来删除不再使用的标签。
您应用于堆栈集的标签将应用于所有堆栈以及由您的堆栈创建的资源。您还可以在 CloudFormation 中的仅堆栈级别添加标签;但这些标签可能不会显示在 StackSets 中。
尽管 StackSets 目前未添加任何系统定义的标签,但您不应使用字符串 aws:
作为任何标签的键名称的开头。
StackSets 状态代码
AWS CloudFormation StackSets 为堆栈集操作生成状态代码。
下表描述了堆栈集操作的状态代码。
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
-
根据用户请求,已停止该操作。
堆栈实例状态代码
AWS CloudFormation StackSets 为堆栈实例生成状态代码。
下表描述了 StackSets 内堆栈实例的状态代码。
CURRENT
-
堆栈与堆栈集保持最新。
OUTDATED
-
出于下列原因之一,堆栈未与堆栈集的最新状态保持一致。
-
关联堆栈上的 CreateStackSet 或 UpdateStackSet 操作失败。
-
堆栈是失败的 CreateStackSet 或 UpdateStackSet 操作的一部分,或在创建或更新堆栈前已停止。
-
INOPERABLE
-
DeleteStackInstances 操作已失败,并且堆栈处于不稳定状态。将从进一步的 UpdateStackSet 操作中排除处于此状态的堆栈。您可能需要执行 DeleteStackInstances 操作,同时将
RetainStacks
设置为true
,以删除堆栈实例,然后手动删除堆栈。 CANCELLED
-
指定账户和区域中的操作已被取消。发生此情况可能是因为用户已停止堆栈集操作,或者因为已超出堆栈集操作的容差能力。
FAILED
-
指定账户和区域中的操作失败。如果堆栈集操作在一个区域内足够的账户中失败,则可能会超出整个堆栈集操作的故障容差。
FAILED_IMPORT
-
在指定账户和区域中导入堆栈实例失败,并且堆栈处于不稳定状态。修复导致失败的问题后,可以重试导入操作。如果在一个区域中,足够数量的堆栈集操作在足够的账户中失败,则可能是超出了整个堆栈集操作的故障容差。
PENDING
-
指定账户和区域中的操作尚未开始。
RUNNING
-
指定账户和区域中的操作当前正在进行中。
SKIPPED_SUSPENDED_ACCOUNT
-
指定账户和区域中的操作已被跳过,因为操作时该账户已被暂停。
SUCCEEDED
-
指定账户和区域中的操作已成功完成。