本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 API 的请求限制 EC2
Amazon EC2 会按区域限制每个 AWS 账户的 EC2 API 请求。我们这样做是为了帮助提高服务的性能,并确保所有亚马逊 EC2 买家都能公平使用。限制可确保对 Amazon EC2 API 的请求不超过允许的最大 API 请求限制。无论 API 请求来自以下哪些来源,都会受到请求限制的约束:
-
第三方应用程序
-
命令行工具
-
亚马逊 EC2 控制台
如果您超过 API 节流限制,则会收到 RequestLimitExceeded 错误代码。
如何应用节流
Amazon EC2 使用令牌存储桶算法
Amazon EC2 实施了两种类型的 API 限制:
请求速率限制
在请求速率限制中,每个 API 都会被单独评估,您的节流限制按每个 API 的请求数量分别计算。您每发起一次请求,就会从该 API 的存储桶中移除一个令牌。例如,非变异 API 操作的 DescribeHosts 的令牌存储桶容量为 100 个令牌。您在一秒内最多可以发起 100 次 DescribeHosts 请求。如果在某一秒内超过 100 次请求,您会在该 API 上被节流,剩余请求会失败;但其他 API 的请求不受影响。
存储桶会以设定的速率自动填充。如果存储桶的容量低于其最大容量,则每秒都会向其添加一定数量的令牌,直到其达到最大容量。如果重填令牌到达时存储桶已满,额外的令牌会被丢弃。存储桶中的令牌数量不能超过其最大数量。例如,非变异 API 操作的 DescribeHosts 的令牌存储桶容量为 100 个令牌,重填速率为每秒 20 个令牌。如果您在一秒钟内发起 100 次 DescribeHosts 请求,存储桶中的令牌将被消耗至零(0)。之后,存储桶会以每秒 20 个的速度重填令牌,直到重新达到 100 个的最大容量。这意味着,如果期间没有请求,一个空存储桶需要 5 秒才能重新装满。
您无需等存储桶完全填满才能继续发起 API 请求。您可以使用刚添加进存储桶的重填令牌。如果您立即使用重填令牌,存储桶就不会达到最大容量。例如,非变异 API 操作的 DescribeHosts 的令牌存储桶容量为 100 个令牌,重填速率为每秒 20 个令牌。如果您在一秒内用掉存储桶中的全部 100 个令牌,仍可以随后每秒发起 20 次请求,使用的就是不断重填到存储桶中的令牌。只有当您每秒发起的请求少于 20 次时,存储桶才有机会重新填满。
有关更多信息,请参阅 请求令牌存储桶的容量与重填速率。
资源速率限制
某些 API 操作(例如 RunInstances 和 TerminateInstances,如下表所示),除了请求速率限制外,还使用资源速率限制。这些 API 会有一个独立的资源令牌存储桶,根据请求影响的资源数量来消耗令牌。与请求令牌存储桶类似,资源令牌存储桶也有一个最大容量用于支持突发请求,同时具备重填速率,使您能够在需要时持续保持稳定的请求速率。如果您超出了某个 API 的资源存储桶限制(包括当存储桶尚未重填到足以支持下一次 API 请求时的情况),即使整体 API 节流限制未达到,您仍会被限制执行该操作。
例如,RunInstances 的资源令牌存储桶容量为 1000 个令牌,重填速率为每秒 2 个令牌。因此,您可以使用任意数量的 API 请求立即启动 1000 个实例,例如一次请求启动 1000 个,或者分四次请求,每次启动 250 个实例。在资源令牌存储桶耗尽后,您每秒最多只能启动两个实例,可以是一次请求启动两个,也可以是两次请求各启动一个。
有关更多信息,请参阅 资源令牌存储桶容量和重填速率。
请求令牌存储桶的容量与重填速率
为实现请求速率限制,API 操作分为以下几类:
-
非变异操作 – 用于检索资源相关数据的 API 操作。此类别通常包括所有
Describe*、List*、Search*和Get*API 操作,例如DescribeRouteTables、SearchTransitGatewayRoutes和GetIpamPoolCidrs。这些 API 操作通常具有最高的 API 节流限制。 -
未筛选、未分页的非变异操作 – 非变异 API 操作中的一个特定子集,如果请求未指定分页或筛选条件,则会从一个较小的令牌存储桶中扣除令牌。建议您在调用这些操作时使用分页和筛选,以便令牌从标准(容量更大)的存储桶中扣除。
-
变异操作 – 用于创建、修改或删除资源的 API 操作。此类别通常包括所有未归类为非变异操作的 API 操作,例如
AllocateHosts、ModifyHosts和CreateCapacityReservation。这些操作的节流限制低于非变异 API 操作。 -
资源密集型操作 – 完成时间最长、消耗资源最多的变异类 API 操作。这些操作的节流限制比变异操作更低。它们的节流是独立于其他变异操作的。
-
控制台非变更操作 — 从 Amazon 控制台请求的非变更 API 操作。 EC2 这些 API 操作的节流是独立于其他非变异 API 操作的。
-
未分类操作 – 这些 API 操作会拥有独立的令牌存储桶容量和重填速率,即便从定义上它们原本属于上述某一类别。
| API 操作类别 | 操作 | 存储桶最大容量 | 存储桶重填速率 |
|---|---|---|---|
| 非变异操作 |
未包含在其他类别中的 |
100 | 20 |
| 未筛选、未分页的非变异操作 |
|
50 | 10 |
| 变异操作 | 所有不是资源密集型操作或未分类操作的变异 API 操作。 |
50 | 5 |
| 资源密集型操作 |
|
50 | 5 |
| 控制台非变异操作 |
|
100 | 10 |
| 未分类操作 | 存储桶最大容量 | 存储桶重填速率 |
|---|---|---|
AcceptVpcEndpointConnections |
10 | 1 |
AdvertiseByoipCidr |
1 | 0.1 |
AssignIpv6Addresses |
100 | 5 |
AssignPrivateIpAddresses |
100 | 5 |
AssignPrivateNatGatewayAddress |
10 | 1 |
AssociateCapacityReservationBillingOwner |
1 | 0.5 |
AssociateEnclaveCertificateIamRole |
10 | 1 |
AssociateIamInstanceProfile |
100 | 5 |
AssociateNatGatewayAddress |
10 | 1 |
AttachVerifiedAccessTrustProvider |
10 | 2 |
AuthorizeClientVpnIngress |
5 | 2 |
CancelDeclarativePoliciesReport |
1 | 1 |
CopyImage |
100 | 1 |
CreateClientVpnRoute |
5 | 2 |
CreateCoipCidr |
5 | 1 |
CreateCoipPool |
5 | 1 |
CreateDefaultSubnet |
1 | 1 |
CreateDefaultVpc |
1 | 1 |
CreateLaunchTemplateVersion |
100 | 5 |
CreateNatGateway |
10 | 1 |
CreateNetworkInterface |
100 | 5 |
CreateRestoreImageTask |
50 | 0.1 |
CreateSnapshot |
100 | 5 |
CreateSnapshots |
100 | 5 |
CreateSpotDatafeedSubscription |
50 | 3 |
CreateStoreImageTask |
50 | 0.1 |
CreateSubnetCidrReservation |
5 | 1 |
CreateTags |
100 | 10 |
CreateVerifiedAccessEndpoint |
20 | 4 |
CreateVerifiedAccessGroup |
10 | 2 |
CreateVerifiedAccessInstance |
10 | 2 |
CreateVerifiedAccessTrustProvider |
10 | 2 |
CreateVolume |
100 | 5 |
CreateVpcEndpoint |
4 | 0.3 |
CreateVpcEndpointServiceConfiguration |
10 | 1 |
DeleteClientVpnRoute |
5 | 2 |
DeleteCoipCidr |
5 | 1 |
DeleteCoipPool |
5 | 1 |
DeleteCoipPoolPermission |
5 | 1 |
DeleteNatGateway |
10 | 1 |
DeleteNetworkInterface |
100 | 5 |
DeleteSnapshot |
100 | 5 |
DeleteSpotDatafeedSubscription |
50 | 3 |
DeleteSubnetCidrReservation |
5 | 1 |
DeleteQueuedReservedInstances |
5 | 5 |
DeleteTags |
100 | 10 |
DeleteVerifiedAccessEndpoint |
20 | 4 |
DeleteVerifiedAccessGroup |
10 | 2 |
DeleteVerifiedAccessInstance |
10 | 2 |
DeleteVerifiedAccessTrustProvider |
10 | 2 |
DeleteVolume |
100 | 5 |
DeleteVpcEndpoints |
4 | 0.3 |
DeleteVpcEndpointServiceConfigurations |
10 | 1 |
DeprovisionByoipCidr |
1 | 0.1 |
DeregisterImage |
100 | 5 |
DescribeAggregateIdFormat |
10 | 10 |
DescribeByoipCidrs |
1 | 0.5 |
DescribeCapacityBlockExtensionOfferings |
10 | 0.15 |
DescribeCapacityBlockOfferings |
10 | 0.15 |
DescribeDeclarativePoliciesReports |
5 | 5 |
DescribeHostReservations |
5 | 2 |
DescribeHostReservationOfferings |
5 | 2 |
DescribeIdentityIdFormat |
10 | 10 |
DescribeIdFormat |
10 | 10 |
DescribeInstanceTopology |
1 | 1 |
DescribeMovingAddresses |
1 | 1 |
DescribePrincipalIdFormat |
10 | 10 |
DescribeReservedInstancesOfferings |
10 | 10 |
DescribeSecurityGroupReferences |
20 | 5 |
DescribeSpotDatafeedSubscription |
100 | 13 |
DescribeSpotFleetInstances |
100 | 5 |
DescribeSpotFleetRequestHistory |
100 | 5 |
DescribeSpotFleetRequests |
50 | 3 |
DescribeStaleSecurityGroups |
20 | 5 |
DescribeStoreImageTasks |
50 | 0.5 |
DescribeVerifiedAccessInstanceLoggingConfigurations |
10 | 2 |
DetachVerifiedAccessTrustProvider |
10 | 2 |
DisableFastLaunch |
5 | 2 |
DisableImageBlockPublicAccess |
1 | 0.1 |
DisableSnapshotBlockPublicAccess |
1 | 0.1 |
DisassociateCapacityReservationBillingOwner |
1 | 0.5 |
DisassociateEnclaveCertificateIamRole |
10 | 1 |
DisassociateIamInstanceProfile |
100 | 5 |
DisassociateNatGatewayAddress |
10 | 1 |
EnableFastLaunch |
5 | 2 |
EnableImageBlockPublicAccess |
1 | 0.1 |
EnableSnapshotBlockPublicAccess |
1 | 0.1 |
GetAssociatedEnclaveCertificateIamRoles |
10 | 1 |
GetDeclarativePoliciesReportSummary |
5 | 5 |
GetHostReservationPurchasePreview |
5 | 2 |
ModifyImageAttribute |
100 | 5 |
ModifyInstanceMetadataDefaults |
2 | 2 |
ModifyInstanceMetadataOptions |
100 | 5 |
ModifyLaunchTemplate |
100 | 5 |
ModifyNetworkInterfaceAttribute |
100 | 5 |
ModifySnapshotAttribute |
100 | 5 |
ModifyVerifiedAccessEndpoint |
20 | 4 |
ModifyVerifiedAccessEndpointPolicy |
20 | 4 |
ModifyVerifiedAccessGroup |
10 | 2 |
ModifyVerifiedAccessGroupPolicy |
20 | 4 |
ModifyVerifiedAccessInstance |
10 | 2 |
ModifyVerifiedAccessInstanceLoggingConfiguration |
10 | 2 |
ModifyVerifiedAccessTrustProvider |
10 | 2 |
ModifyVpcEndpoint |
4 | 0.3 |
ModifyVpcEndpointServiceConfiguration |
10 | 1 |
MoveAddressToVpc |
1 | 1 |
ProvisionByoipCidr |
1 | 0.1 |
PurchaseCapacityBlock |
10 | 0.15 |
PurchaseCapacityBlockExtension |
10 | 0.15 |
PurchaseHostReservation |
5 | 2 |
PurchaseReservedInstancesOffering |
5 | 5 |
RejectVpcEndpointConnections |
10 | 1 |
RestoreAddressToClassic |
1 | 1 |
RevokeClientVpnIngress |
5 | 2 |
RunInstances |
5 | 2 |
StartDeclarativePoliciesReport |
1 | 1 |
StartInstances |
5 | 2 |
TerminateInstances |
100 | 5 |
UnassignPrivateIpAddresses |
100 | 5 |
UnassignPrivateNatGatewayAddress |
10 | 1 |
WithdrawByoipCidr |
1 | 0.1 |
资源令牌存储桶容量和重填速率
下表列出了使用资源速率限制的 API 操作所对应的资源令牌存储桶容量及其重填速率。
| API 操作 | 存储桶最大容量 | 存储桶重填速率 |
|---|---|---|
RunInstances |
1000 | 2 |
TerminateInstances |
1000 | 20 |
StartInstances |
1000 | 2 |
StopInstances |
1000 | 20 |
监控 API 节流
您可以使用亚马逊 CloudWatch 来监控您的亚马逊 EC2 API 请求,并收集和跟踪有关 API 限制的指标。您还可以创建警报,在接近达到 API 节流限制时向您发出警告。有关更多信息,请参阅 使用 Amazon CloudWatch 监控 Amazon EC2 API 请求。
重试和指数回退
您的应用程序可能需要重试某个 API 请求。例如:
-
检查资源状态是否更新
-
枚举大量资源(例如,您的所有卷)
-
在请求因服务端错误(5xx)或节流错误而失败时执行重试
但如果是客户端错误(4xx),您必须先修正请求中的问题,再进行重试。
资源状态更改
在开始轮询检查状态更新之前,应先预留足够时间让请求可能完成。例如,等待几分钟,然后再检查实例是否处于活动状态。当开始轮询时,应在连续请求之间设置合理的睡眠间隔,以降低 API 请求速率。为了获得最佳的效果,请使用递增或可变的睡眠间隔。
或者,您可以使用 Amazon EventBridge 通知您某些资源的状态。例如,您可以使用EC2 实例状态更改通知事件来通知您实例的状态变化。有关更多信息,请参阅 EC2 使用自动化 Amazon EventBridge。
重试
当您需要轮询或重试 API 请求时,我们建议使用指数回退算法来计算请求之间的睡眠间隔。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。您应该实施最长延迟间隔和最大重试次数。您还可以使用抖动(随机延迟)来避免请求持续冲突。有关更多信息,请参阅超时、重试和回退并抖动
每个 AWS SDK 都实现了自动重试逻辑。有关更多信息,请参阅《工具参考指南》AWS SDKs 和《工具参考指南》中的重试行为。
请求提高限制
您可以请求增加您的 AWS 账户的 API 节流限制。
建议
-
单次请求的限制最多不应超过您当前限制的三倍。
-
优先请求提升存储桶的重填速率,再考虑提升存储桶的最大容量。
-
如果您请求的重填速率会超过当前的存储桶最大容量,则应同时请求提升最大容量。
-
提供所有需要提升限制的 API 操作。限制是应用在单个 API 操作上的,而不是应用在整个 API 操作类别上。
-
以下 API 操作拥有请求速率限制和资源速率限制:
RunInstances、StartInstances、StopInstances和TerminateInstances。务必说明您希望提升的是哪一种限制。
请求访问此功能
-
打开 AWS 支持 中心
。 -
选择创建工单。
-
选择账户和账单。
-
对于服务,选择一般信息和入门。
-
在 “类别” 中,选择 “使用 AWS 和服务”。
-
选择下一步:其他信息。
-
对于 Subject (主题),请输入
Request an increase in my Amazon EC2 API throttling limits。 -
对于描述,复制以下模板并提供所需信息。
Please increase the API throttling limits for my account. Related page: https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-throttling.html Description:Brief notes about your use case. If available, include the IDs of a few Amazon EC2 requests that were throttled.Time window:One-hour window when peak throttling or usage occurred.region_1request rate increases:action:new_bucket_maximum_capacityaction:new_bucket_refill_rateaction:new_bucket_maximum_capacity|new_bucket_refill_rateregion_1resource rate increases:action:new_bucket_maximum_capacityaction:new_bucket_refill_rateaction:new_bucket_maximum_capacity|new_bucket_refill_rateregion_2request rate increases:action:new_bucket_maximum_capacityaction:new_bucket_refill_rateaction:new_bucket_maximum_capacity|new_bucket_refill_rateregion_2resource rate increases:action:new_bucket_maximum_capacityaction:new_bucket_refill_rateaction:new_bucket_maximum_capacity|new_bucket_refill_rate -
选择下一步:立即解决或联系我们。
-
在联系我们选项卡上,选择您的首选联系语言和首选联系方式。
-
选择提交。