我在使用 Amazon CloudWatch Logs 时收到了 “RequestLimitExceeded”或“ThrottlingException”错误,并且我的 API 调用被节流了。
简短描述
使用 CloudWatch Logs 时,您可能会超出 API 速率限制。发生这种情况时,您会收到 RequestLimitExceeded 或 ThrottlingException 错误,并且您的 API 调用被节流。您必须确定节流发生的位置和时间,以便解决这些错误并就提高速率限制做出明智的申请。
解决方法
访问 CloudWatch Logs 的日志时进行间歇性节流
您可以使用 FilterLogEvents 或 GetLogEvents API 调用来列出日志事件或日志流。这些 API 调用有硬限制,不符合提高限制的条件。这意味着,如果您使用 FilterLogEvents API 从指定的日志组中搜索日志事件,则默认 quaAPI 具有默认限额。此配额为每个账户或 AWS 区域 5 个事务/秒(TPS)。如果达到此限制,您将收到 RateExceeded 错误。
使用以下最佳实践来避免此使用案例中出现节流错误:
使用应用程序/脚本获取 CloudWatch 日志数据时出现 ThrottlingException 错误
要收集 CloudWatch 日志,您可以开发一个收集器脚本。此脚本尝试调用 DescribeLogStream 或 GetLogEvents API,以在同一日志组中提取来自不同日志流或不同时间段的数据。FilterLogEvents、GetLogEvents 和 DescribeLogStreams 等 API 调用专为人工交互而非自动化设计。这意味着您会收到错误消息,并且 API 调用会被节流。
使用以下最佳实践以避免此使用案例中出现节流:
- 进行 API 调用时,请使用指数回退和重试。有关更多信息,请参阅指数回退和抖动以及 AWS 中的错误重试和指数回退。
- 随着时间的推移分发您的 API 调用。随机安排操作,以便它们随时间分布。
- 在连续的 API 调用之间添加睡眠间隔。在从同一脚本或应用程序发送的 API 调用之间添加一些延迟。如果您快速连续发送 API 调用,则更有可能导致速率错误。
- 在某些情况下,您可以使用 Splunk 等 SIEM 解决方案从 CloudWatch 中获取日志。SIEM 解决方案用于从多个系统收集数据并分析这些数据以检测异常行为。使用 Splunk 插件时,您可能会遇到 API 节流。为避免发生此问题,请使用 Amazon Kinesis Data Firehose 创建 CloudWatch Logs 订阅筛选条件,并将日志数据传输到 Splunk。有关更多信息,请参阅为适用于 AWS 的 Splunk 附加组件配置 Kinesis 输入的 Splunk 文档。
将 PutLogEvents API 调用与 Lambda 函数集成时出现节流错误
通过调用 PutLogEvents API,可以批量将日志上载到指定的日志流,每次 1MB。此 API 的速率限制为每个账户和每个区域 800 TPS。这不适用于以下区域,以下区域的限额为每个区域每个账户 1500 TPS:美国东部(弗吉尼亚州北部)、美国西部(俄勒冈州)和欧洲地区(爱尔兰)。您可以请求提高限额。
如需了解更多信息和请求提高限额,请参阅 CloudWatch Logs 限额。
管理您的 CloudWatch Logs 服务限额
AWS 确定服务配额以保护性能和确保可用性。CloudWatch 具有指标、告警、API 请求和警告电子邮件通知的配额。使用以下步骤可视化您的服务限额,并在达到阈值时设置警报:
1. 打开 Service Quotas console(Service Quotas 控制台)。
2. 在导航窗格中,选择 AWS services(AWS 服务)。
3. 从 AWS services(AWS 服务)列表中,搜索 Amazon CloudWatch Logs。
4. Service quotas(服务限额)列表显示多个属性或选项:服务限额名称、应用的值(如果可用)、AWS 默认限额以及限额值是否可调。
5. 要查看有关服务限额的更多信息(如描述),请选择限额名称。
6. 选择限额名称后,您可以看到有关此限额的更多信息。例如,如果选择 GetLogEvents throttle limit in transactions per second(GetLogEvents 节流限制(每秒事务数)),您将看到以下几项:
说明
限额代码
限额 ARN
利用率:%
应用的限额值
AWS 默认限额值
可调:是/否
7. 在 Amazon CloudWatch alarms(Amazon CloudWatch 警报)部分,选择 Create alarm(创建警报),然后输入 Alarm threshold(警报阈值)和 Alarm name(警报名称)。
相关信息
在 CloudWatch API 中调用 PutMetricData 时,如何避免节流?