

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用执行弹性测试 AWS Fault Injection Service
<a name="kinesis-fis"></a>

AWS Fault Injection Service 是一项完全托管的服务，可帮助您对 AWS 工作负载执行故障注入实验。 AWS FIS 与 Amazon Kinesis Data Streams 的集成使您能够在受控环境中针对常见的 Amazon Kinesis Data Streams API 错误测试应用程序弹性。此功能支持在遇到故障之前验证错误处理、重试逻辑和监控系统。有关更多信息，请参阅[什么是 AWS Fault Injection Service？](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html) 。

**操作**
+ API 内部错误：在目标 IAM 角色发出的请求中注入内部错误。具体响应取决于每项服务和 API。`aws:fis:inject-api-internal-error` 操作产生 `InternalFailure` 错误（HTTP 500）。
+ API 限制错误：在目标 IAM 角色发出的请求中注入内部错误。具体响应取决于每项服务和 API。`aws:fis:inject-api-throttle-error` 操作产生 `ThrottlingException` 错误（HTTP 400）。
+ API 不可用错误：在目标 IAM 角色发出的请求中注入内部错误。具体响应取决于每项服务和 API。`aws:fis:inject-api-unavailable-error` 操作产生 `ServiceUnavailable` 错误（HTTP 503）。
+ API 预置吞吐量异常：在目标 IAM 角色发出的请求中注入内部错误。具体响应取决于每项服务和 API。`aws:kinesis:inject-api-provisioned-throughput-exception` 操作产生 `ProvisionedThroughputExceededException` 错误（HTTP 400）。
+ API 迭代器到期异常：在目标 IAM 角色发出的请求中注入内部错误。具体响应取决于每项服务和 API。`aws:kinesis:inject-api-expired-iterator-exception` 操作产生 `ExpiredIteratorException` 错误（HTTP 400）。

有关更多信息，请参阅 [Amazon Kinesis Data Streams 操作](https://docs.aws.amazon.com/fis/latest/userguide/fis-actions-reference.html#aws-kinesis-actions)。

**注意事项**
+ 可以在 Amazon Kinesis Data Streams 的预置和按需产品中使用上述操作。
+ 根据所选时间完成实验后，流式传输随之恢复。您也可以在实验完成之前停止运行中的实验。或者，您可以根据在 Amazon A CloudWatch pplication Insights 中定义应用程序运行状况的警报来定义停止实验的停止条件。
+ 最多可以测试 280 个流。

有关区域支持的更多信息，请参阅 [AWS Fault Injection Service 端点和配额](https://docs.aws.amazon.com/general/latest/gr/fis.html)。

# 预置吞吐量错误
<a name="kinesis-fis-provisioned-throughput"></a>

当某个 Kinesis 流的请求速率超出一个或多个分片的吞吐量限制时，就会出现超出预置吞吐量异常错误（HTTP 400）。每个分片都有特定的读取和写入容量限制，超出这些限制就会触发这种异常。导致此种异常的场景包括：数据摄取或消耗量突然飙升，分片容量不足以应对正在处理的数据量，或者分区键分布不均。

**处理异常的建议**
+ 实现指数退避与重试机制。
+ 增加分片数量以适应更高的吞吐量。
+ 确保分区键正常分布。
+ 监控流指标。

此外，使用 Kinesis 按需容量模式有助于自动调整工作负载，并最大限度地减少这种异常的发生。有关更多信息，请参阅[什么是 AWS Fault Injection Service？](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html)

**注意**  
分布不当问题不在按需模式的自动扩缩功能范围之内。

**进行基础实验**

1. 使用基准指标：测试之前记录正常的吞吐量模式。

1. 创建实验：使用 `aws:kinesis:inject-api-provisioned-throughput-exception` 操作。

1. 配置强度：从 25% 的请求限制开始。

1. 监控响应：通过指数退避验证重试逻辑。

1. 验证扩缩：确认自动扩缩放触发了激活。

1. 检查警报：确保 `CloudWatch` 警报按预期运行。

应用程序应实施适当的退避策略、监控 `WriteProvisionedThroughputExceeded` 和 `ReadProvisionedThroughputExceeded` 指标，并在适当时触发分片扩缩。

**操作详细信息**
+ **资源类型**：IAM 角色 ARN
+ **目标操作**：`PutRecord`、`PutRecords`、`GetRecords`
+ ****错误代码****：`ProvisionedThroughputExceededException`（HTTP 400）
+ ****描述****：模拟请求速率超出分片容量限制的场景，测试应用程序限制和扩缩响应。

**参数**
+ **IAM 角色 ARN**：应用程序用于 Kinesis Data Streams 操作的角色。
+ **操作**：目标操作：`PutRecord`、`PutRecords`、`GetRecords`。
+ **资源列表**：特定的流名称或分片标识符。
+ **持续时间**：实验的持续时间，从一分钟到 12 小时不等。在 AWS FIS API 中，该值是 ISO 8601 格式的字符串。例如， PT1M 代表一分钟。在 AWS FIS 控制台中，您可以输入秒数、分钟数或小时数。
+ **强度**：要施加限制的请求的百分比。

**所需的权限**
+ `kinesis:InjectApiError`

实验模板示例

 以下示例显示了带有指定标签的所有请求（最多 5 个 Kinesis 数据流）的预配置吞吐量异常。 AWS FIS 随机选择要影响的直播。5 分钟后故障解决。

```
{
    "description": "Kinesis stream experiment",
    "targets": {
        "KinesisStreams-Target-1": {
            "resourceType": "aws:kinesis:stream",
            "resourceTags": {
                   "tag-key": "tag-value"
            },
            "selectionMode": "COUNT(5)"
        }
    },
    "actions": {
         "kinesis": {
              "actionId": "aws:kinesis:stream-provisioned-throughput-exception",
              "description": "my-stream",
              "parameters": {
                   "duration": "PT5M",
                   "percentage": "100",
                   "service": "kinesis"
              },
              "targets": {
                    "KinesisStreams": "KinesisStreams-Target-1"
              }
         }
   },
   "stopConditions": [
         {
              "source": "none"
         }
   ],
   "roleArn": "arn:aws:iam::111122223333:role/role-name",
   "tags": {},
   "experimentOptions": {
       "accountTargeting": "single-account",
       "emptyTargetResolutionMode": "fail"
   }    
}
```

实验角色权限示例

以下权限支持在特定流上执行 `aws:kinesis:stream-provisioned-throughput-exception` 和 `aws:kinesis:stream-expired-iterator-exception` 操作来影响 50% 的请求。

# 迭代器过期异常错误
<a name="kinesis-fis-expired-iterator"></a>

 迭代器过期异常错误（HTTP 400）是在分片迭代器过期时发生的，在调用 `GetRecords` 时不再用于检索流记录。读取操作之间因为长时间运行数据处理任务、网络问题或应用程序停机而产生延迟时，就会发生这种情况。

**注意**  
分片迭代器在发出后 5 分钟有效。

**处理异常的建议**
+ 在分片迭代器到期之前进行刷新。
+ 整合错误处理以获取新的迭代器。
+ 利用 Kinesis Client Library（KCL），该服务可自动管理分片迭代器的到期时间。

有关更多信息，请参阅[什么是 AWS Fault Injection Service？](https://docs.aws.amazon.com/fis/latest/userguide/what-is.html)

**进行基础实验**

1. 创建实验模板：使用 AWS FIS 控制台。

1. 选择操作：使用 `aws:kinesis:inject-api-expired-iterator-exception` 操作。

1. 配置目标：指定 IAM 角色及 Kinesis Data Streams 操作。

1. 设置持续时间：最初测试从 5-10 分钟开始。

1. 添加停止条件：的[停止条件 AWS FIS](https://docs.aws.amazon.com/fis/latest/userguide/stop-conditions.html)。

1. 运行实验：监控应用程序的行为。

**操作详细信息**
+ **资源类型**：IAM 角色 ARN
+ **目标操作**：`GetRecords`
+ ****错误代码****：`ExpiredIteratorException`（HTTP 400）
+ ****描述****：提供的迭代器超出了允许的最大期限，模拟了记录处理速度太慢或检查点操作逻辑失败的场景。

**参数**
+ **IAM 角色 ARN**：应用程序用于 Kinesis Data Streams 操作的角色。
+ **操作**：目标操作：`GetRecords`
+ **资源列表**：特定的直播名称或 ARNs。
+ **持续时间**：实验的持续时间。此项可配置。
+ **强度**：要施加限制的请求的百分比。

**所需的权限**
+ `kinesis:InjectApiError`