

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

# 亚马逊 API 的请求限制 EC2
<a name="ec2-api-throttling"></a>

Amazon EC2 会按区域限制每个 AWS 账户的 EC2 API 请求。我们这样做是为了帮助提高服务的性能，并确保所有亚马逊 EC2 买家都能公平使用。限制可确保对 Amazon EC2 API 的请求不超过允许的最大 API 请求限制。无论 API 请求来自以下哪些来源，都会受到请求限制的约束：
+ 第三方应用程序
+ 命令行工具
+ 亚马逊 EC2 控制台

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

**Topics**
+ [如何应用节流](#throttling-how)
+ [请求令牌限制](#throttling-limits-rate-based)
+ [资源令牌限制](#throttling-limits-cost-based)
+ [监控 API 节流](#throttling-monitor)
+ [重试和指数回退](#api-backoff)
+ [请求提高限制](#throttling-increase)

## 如何应用节流
<a name="throttling-how"></a>

Amazon EC2 使用[令牌存储桶算法](https://en.wikipedia.org/wiki/Token_bucket)来实现 API 限制。使用此算法，您的账户拥有一个持有特定数量的*令牌*的*存储桶*。存储桶中令牌的数量表示您在任意一秒的节流限制。

Amazon EC2 实施了两种类型的 API 限制：

**Topics**
+ [请求速率限制](#throttling-rate-based)
+ [资源速率限制](#throttling-cost-based)

### 请求速率限制
<a name="throttling-rate-based"></a>

在请求速率限制中，每个 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 次时，存储桶才有机会重新填满。

有关更多信息，请参阅 [请求令牌存储桶的容量与重填速率](#throttling-limits-rate-based)。

### 资源速率限制
<a name="throttling-cost-based"></a>

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

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

有关更多信息，请参阅 [资源令牌存储桶容量和重填速率](#throttling-limits-cost-based)。

## 请求令牌存储桶的容量与重填速率
<a name="throttling-limits-rate-based"></a>

为实现请求速率限制，API 操作分为以下几类：
+ **非变异操作** – 用于检索资源相关数据的 API 操作。此类别通常包括所有 `Describe*`、`List*`、`Search*` 和 `Get*` API 操作，例如 `DescribeRouteTables`、`SearchTransitGatewayRoutes` 和 `GetIpamPoolCidrs`。这些 API 操作通常具有最高的 API 节流限制。
+ **未筛选、未分页的非变异操作** – 非变异 API 操作中的一个特定子集，如果请求未指定[分页](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html)或[筛选条件](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/Using_Filtering.html#Filtering_Resources_CLI)，则会从一个较小的令牌存储桶中扣除令牌。建议您在调用这些操作时使用分页和筛选，以便令牌从标准（容量更大）的存储桶中扣除。
+ **变异操作** – 用于创建、修改或删除资源的 API 操作。此类别通常包括所有未归类为*非变异操作*的 API 操作，例如 `AllocateHosts`、`ModifyHosts` 和 `CreateCapacityReservation`。这些操作的节流限制低于非变异 API 操作。
+ **资源密集型操作** – 完成时间最长、消耗资源最多的变异类 API 操作。这些操作的节流限制比*变异操作*更低。它们的节流是独立于其他*变异操作*的。
+ **控制台非变更操作** — 从 Amazon 控制台请求的非变更 API 操作。 EC2 这些 API 操作的节流是独立于其他非变异 API 操作的。
+ **未分类操作** – 这些 API 操作会拥有独立的令牌存储桶容量和重填速率，即便从定义上它们原本属于上述某一类别。


| API 操作类别 | 操作 | 存储桶最大容量 | 存储桶重填速率 | 
| --- | --- | --- | --- | 
| 非变异操作 |  未包含在其他类别中的 `Describe*`、`List*`、`Search*` 和 `Get*` API 操作。  | 100 | 20 | 
| 未筛选、未分页的非变异操作 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 10 | 
| 变异操作 | 所有不是*资源密集型操作*或*未分类操作*的变异 API 操作。 | 50 | 5 | 
| 资源密集型操作 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 5 | 
| 控制台非变异操作 |  `Describe*`、`List*``Search*`、和 `Get*` API 操作，由亚马逊 EC2 控制台调用，但未包含在其他类别中。  | 100 | 10 | <a name="uncategorized"></a>


| 未分类操作 | 存储桶最大容量 | 存储桶重填速率 | 
| --- | --- | --- | 
| 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 | 

## 资源令牌存储桶容量和重填速率
<a name="throttling-limits-cost-based"></a>

下表列出了使用资源速率限制的 API 操作所对应的资源令牌存储桶容量及其重填速率。


| API 操作 | 存储桶最大容量 | 存储桶重填速率 | 
| --- | --- | --- | 
| RunInstances | 1000 | 2 | 
| TerminateInstances | 1000 | 20 | 
| StartInstances | 1000 | 2 | 
| StopInstances | 1000 | 20 | 

## 监控 API 节流
<a name="throttling-monitor"></a>

您可以使用亚马逊 CloudWatch 来监控您的亚马逊 EC2 API 请求，并收集和跟踪有关 API 限制的指标。您还可以创建警报，在接近达到 API 节流限制时向您发出警告。有关更多信息，请参阅 [使用亚马逊监控亚马逊 EC2 API 请求 CloudWatch使用监控 API 请求 CloudWatch](monitor.md)。

## 重试和指数回退
<a name="api-backoff"></a>

您的应用程序可能需要重试某个 API 请求。例如：
+ 检查资源状态是否更新
+ 枚举大量资源（例如，您的所有卷）
+ 在请求因服务端错误（5xx）或节流错误而失败时执行重试

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

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

或者，您可以使用 Amazon EventBridge 通知您某些资源的状态。例如，您可以使用**EC2 实例状态更改通知**事件来通知您实例的状态变化。有关更多信息，请参阅[ EC2 使用自动化 Amazon EventBridge](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/automating_with_eventbridge.html)。

**重试**  
当您需要轮询或重试 API 请求时，我们建议使用指数回退算法来计算请求之间的睡眠间隔。指数回退的原理是对于连续错误响应，重试等待间隔越来越长。您应该实施最长延迟间隔和最大重试次数。您还可以使用抖动（随机延迟）来避免请求持续冲突。有关更多信息，请参阅[超时、重试和回退并抖动](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/)。

每个 AWS SDK 都实现了自动重试逻辑。有关更多信息，请参阅《工具参考指南》*AWS SDKs 和《工具参考指南*》中的[重试行为](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html)。

## 请求提高限制
<a name="throttling-increase"></a>

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

**建议**
+ 单次请求的限制最多不应超过您当前限制的三倍。
+ 优先请求提升存储桶的重填速率，再考虑提升存储桶的最大容量。
+ 如果您请求的重填速率会超过当前的存储桶最大容量，则应同时请求提升最大容量。
+ 提供所有需要提升限制的 API 操作。限制是应用在单个 API 操作上的，而不是应用在整个 API 操作类别上。
+ 以下 API 操作拥有请求速率限制和资源速率限制：`RunInstances`、`StartInstances`、`StopInstances` 和 `TerminateInstances`。务必说明您希望提升的是哪一种限制。

**请求访问此功能**

1. 打开 [AWS 支持 中心](https://console.aws.amazon.com/support/home#/)。

1. 选择**创建工单**。

1. 选择**账户和账单**。

1. 对于**服务**，选择**一般信息和入门**。

1. 在 **“类别”** 中，选择 “**使用 AWS 和服务**”。

1. 选择**下一步：其他信息**。

1. 对于 **Subject (主题)**，请输入 **Request an increase in my Amazon EC2 API throttling limits**。

1. 对于**描述**，复制以下模板并提供所需信息。

   ```
   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
   ```

1. 选择**下一步：立即解决或联系我们**。

1. 在**联系我们**选项卡上，选择您的首选联系语言和首选联系方式。

1. 选择**提交**。