处理 Amazon ECS 节流问题的最佳实践 - Amazon Elastic Container Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

处理 Amazon ECS 节流问题的最佳实践

节流错误分为两大类:同步节流和异步节流。

同步节流

发生同步节流时,您会立即收到来自 Amazon ECS 的错误响应。如果在运行任务或创建服务时调用 Amazon ECS API,则通常会发生此类节流。有关所涉及的节流和相关节流限制的更多信息,请参阅请求对 Amazon ECS API 进行节流

例如,当您的应用程序通过使用 Amazon CLI 或 Amazon SDK 发起 API 请求时,您可以修复 API 节流。为此,您可以设计应用程序以处理错误,也可以通过对 API 调用实现带有重试逻辑的指数回退和抖动策略。有关更多信息,请参阅超时、重试和回退并抖动

如果您使用 Amazon SDK,则自动重试逻辑已内置且可配置。

异步节流

发生异步节流是因为异步工作流程中 Amazon ECS 或 Amazon CloudFormation 可能代表您调用 API 来预置资源。重要的是了解 Amazon ECS 代表您调用了哪些 Amazon API。例如,对使用 awsvpc 网络模式的任务调用 CreateNetworkInterface API,对注册到负载均衡器的任务执行运行状况检查时调用 DescribeTargetHealth API。

当您的工作负载达到相当大的规模时,这些 API 操作可能会受到限制。也就是说,其可能会受到足够的限制,以违反所调用的 Amazon ECS 或 Amazon Web Service 强制执行的限制。例如,如果您部署了数百项服务,每项服务同时有数百个使用 awsvpc 网络模式的任务,则 Amazon ECS 会调用 Amazon EC2 API 操作(例如 CreateNetworkInterface)和 Elastic Load Balancing API 操作(例如 RegisterTargetDescribeTargetHealth)分别注册弹性网络接口和负载均衡器。这些 API 调用可能会超出 API 限制,从而导致节流错误。以下是服务事件消息中包含的 Elastic Load Balancing 节流错误的示例。

{ "userIdentity":{ "arn":"arn:aws:sts::111122223333:assumed-role/AWSServiceRoleForECS/ecs-service-scheduler", "eventTime":"2022-03-21T08:11:24Z", "eventSource":"elasticloadbalancing.amazonaws.com", "eventName":" DescribeTargetHealth ", "awsRegion":"us-east-1", "sourceIPAddress":"ecs.amazonaws.com", "userAgent":"ecs.amazonaws.com", "errorCode":"ThrottlingException", "errorMessage":"Rate exceeded", "eventID":"0aeb38fc-229b-4912-8b0d-2e8315193e9c" } }

当这些 API 调用与您账户中的其他 API 流量共享限制时,即使其作为服务事件发出,也可能难以监控。

监控节流

确定哪些 API 请求受到限制,以及发出这些请求的人员非常重要。您可以使用 Amazon CloudTrail 监控节流,并与 CloudWatch、Amazon Athena 和 Amazon EventBridge 集成。您可以将 CloudTrail 配置为将特定事件发送到 CloudWatch Logs。CloudWatch Logs 日志见解可解析和分析事件。这可识别节流事件中的详细信息,例如发出调用的用户或 IAM 角色以及发出的 API 调用数。有关更多信息,请参阅使用 CloudWatch Logs 监控 CloudTrail 日志文件

有关 CloudWatch Logs Insights 的更多信息以及如何查询日志文件的说明,请参阅使用 CloudWatch Logs Insights 分析日志数据

借助 Amazon Athena,您可以使用标准 SQL 创建查询和分析数据。例如,您可以创建一个 Athena 表来解析 CloudTrail 事件。有关更多信息,请参阅使用 CloudTrail 控制台为 CloudTrail 日志创建 Athena 表

创建 Athena 表后,您可以使用简单 SQL 查询(例如以下查询)来调查 ThrottlingException 错误。

select eventname, errorcode,eventsource,awsregion, useragent,COUNT(*) count FROM cloudtrail-table-name where errorcode = 'ThrottlingException' AND eventtime between '2022-01-14T03:00:08Z' and '2022-01-23T07:15:08Z' group by errorcode, awsregion, eventsource, username, eventname order by count desc;

Amazon ECS 还会向 Amazon EventBridge 发送事件通知。有资源状态变更事件和服务操作事件。它们包括 API 节流事件,例如 ECS_OPERATION_THROTTLEDSERVICE_DISCOVERY_OPERATION_THROTTLED。有关更多信息,请参阅 Amazon ECS 服务操作事件

Amazon Lambda 等服务可以使用这些事件来执行响应操作。有关更多信息,请参阅 处理 Amazon ECS 事件

如果您运行独立任务,则某些 API 操作(例如 RunTask)是异步的,并且不会自动执行重试操作。在这种情况下,您可以使用 Amazon Step Functions 等服务与 EventBridge 集成来重试受限制或失败的操作。有关更多信息,请参阅管理容器任务(Amazon ECS、Amazon SNS)

使用 CloudWatch 监控节流

CloudWatch 为按 Amazon 资源下的 Usage 命名空间提供 API 使用情况监控。这些指标记录为 API 类型和指标名称 CallCount。您可以创建警报,以在这些指标达到特定阈值时启动。有关更多信息,请参阅可视化 Service Quotas 并设置警报

CloudWatch 还提供异常检测功能。此功能使用机器学习,根据您启用该功能的指标的特定行为来分析和建立基准。如果出现异常的 API 活动,则您可以将此功能与 CloudWatch 警报一起使用。有关更多信息,请参阅使用 CloudWatch 异常检测

通过主动监控节流错误,您可以联系 Amazon Web Services Support 提高相关的节流限制,还可以获得针对您独特应用需求的指导。