

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon EC2 API 的請求限流
<a name="ec2-api-throttling"></a>

Amazon EC2 會根據區域調節每個 AWS 帳戶的 EC2 API 請求。我們這樣做是為了協助服務的效能，並確保所有 Amazon EC2 客戶的公平使用。調節可確保對 Amazon EC2 API 的請求不超過允許的 API 請求限制上限。API 請求受請求限制的約束，無論其來源是：
+ 第三方應用程式
+ 命令列工具
+ Amazon 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 的儲存貯體中移除一個字符。例如，`DescribeHosts`*非變動 * API 動作的字符儲存貯體大小為 100 個字符。一秒內最多可以提出 100 個`DescribeHosts`請求。如果您在一秒內超過 100 個請求，則會對該 API 進行調節，而且該秒內剩餘的請求會失敗，不過，對其他 API 的請求不會受到影響。

儲存貯體會自動以設定的速率重新填充。如果儲存貯體低於容量上限，則每秒會新增一組字符數量，直到達到容量上限為止。如果補充字符送達時儲存貯體已滿，則會捨棄它們。儲存貯體不能保留超過其字符數量上限。例如，`DescribeHosts`*非變動* API 動作的 儲存貯體大小為 100 個字符，而重新填充速率為每秒 20 個字符。如果您在一秒內提出 100 個`DescribeHosts`請求，儲存貯體會減少為零 (0) 個字符。然後，儲存貯體每秒會重新填充 20 個字符，直到達到其 100 個字符的最大容量為止。這表示如果在此期間沒有提出任何請求，空儲存貯體會在 5 秒後達到其最大容量。

您不需要等待儲存貯體完全填滿，即可提出 API 請求。您可以使用新增至儲存貯體的重新填充字符。如果您立即使用重新填充字符，則儲存貯體不會達到其容量上限。例如，`DescribeHosts`*非變動* API 動作的 儲存貯體大小為 100 個字符，而重新填充速率為每秒 20 個字符。如果您在一秒內提出 100 個 API 請求以耗盡儲存貯體，則可以使用新增至儲存貯體的重新填充字符，繼續每秒提出 20 個 API 請求。只有在每秒提出少於 20 個 API 請求時，儲存貯體才能重新填充至最大容量。

如需詳細資訊，請參閱[請求字符儲存貯體大小和重新填充率](#throttling-limits-rate-based)。

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

如下表所述`TerminateInstances`，某些 API 動作，例如 `RunInstances`和 ，除了請求速率限制之外，還會使用資源速率限制。這些 API 動作具有單獨的資源字符儲存貯體，根據受請求影響的資源數量耗盡。與請求字符儲存貯體一樣，資源字符儲存貯體具有可讓您爆量的儲存貯體上限，以及可讓您視需要維持穩定請求速率的重新填充速率。如果您超過 API 的特定儲存貯體限制，包括當儲存貯體尚未重新填充以支援下一個 API 請求時，即使您尚未達到總 API 節流限制，API 的動作也會受到限制。

例如， 的資源字符儲存貯體大小`RunInstances`為 1000 個字符，而重新填充速率為每秒兩個字符。因此，您可以使用任意數量的 API 請求，立即啟動 1000 個執行個體，例如 1 個請求的 1000 個執行個體，或 4 個請求的 250 個執行個體。在資源字符儲存貯體為空之後，您可以每秒啟動最多兩個執行個體，針對兩個執行個體使用一個請求，或針對一個執行個體使用兩個請求。

如需詳細資訊，請參閱[資源字符儲存貯體大小和重新填充率](#throttling-limits-cost-based)。

## 請求字符儲存貯體大小和重新填充率
<a name="throttling-limits-rate-based"></a>

為了限制請求率，API 動作會分組為下列類別：
+ **非變動動作** — 擷取資源相關資料的 API 動作。此類別通常包含所有 `Describe*`、`Search*`、 `List*`和 `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 EC2 主控台請求的非變動 API 動作。這些 API 動作會與其他非變動的 API 動作分開調節。
+ **未分類的動作** — 這些是接收自己的字符儲存貯體大小和重新填充率的 API 動作，即使根據定義，它們適合其他類別之一。


| API 動作類別 | 動作 | 儲存貯體容量上限 | 儲存貯體重新填充率 | 
| --- | --- | --- | --- | 
| 非變動動作 |  不包含在另一個類別中的 `Search*`、、 `Describe*` `List*`和 `Get*` API 動作。  | 100 | 20 | 
| 未篩選和未分頁的非變動動作 |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/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_tw/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 5 | 
| 主控台非變動動作 |  `Describe*`、`Search*`、 `List*`和 `Get*` API 動作，由 Amazon 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>

您可以使用 Amazon CloudWatch 來監控 Amazon EC2 API 請求，以及收集和追蹤 API 限流的相關指標。您也可以建立警示，在接近 API 限流限制時提醒您。如需詳細資訊，請參閱[使用 Amazon CloudWatch 監控 Amazon EC2 API 請求 Amazon CloudWatch使用 CloudWatch 監控 API 請求](monitor.md)。

## 重試和指數退避
<a name="api-backoff"></a>

您的應用程式可能需要重試 API 請求。例如：
+ 檢查資源狀態的更新
+ 列舉大量資源 （例如，所有磁碟區）
+ 在請求失敗並出現伺服器錯誤 (5xx) 或限流錯誤後重試請求

不過，對於用戶端錯誤 (4xx)，您必須先修改請求以修正問題，然後再嘗試請求。

**資源狀態變更**  
在您開始輪詢以檢查狀態更新之前，請給予可能完成的請求時間。例如，請等待幾分鐘，然後檢查您的執行個體是否處於作用中狀態。當您開始輪詢時，請在連續請求之間使用適當的休眠間隔，以降低 API 請求的速率。為了獲得最佳結果，請使用較長或可變的休眠間隔。

或者，您可以使用 Amazon EventBridge 來通知您一些資源的狀態。例如，您可以使用 **EC2 執行個體狀態變更通知**事件來通知您執行個體的狀態變更。如需詳細資訊，請參閱[使用 EventBridge 自動化 Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/automating_with_eventbridge.html)。

**重試**  
當您需要輪詢或重試 API 請求時，我們建議您使用指數退避演算法來計算 API 請求之間的休眠間隔。指數退避的背後概念是，對於連續錯誤回應，讓重試之間的等待時間漸進拉長。您應該實作延遲間隔上限，以及重試次數上限。您也可以使用抖動 （隨機延遲） 來防止連續的碰撞。如需詳細資訊，請參閱 [Timeouts, retries, and backoff with jitter](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>

您可以請求提高 的 API 限流限制 AWS 帳戶。

**建議**
+ 在單一請求中，請求最多是現有限制的三倍。
+ 在增加儲存貯體最大容量之前，優先提高儲存貯體重新填充率。
+ 如果請求的儲存貯體重新填充率超過儲存貯體容量上限，請同時增加儲存貯體容量上限。
+ 提供需要增加的所有 API 動作。限制會套用至個別 API 動作，而非 API 動作類別。
+ 下列 API 動作有請求率和資源率限制：`RunInstances`、`StopInstances`、 `StartInstances`和 `TerminateInstances`。請務必指出應提高哪些限制

**請求存取此功能**

1. 開啟[AWS 支援 中心](https://console.aws.amazon.com/support/home#/)。

1. 選擇**建立案例**。

1. 選擇 **帳戶和帳單**。

1. 針對**服務**，選擇**一般資訊和入門**。

1. 針對**類別**，選擇**使用 AWS & 服務**。

1. 選擇 **Next step: Additional information** (下一步：其他資訊)。

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. 選擇**提交**。