

# 为 Amazon CloudFormation StackSet 选择并发模式
<a name="concurrency-mode"></a>

**并发模式**是 [https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_StackSetOperationPreferences.html](https://docs.amazonaws.cn/AWSCloudFormation/latest/APIReference/API_StackSetOperationPreferences.html) 的参数，允许您选择并发级别在 StackSet 操作期间的行为方式。您可以在以下模式之间进行选择：
+ **严格容错**：此选项可动态降低并发级别，确保失败账户的数量永远不会超过**容错**值 \$11。初始实际并发数设置为**最大并发账户数**值或**容错**值 \$11 中的较小值。然后，实际并发数按失败次数成比例减少。这是默认行为。
+ **软容错**：此选项将**容错**与实际并发数分离。这允许 StackSet 操作在**最大并发账户数**值设置的并发级别上运行，而不管失败次数是多少。

**严格容错**会降低 StackSet 操作失败时的部署速度，因为每次失败都会降低并发数。**软容错**会优先考虑部署速度，同时仍能利用 CloudFormation 安全功能。这可以让您查看和解决因常见问题而导致的 StackSet 操作失败，例如与现有资源、服务配额和权限有关的问题。

有关 StackSets 堆栈操作失败的更多信息，请参阅 [堆栈操作失败的常见原因](stacksets-troubleshooting.md#common-reasons-for-stack-operation-failure)。

有关**最大并发账户数**和**容错**的更多信息，请参阅 [StackSet 操作选项](stacksets-concepts.md#stackset-ops-options)。

## 每种并发模式的工作原理
<a name="concurrency-mode-example"></a>

下图直观地显示了每种**并发模式**在 StackSet 操作期间的工作原理。节点字符串表示对单个 Amazon Web Services 区域 的部署，且每个节点都是一个目标 Amazon Web Services 账户。

**严格容错**  
如果使用**严格容错**的 StackSet 操作将**容错**值设置为 5，**最大并发账户数**的值设置为 10 时，实际并发数为 6。实际并发数为 6，因为 5\$11 的**容错**值低于**最大并发账户数**的值。  
下图显示了**容错**值对**最大并发账户数**值的影响，以及它们对 StackSet 操作实际并发数的影响：  

![\[使用严格容错的 StackSet 操作。容错率为 5，最大并发账户数为 10，并发水平为 6。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-1.png)

当部署开始且出现失败的堆栈实例时，为了提供安全的部署体验，实际并发数会降低。当 StackSets 部署 1 个堆栈实例失败时，实际并发数从 6 个降低到 5 个。  

![\[该使用严格容错的 StackSet 操作有 2 次成功部署和 1 次失败。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-2.png)


![\[由于有一次失败，所以这个使用严格容错的 StackSet 操作的实际并发数降至 5。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-3.png)

**严格容错**模式按失败堆栈实例的数量成比例降低实际并发数。在以下示例中，当 StackSets 再部署的 2 个堆栈实例失败时，实际并发数从 5 个减少到 3 个，从而使失败的堆栈实例总数降至 3 个。  

![\[该使用严格容错的 StackSet 操作现在有 3 次失败的部署。并发水平已降至 3。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-4.png)

如果失败的堆栈实例数等于定义的**容错**值 \$11 时，StackSets 的 StackSet 操作失败。在以下示例中，当有 6 个失败的堆栈实例且**容错**值为 5 时，StackSets 操作失败。  

![\[该使用严格容错的 StackSet 操作现在有 6 次失败的部署。该 StackSet 操作失败。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-strict-failure-tolerance-5.png)

在此示例中，CloudFormation 在停止 StackSet 操作之前部署了 9 个堆栈实例（3 个成功，6 个失败）。

**软容错**  
当使用**软容错**的 StackSet 操作将**容错**值设置为 5，**最大并发账户数**的值设置为 10 时，实际并发数为 10。  

![\[使用软容错的 StackSet 操作。容错率为 5，最大并发账户数和实际并发水平均为 10。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-1.png)

当部署开始且出现失败的堆栈实例时，实际并发数不会改变。在以下示例中，1 个堆栈操作失败，但实际并发数仍为 10。  

![\[该使用软容错的 StackSet 操作出现第一次失败。实际并发水平仍为 10。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-2.png)

即使再有 2 个堆栈实例失败，实际并发数仍保持在 10。  

![\[该使用软容错的 StackSet 操作现在有 2 次成功和 3 次失败，但实际并发数仍为 10。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-3.png)

当失败的堆栈实例超过**容错**值时，StackSets 的 StackSet 操作失败。在以下示例中，当有 6 个失败的堆栈实例且**容错**计数为 5 时，StackSets 操作失败。不过，在并发队列中的其余操作完成之前，操作不会结束。  

![\[该使用软容错的 StackSet 操作有 6 次失败，但必须完成并发队列中剩下的操作。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-4.png)

StackSets 继续部署已在并发队列中的堆栈实例。这意味着失败的堆栈实例的数量可能高于**容错**。在以下示例中，有 8 个失败的堆栈实例，因为尽管 StackSet 操作的**容错**已达到 5，但并发队列仍有 7 个操作要执行。  

![\[该 StackSet 操作总计有 8 次失败，因为在达到失败阈值后，队列中还剩 7 个部署。\]](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/concurrency-soft-failure-tolerance-5.png)

在此示例中，StackSets 在停止堆栈操作之前部署了 15 个堆栈实例（7 个成功，8 个失败）。

## 根据部署速度在“严格容错”和“软容错”之间进行选择
<a name="concurrency-mode-comparison"></a>

在**严格容错**模式和**软容错**模式之间进行选择，具体取决于 StackSet 部署的首选速度以及允许的部署失败次数。

下表显示了每种并发模式如何处理在尝试部署总共 1000 个堆栈实例时失败的 StackSet 操作。在每种情况下，**容错**的值设置为 100 个堆栈实例，**最大并发账户数**的值设置为 250 个堆栈实例。

虽然 StackSets 实际上以滑动窗口的形式对账户进行排队（参阅 [每种并发模式的工作原理](#concurrency-mode-example)），但此示例通过分批显示操作的方式来演示每种模式的速度。

### 严格容错
<a name="concurrency-mode-comparison-strict"></a>

这个示例使用**严格容错**模式，相对于前面每个批次中发生的失败数量，降低了实际并发数。每个批次有 20 个失败的实例，这会将下一个批次的实际并发数降低 20，直到 StackSet 操作达到**容错**值 100。

在下表中，第一批的初始实际并发数为 101 个堆栈实例。实际并发数为 101，因为这是**最大并发账户数**（250）和**容错**（100）\$11 中的较低值。每个批次包含 20 个失败的堆栈实例部署，这会使后续每个批次的实际并发数降低 20 个堆栈实例。


| **严格容错** | **第 1 批** | **第 2 批** | **第 3 批** | **第 4 批** | **第 5 批** | **第 6 批** | 
| --- | --- | --- | --- | --- | --- | --- | 
| 实际并发数 | 101 | 81 | 61 | 41 | 21 | - | 
| 失败的实例数 | 20 | 20 | 20 | 20 | 20 | - | 
| 成功的堆栈实例数 | 81 | 61 | 41 | 21 | 1 | - | 

当 StackSet 操作达到 100 个堆栈实例的**容错**时，使用**严格容错**的操作分五批完成了 305 个堆栈实例部署。StackSet 操作在失败之前成功部署了 205 个堆栈实例。

### 软容错
<a name="concurrency-mode-comparison-soft"></a>

此示例使用**软容错**模式，无论失败实例的数量如何，都将保持相同的实际并发数，该值由 250 个堆栈实例的**最大并发账户**值定义。在达到 100 个实例的**容错**值之前，StackSet 操作会保持相同的实际并发数。

在下表中，第一批的初始实际并发数为 250 个堆栈实例。实际并发数为 250，因为**最大并发账户数**的值设置为 250，且**软容错**模式允许 StackSets 使用此值作为实际并发数，不管失败数量是多少。虽然此示例的每个批次中都有 50 个失败的操作，但实际并发数仍不受影响。


| **软容错** | **第 1 批** | **第 2 批** | **第 3 批** | **第 4 批** | **第 5 批** | **第 6 批** | 
| --- | --- | --- | --- | --- | --- | --- | 
| 实际并发数 | 250 | 250 | - | - | - | - | 
| 失败的实例数 | 50 | 50 | - | - | - | - | 
| 成功的堆栈实例数 | 200 | 200 | - | - | - | - | 

通过相同的**最大并发账户**值和**容错**值，使用**软容错**模式的操作分两批完成了 500 个堆栈实例部署。StackSet 操作在失败之前成功部署了 400 个堆栈实例。

## 选择并发模式（控制台）
<a name="concurrency-mode-console"></a>

创建或更新 StackSet 时，在**设置部署选项**页面上，为**并发模式**选择**严格容错**或**软容错**。

## 选择并发模式（Amazon CLI）
<a name="concurrency-mode-cli"></a>

您可以通过以下 StackSets 命令使用 `ConcurrencyMode` 参数：
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-instances.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-stack-instances.html)
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/delete-stack-instances.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/delete-stack-instances.html)
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/detect-stack-set-drift.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/detect-stack-set-drift.html)
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/import-stacks-to-stack-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/import-stacks-to-stack-set.html)
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack-instances.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack-instances.html)
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/update-stack-set.html)

这些命令有一个名为 `--operation-preferences` 的现有参数，可以使用 `ConcurrencyMode` 设置。`ConcurrencyMode` 可以设置为以下任一值：
+ `STRICT_FAILURE_TOLERANCE`
+ `SOFT_FAILURE_TOLERANCE`

以下示例使用 `STRICT_FAILURE_TOLERANCE` `ConcurrencyMode` 创建堆栈实例，`FailureToleranceCount` 设置为 10，`MaxConcurrentCount` 设置为 5。

```
aws cloudformation create-stack-instances \
  --stack-set-name example-stackset \
  --accounts 123456789012 \
  --regions eu-west-1  \
  --operation-preferences ConcurrencyMode=STRICT_FAILURE_TOLERANCE,FailureToleranceCount=10,MaxConcurrentCount=5
```

**注意**  
有关创建和更新 StackSet 的详细步骤，请参阅以下主题：  
[创建 StackSets（自行管理权限）](stacksets-getting-started-create-self-managed.md)
[创建 StackSets（服务托管权限）](stacksets-orgs-associate-stackset-with-org.md)
[更新 StackSets](stacksets-update.md)