View a markdown version of this page

Amazon EC2 API 的请求节流 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

Amazon EC2 API 的请求节流

Amazon EC2 会根据每个区域限制每个 Amazon 账户的 EC2 API 请求。我们这样做是为了提升服务性能,并确保所有 Amazon EC2 用户都能公平使用。节流可确保对 Amazon EC2 API 的请求不超过允许的 API 最大请求限制。无论 API 请求来自以下哪些来源,都会受到请求限制的约束:

  • 第三方应用程序

  • 命令行工具

  • Amazon EC2 控制台

如果您超过 API 节流限制,则会收到 RequestLimitExceeded 错误代码。

如何应用节流

Amazon EC2 使用令牌存储桶算法实施 API 节流。使用此算法,您的账户拥有一个持有特定数量的令牌存储桶。存储桶中令牌的数量表示您在任意一秒的节流限制。

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 操作(例如 RunInstancesTerminateInstances,如下表所示),除了请求速率限制外,还使用资源速率限制。这些 API 会有一个独立的资源令牌存储桶,根据请求影响的资源数量来消耗令牌。与请求令牌存储桶类似,资源令牌存储桶也有一个最大容量用于支持突发请求,同时具备重填速率,使您能够在需要时持续保持稳定的请求速率。如果您超出了某个 API 的资源存储桶限制(包括当存储桶尚未重填到足以支持下一次 API 请求时的情况),即使整体 API 节流限制未达到,您仍会被限制执行该操作。

例如,RunInstances 的资源令牌存储桶容量为 1000 个令牌,重填速率为每秒 2 个令牌。因此,您可以使用任意数量的 API 请求立即启动 1000 个实例,例如一次请求启动 1000 个,或者分四次请求,每次启动 250 个实例。在资源令牌存储桶耗尽后,您每秒最多只能启动两个实例,可以是一次请求启动两个,也可以是两次请求各启动一个。

有关更多信息,请参阅 资源令牌存储桶容量和重填速率

请求令牌存储桶的容量与重填速率

为实现请求速率限制,API 操作分为以下几类:

  • Non-mutating 操作 — 用于检索资源相关数据的 API 操作。此类别通常包括所有 Describe*List*Search*Get* API 操作,例如 DescribeRouteTablesSearchTransitGatewayRoutesGetIpamPoolCidrs。这些 API 操作通常具有最高的 API 节流限制。

  • 未筛选、未分页的非变异操作 – 非变异 API 操作中的一个特定子集,如果请求未指定分页筛选条件,则会从一个较小的令牌存储桶中扣除令牌。建议您在调用这些操作时使用分页和筛选,以便令牌从标准(容量更大)的存储桶中扣除。

  • 变异操作 – 用于创建、修改或删除资源的 API 操作。此类别通常包括所有未归类为非变异操作的 API 操作,例如 AllocateHostsModifyHostsCreateCapacityReservation。这些操作的节流限制低于非变异 API 操作。

  • Resource-intensive ac tions — 修改需要最长时间和最消耗资源才能完成的 API 操作。这些操作的节流限制比变异操作更低。它们的节流是独立于其他变异操作的。

  • 控制台非变更操作 — 从 Amazon EC2 控制台请求的 Non-mutating API 操作。这些 API 操作的节流是独立于其他非变异 API 操作的。

  • 未分类操作 – 这些 API 操作会拥有独立的令牌存储桶容量和重填速率,即便从定义上它们原本属于上述某一类别。

API 操作类别 操作 存储桶最大容量 存储桶重填速率
Non-mutating actions

未包含在其他类别中的 Describe*List*Search*Get* API 操作。

100 20
未筛选、未分页的非变异操作
  • DescribeInstances

  • DescribeInstanceStatus

  • DescribeNetworkInterfaces

  • DescribeSecurityGroups

  • DescribeSnapshots

  • DescribeSpotInstanceRequests

  • DescribeVolumes

50 10
变异操作

所有非操作或未分类操作的变更 API Resource-intensive 操作

50 5
Resource-intensive actions
  • AcceptVpcPeeringConnection

  • AuthorizeSecurityGroupIngress

  • CancelSpotInstanceRequests

  • CreateKeyPair

  • CreateVpcPeeringConnection

  • DeleteVpcPeeringConnection

  • RejectVpcPeeringConnection

  • RevokeSecurityGroupIngress

  • RequestSpotInstances

50 5
控制台非变异操作

Describe*List*Search*Get* API 操作,由 Amazon EC2 控制台调用,但未包含在其他类别中。

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 节流限制时向您发出警告。有关更多信息,请参阅 使用亚马逊监控亚马逊 EC2 API 请求 CloudWatch

重试和指数回退

您的应用程序可能需要重试某个 API 请求。例如:

  • 检查资源状态是否更新

  • 枚举大量资源(例如,您的所有卷)

  • 在请求因服务端错误(5xx)或节流错误而失败时执行重试

但如果是客户端错误(4xx),您必须先修正请求中的问题,再进行重试。

资源状态更改

在开始轮询检查状态更新之前,应先预留足够时间让请求可能完成。例如,等待几分钟,然后再检查实例是否处于活动状态。当开始轮询时,应在连续请求之间设置合理的睡眠间隔,以降低 API 请求速率。为了获得最佳的效果,请使用递增或可变的睡眠间隔。

或者,您可以使用 Amazon EventBridge 通知您某些资源的状态。例如,您可以使用 EC2 实例 State-change通知事件来通知您实例的状态变化。有关更多信息,请参阅使用自动化 Amazon EC2 EventBridge

重试

当您需要轮询或重试 API 请求时,我们建议使用指数回退算法来计算请求之间的睡眠间隔。指数回退的原理是对于连续错误响应,重试等待间隔越来越长。您应该实施最长延迟间隔和最大重试次数。您还可以使用抖动(随机延迟)来避免请求持续冲突。有关更多信息,请参阅超时、重试和回退并抖动

每个 Amazon SDK 都实现了自动重试逻辑。有关更多信息,请参阅 Amazon SDKs and Tools Reference Guide 中的 Retry behavior

查看您当前的 API 限制

您可以 Amazon Web Services 账户 使用 S ervice Quotas 控制台查看每个 Amazon EC2 API 操作的当前限制和默认限制。

配额与您的油门限制有何关系

每个 API 限制都由两个配额组成,这两个配额共同定义突发请求速率和持续请求速率:

  • 存储桶最大容量-确定在突发事件中可以发出的最大请求数。这是你的爆发速率。

  • 存储桶充值率 — 决定每秒添加到存储桶中的代币数量。这是你的持续费率。

示例:查看 RunInstances 油门限制

要查看RunInstances油门限制,请搜索。RunInstances控制台显示:

  • RunInstances请求存储桶最大容量 — 例如 5(突发)

  • RunInstances请求存储桶填充率 — 例如每秒 2 个(持续)

这两个配额共同定义了完整的RunInstances油门限制。

了解配额值

  • 已申请的账户级别配额值表示适用于您的账户的任何配额改写。这是您当前的有效配额。

  • Amazon 默认配额值表示默认 API 限制配额。

注意

允许最多 24 小时将任何配额调整反映在 Service Quotas 控制台中。

查看您当前的配额
  1. https://console.aws.amazon.com/servicequotas/home/services/ec2/quotas/ 打开 Service Quotas 控制台。

  2. 搜索 API 操作名称(例如RunInstances)和配额名称模式以查找相应的配额条目。

下表描述了配额名称模式。

配额名称模式 说明
{API_NAME}请求存储桶最大容量 爆发率 — 可用代币的最大数量
{API_NAME}请求存储桶填充率 持续速率 — 每秒添加的代币
{API_NAME}未过滤的请求存储桶最大容量 Burst rate — 未经过滤(未分页)请求可用的最大令牌数量
{API_NAME}未经过滤的请求存储桶填充率 持续速率 — 每秒为未经过滤(未分页)的请求添加的代币

请求提高限制

您可以请求增加您的 Amazon Web Services 账户的 API 节流限制。

建议
  • 单次请求的限制最多不应超过您当前限制的三倍。

  • 优先请求提升存储桶的重填速率,再考虑提升存储桶的最大容量。

  • 如果您请求的重填速率会超过当前的存储桶最大容量,则应同时请求提升最大容量。

  • 提供所有需要提升限制的 API 操作。限制是应用在单个 API 操作上的,而不是应用在整个 API 操作类别上。

  • 以下 API 操作拥有请求速率限制和资源速率限制:RunInstancesStartInstancesStopInstancesTerminateInstances。务必说明您希望提升的是哪一种限制。

请求访问此功能
  1. 打开 Amazon Web Services Support 中心

  2. 选择创建工单

  3. 选择账户和账单

  4. 对于服务,选择一般信息和入门

  5. “类别” 中,选择 “使用 Amazon 和服务”。

  6. 选择下一步:其他信息

  7. 对于 Subject (主题),请输入 Request an increase in my Amazon EC2 API throttling limits

  8. 对于描述,复制以下模板并提供所需信息。

    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_1 request rate increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate region_1 resource rate increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate region_2 request rate increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate region_2 resource rate increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate
  9. 选择下一步:立即解决或联系我们

  10. 联系我们选项卡上,选择您的首选联系语言和首选联系方式。

  11. 选择提交