

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

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

**Topics**
+ [注意事项](#stacksets-orgs-considerations)
+ [创建具有服务管理权限的 StackSet（控制台）](#stacksets-orgs-associate-stackset-with-org-console)
+ [创建具有服务管理权限的 StackSet（Amazon 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. 登录到 Amazon Web Services 管理控制台 并打开 Amazon CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.amazonaws.cn/cloudformation/)。

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

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

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

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

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

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

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

1. 在 **Configure StackSet options (配置堆栈集选项)** 页面上，在 **Tags (标签)** 下指定要应用于堆栈中资源的所有标签。有关如何在 Amazon 中使用标签的更多信息，请参阅《Amazon 账单与成本管理 User Guide》**中的 [Organizing and tracking costs using Amazon cost allocation tags](https://docs.amazonaws.cn/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 的账户。有关更多信息，请参阅 [为 Amazon Organizations 中的堆栈集启用或禁用自动部署](stacksets-orgs-manage-auto-deployment.md)。

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

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

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

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

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

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

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

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

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

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

**创建 StackSet**

1. 使用 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-set.html) 命令创建一个新 StackSet（名为 `my-stackset`）。以下示例使用存储在 S3 存储桶中的模板，启用自动部署，会在删除账户时保留堆栈。有关更多信息，请参阅 [为 Amazon 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.amazonaws.cn/cli/latest/reference/cloudformation/list-stack-sets.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/list-stack-sets.html) 命令确认 StackSet 已创建。结果中会列出您的新 StackSet。

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

1. 使用 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.amazonaws.cn/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
   ```

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

1. 使用在 **create-stack-instances** 输出中返回的 `operation-id` 以及以下 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.amazonaws.cn/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.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-set.html](https://docs.amazonaws.cn/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.amazonaws.cn/cli/latest/reference/cloudformation/list-stack-sets.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/list-stack-sets.html) 命令确认 StackSet 已创建。结果中会列出您的新 StackSet。

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

1. 使用 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.amazonaws.cn/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
   ```

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

1. 使用在 **create-stack-instances** 输出中返回的 `operation-id` 以及以下 [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/describe-stack-set-operation.html](https://docs.amazonaws.cn/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 内的所有账户。

在 Amazon CLI 中，您可以使用 `--deployment-targets` 选项指定账户筛选条件。有关更多信息，请参阅 [DeploymentTargets](https://docs.amazonaws.cn/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
```

------