创建具有服务托管权限的 AWS CloudFormation StackSet - AWS CloudFormation

创建具有服务托管权限的 AWS CloudFormation StackSet

使用服务托管权限时,您可以将堆栈部署到特定区域中由 AWS Organizations 托管的账户。使用此模型,您无需创建必要的 IAM 角色;CloudFormation 会代表您创建 IAM 角色。有关更多信息,请参阅激活可信访问权限

注意事项

在创建具有服务托管权限的 StackSet 之前,请考虑以下事项:

  • 具有服务托管权限的堆栈集是在管理账户中创建的,包括由委派管理员创建的堆栈集。

  • StackSet 可以整个组织(包括所有账户)或特定组织单元(OU)为目标。如果 StackSet 的目标是父 OU,那么它同时以所有子 OU 为目标。如果您的 StackSet 以特定 OU 为目标,默认情况下会包括这些 OU 中的所有账户。但是,您可以使用账户筛选条件,来仅以特定账户为目标。

  • 多个堆栈集可以将同一组织或 OU 作为目标。

  • StackSet 不能以组织外的账户为目标。

  • 您的 StackSet 无法部署嵌套堆栈。

  • CloudFormation 不会将堆栈部署到组织的管理账户,即使管理账户位于组织中或组织内的 OU 中也是如此。

  • 自动部署在 StackSet 级别设置。您无法为 OU、账户或区域选择性地调整自动部署。

  • 用于登录管理账户的 IAM 委托人实体(用户、角色或组)的权限决定了您是否有权使用 StackSet 进行部署。有关授予向组织进行部署的权限的示例 IAM policy,请参阅 根据区域和资源类型限制堆栈集操作

  • 委派管理员具有部署到组织中的账户的完全权限。管理账户不能限制委派管理员部署到特定 OU 或执行特定 StackSet 操作的权限。

创建具有服务管理权限的 StackSet(控制台)

创建 StackSet
  1. 登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

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

  3. 从导航窗格中,选择 StackSets

  4. StackSets 页面顶部,选择创建 StackSet

  5. 权限下方,选择服务托管权限

    注意

    如果为可信访问禁用 AWS Organizations,则会显示横幅。创建或更新具有服务托管权限的 StackSet 需要可信访问。只有组织管理账户中的管理员具有对 使用 AWS Organizations 为 StackSet 激活可信访问权限 的权限。

  6. 先决条件 - 准备模板下,选择模板已就绪

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

  8. 指定 StackSet 详细信息页面上,提供 StackSet 名称,指定所有参数,然后选择下一步

  9. Configure StackSet options (配置堆栈集选项) 页面上,在 Tags (标签) 下指定要应用于堆栈中资源的所有标签。有关如何在 AWS 中使用标签的更多信息,请参阅《AWS 账单与成本管理 User Guide》中的 Organizing and tracking costs using AWS cost allocation tags

  10. 执行配置中,请选择活动,启用 CloudFormation 的优化操作处理:

    • 为了缩短部署时间,无冲突的操作会同时运行。

    • 存在冲突的操作会自动排入队列,按照请求的顺序进行处理。

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

  11. 如果模板包含 IAM 资源,则对于功能,请选择我确认该模板可能会创建 IAM 资源以指定您要在模板中使用 IAM 资源。有关更多信息,请参阅确认 CloudFormation 模板中的 IAM 资源

  12. 选择下一步以继续,并激活可信访问权限(如果尚未激活)。

  13. 设置部署选项页面的部署目标下,执行以下操作之一:

    • 要部署到您组织中的所有账户,请选择部署到组织

    • 要部署到特定 OU 中的所有账户,请选择部署到组织单位(OU)。选择 Add an OU (添加 OU),然后将目标 OU ID 粘贴到文本框中。对每个新目标 OU 重复执行此操作。

    如果您选择部署到组织单元(OU),则对于账户筛选条件类型,可以通过选择以下选项之一并提供账号将部署目标设置为特定的个人账户。

    • (默认):将堆栈部署到指定 OU 中的所有账户。

    • 交集:将堆栈部署到选定 OU 中特定的单独账户。

    • 差集:除特定账户外,将堆栈部署到选定 OU 中的所有账户。

    • 并集:将堆栈部署到指定 OU 以及额外单独账户。

  14. 自动部署下,选择是否自动部署到将来添加到目标组织或 OU 的账户。有关更多信息,请参阅为 AWS Organizations 中的堆栈集启用或禁用自动部署

  15. 如果启用自动部署,请在 Account removal behavior (账户删除行为) 下,选择从目标组织或 OU 中删除账户时是保留还是删除堆栈资源。

    注意

    选择保留堆栈后,堆栈将从 StackSet 中移除,但堆栈及其相关资源将会保留。资源会保持当前状态,但不再是 StackSet 的一部分。

  16. 对于指定区域,选择要在其中部署堆栈的区域。

  17. 对于部署选项,请执行以下操作:

    • 对于最大并发账户数,请指定并发处理的账户数量。

    • 容错中,请指定每个区域允许的账户失败次数上限。达到此次数限制后,该操作将停止,不会继续到其他区域。

    • 对于区域并发,请选择处理区域的方式:顺序(一次处理一个区域)或并行(并发处理多个区域)。

    • 对于并发模式,请选择在操作执行期间的并发行为方式。

      • 严格容错:操作失败时降低账户并发级别,保持在容错 +1 范围内。

      • 软容错 – 即使失败,仍保持您指定的并发级别(最大并发账户数的值)。

  18. 选择下一步以继续。

  19. 审核页面上,验证 StackSet 将部署到正确区域中的正确账户,然后选择创建 StackSet

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

创建具有服务管理权限的 StackSet(AWS CLI)

请按照本部分中的步骤,使用 AWS CLI 来执行以下操作:

  • 创建 StackSet 容器。

  • 部署堆栈实例。

注意

担任委派管理员时,您必须在命令中包含 --call-as DELEGATED_ADMIN

Deploy to your organization
创建 StackSet
  1. 使用 create-stack-set 命令创建一个新 StackSet(名为 my-stackset)。以下示例使用存储在 S3 存储桶中的模板,启用自动部署,会在删除账户时保留堆栈。有关更多信息,请参阅为 AWS Organizations 中的堆栈集启用或禁用自动部署

    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
  2. 使用 list-stack-sets 命令确认 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 会返回组织管理账户中的所有堆栈集。

  3. 使用 create-stack-instances 命令将堆栈添加到 StackSet 中。在 --deployment-targets 选项中,指定要部署到组织中所有账户的组织根 ID。

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

    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

  4. 使用在 create-stack-instances 输出中返回的 operation-id 以及以下 describe-stack-set-operation 命令,验证堆栈是否已成功创建。

    aws cloudformation describe-stack-set-operation \ --stack-set-name my-stackset \ --operation-id operation_ID
Deploy to organizational units (OUs)
创建 StackSet
  1. 使用 create-stack-set 命令创建一个新 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
  2. 使用 list-stack-sets 命令确认 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 会返回组织管理账户中的所有堆栈集。

  3. 使用 create-stack-instances 命令将堆栈添加到 StackSet 中。在 --deployment-targets 选项中,指定部署目的地 OU ID。

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

    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

  4. 使用在 create-stack-instances 输出中返回的 operation-id 以及以下 describe-stack-set-operation 命令,验证堆栈是否已成功创建。

    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

使用 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
包含其他账户

以下示例中,堆栈将部署到 OU1 中的所有账户以及另一个 OU 中的其他账户 A4。

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