Amazon EC2 API 的請求限流 - Amazon Elastic Compute Cloud

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

Amazon EC2 API 的請求限流

Amazon EC2 會根據區域調節每個 AWS 帳戶的 EC2 API 請求。我們這樣做是為了協助服務的效能,並確保所有 Amazon EC2 客戶的公平使用。調節可確保對 Amazon EC2 API 的請求不超過允許的 API 請求限制上限。API 請求受請求限制的約束,無論其來源是:

  • 第三方應用程式

  • 命令列工具

  • Amazon EC2 主控台

如果您超過 API 限流限制,您會收到RequestLimitExceeded錯誤碼。

如何套用限流

Amazon EC2 使用字符儲存貯體演算法來實作 API 限流。透過此演算法,您的帳戶會有一個儲存體,其中包含特定數量的字符。儲存貯體中的字符數量代表您在任何指定秒的限流限制。

Amazon EC2 實作兩種類型的 API 限流:

請求率限制

使用請求速率限制時,每個 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 請求時,儲存貯體才能重新填充至最大容量。

如需詳細資訊,請參閱請求字符儲存貯體大小和重新填充率

資源速率限制

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

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

如需詳細資訊,請參閱資源字符儲存貯體大小和重新填充率

請求字符儲存貯體大小和重新填充率

為了限制請求率,API 動作會分組為下列類別:

  • 非變動動作 — 擷取資源相關資料的 API 動作。此類別通常包含所有 Describe*Search*List*Get* API 動作,例如 DescribeRouteTablesSearchTransitGatewayRoutesGetIpamPoolCidrs。這些 API 動作通常具有最高的 API 限流限制。

  • 未篩選和未分頁的非變動動作 — 非變動 API 動作的特定子集,在未指定分頁篩選條件的情況下,使用較小的字符儲存貯體中的字符。建議您使用分頁和篩選,以便從標準 (大型) 字符儲存貯體中扣除字符。

  • 變動動作 — 建立、修改或刪除資源的 API 動作。此類別通常包含未分類為非變動動作的所有 API 動作,例如 AllocateHostsModifyHostsCreateCapacityReservation。這些動作的限流限制低於非變動 API 動作。

  • 資源密集型動作 — 將花費最多時間且耗用最多資源的 API 動作進行轉換。相較於變動動作,這些動作的限流限制甚至更低。它們與其他變動動作分開調節。

  • 主控台非變動動作 — 從 Amazon EC2 主控台請求的非變動 API 動作。這些 API 動作會與其他非變動 API 動作分開調節。

  • 未分類的動作 — 這些是接收自己的字符儲存貯體大小和重新填充率的 API 動作,即使根據定義,它們適合其他類別之一。

API 動作類別 動作 儲存貯體容量上限 儲存貯體重新填充率
非變動動作

不包含在另一個類別中的 Search*、、 Describe* List*Get* API 動作。

100 20
未篩選和未分頁的非變動動作
  • DescribeInstances

  • DescribeInstanceStatus

  • DescribeNetworkInterfaces

  • DescribeSecurityGroups

  • DescribeSnapshots

  • DescribeSpotInstanceRequests

  • DescribeVolumes

50 10
變動動作

所有非資源密集型動作或未分類動作的變動 API 動作

50 5
資源密集型動作
  • AcceptVpcPeeringConnection

  • AuthorizeSecurityGroupIngress

  • CancelSpotInstanceRequests

  • CreateKeyPair

  • CreateVpcPeeringConnection

  • DeleteVpcPeeringConnection

  • RejectVpcPeeringConnection

  • RevokeSecurityGroupIngress

  • RequestSpotInstances

50 5
主控台非變動動作

Describe*Search*List*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 限流

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

重試和指數退避

您的應用程式可能需要重試 API 請求。例如:

  • 檢查資源狀態的更新

  • 列舉大量資源 (例如,所有磁碟區)

  • 在伺服器錯誤 (5xx) 或限流錯誤失敗後重試請求

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

資源狀態變更

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

或者,您可以使用 Amazon EventBridge 來通知您一些資源的狀態。例如,您可以使用 EC2 執行個體狀態變更通知事件來通知您執行個體的狀態變更。如需詳細資訊,請參閱使用 EventBridge 自動化 Amazon EC2

重試

當您需要輪詢或重試 API 請求時,我們建議您使用指數退避演算法來計算 API 請求之間的睡眠間隔。指數退避的背後概念是,對於連續錯誤回應,讓重試之間的等待時間漸進拉長。您應該實作延遲間隔上限,以及重試次數上限。您也可以使用抖動 (隨機延遲) 來防止連續的碰撞。如需詳細資訊,請參閱逾時、重試和抖動退避

每個 AWS SDK 都會實作自動重試邏輯。如需詳細資訊,請參閱 AWS SDKs和工具參考指南中的重試行為

請求 提高限制

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

建議
  • 在單一請求中請求您現有限制的最多三倍。

  • 在增加儲存貯體容量上限之前,優先提高儲存貯體重新填充率。

  • 如果請求的儲存貯體重新填充率超過儲存貯體容量上限,請同時增加儲存貯體容量上限。

  • 提供需要增加的所有 API 動作。限制會套用至個別 API 動作,而非 API 動作類別。

請求存取此功能
  1. 開啟 AWS 支援 中心

  2. 選擇建立案例

  3. 選擇 帳戶和帳單

  4. 針對服務,選擇一般資訊和入門

  5. 針對類別,選擇使用 AWS & 服務

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

  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 increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate region_2 increases: action: new_bucket_maximum_capacity action: new_bucket_refill_rate action: new_bucket_maximum_capacity|new_bucket_refill_rate
  9. 選擇下一步驟:立即解決或聯絡我們

  10. 聯絡我們索引標籤上,選擇您偏好的聯絡語言和聯絡方式。

  11. 選擇提交