

# 覆盖 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
   ```