Amazon EC2 API リクエストのスロットリング
Amazon EC2 では、リージョンごとに、各 AWS アカウントの EC2 API リクエストをスロットリングします。これは、サービスのパフォーマンスを向上し、Amazon EC2 のすべてのユーザーに平等にご利用いただくために行われるものです。スロットリングにより、Amazon EC2 API へのリクエストが API リクエストの最大許容上限を超えないことが保証されます。API リクエストは、送信元が以下であるかどうかにかかわらず、リクエストの上限の対象となります。
-
サードパーティーのアプリケーション
-
コマンドラインツール
-
Amazon EC2 コンソール
API スロットリング上限を超えると、RequestLimitExceeded エラーコードが返されます。
スロットリングの適用方法
Amazon EC2 ではトークンバケットアルゴリズム
Amazon EC2 では 2 種類の API スロットリングを実装します。
API スロットリングタイプ
リクエストレート制限
リクエストレート制限により各 API が個別に評価され、ユーザーは、API ごとに行うリクエストの数に応じてスロットリングされます。リクエストを行うことに、API のバケットからトークンが 1 つ削除されます。例えば、DescribeHosts (非変化 API アクション) のトークンバケットサイズは 100 トークンです。1 秒あたり最大 100 個の DescribeHosts リクエストを行うことができます。1 秒あたりのリクエストが 100 個を超えると、その API でスロットリングされ、その秒内の残りのリクエストは失敗しますが、他の API のリクエストは影響を受けません。
バケットは設定されたレートで自動的に補充されます。バケットが最大容量に達していない場合、最大容量に達するまで、設定した数のトークンが毎秒追加されます。リフィルトークンが到着したときにバケットが満杯である場合、リフィルトークンは破棄されます。バケットは最大数を超えてトークンを保持することはできません。例えば、DescribeHosts (非変化 API アクション) のバケットサイズが 100 トークンで、リフィルレートが 1 秒あたり 20 トークンであるとします。1 秒間に 100 個の DescribeHosts リクエストを行うと、バケットはゼロ (0) トークンまで減らされます。バケットは、最大容量の 100 トークンに達するまで、毎秒最大 20 トークンで補充されます。つまり、空のバケットは、その間にリクエストが行われなかった場合、5 秒後に最大容量に達します。
API リクエストを行う前に、バケットが完全にいっぱいになるまで待つ必要はありません。リフィルトークンはバケットに追加されると使用できます。リフィルトークンをすぐに使用しても、バケットが最大容量に達することはありません。例えば、DescribeHosts (非変化 API アクション) のバケットサイズが 100 トークンで、リフィルレートが 1 秒あたり 20 トークンであるとします。1 秒あたり 100 個の API リクエストを行ってバケットを使い果たした場合、バケットに追加されるリフィルトークンを使用して、1 秒あたり 20 個の API リクエストを引き続き行うことができます。バケットは、1 秒あたり 20 個未満の API リクエストを行う場合のみ、最大容量に補充できます。
詳細については、「リクエストトークンバケットのサイズとリフィルレート」を参照してください。
リソースレート制限
次の表で説明されるように、RunInstances や TerminateInstances などの一部の API アクションでは、リクエストレート制限に加えてリソースレート制限を使用します。これらの API アクションには、リクエストの影響を受けるリソースの数に基づいて消費される個別のリソーストークンバケットがあります。リクエストトークンバケットと同様に、リソーストークンバケットにはバーストできるバケットの最大数と、必要な期間にわたって安定したリクエストレートを維持できるリフィルレートがあります。バケットが次の API リクエストをサポートするために補充されていない場合など、API の特定のバケットの上限を超えた場合、API スロットル制限の合計に達していなくても、API のアクションは制限されます。
例えば、RunInstances のリソーストークンバケットサイズは 1000 トークンで、リフィルレートは 1 秒あたり 2 トークンです。したがって、1000 インスタンスの 1 個のリクエストや 250 インスタンスの 4 個のリクエストなど、任意の数の API リクエストを使用して、1000 インスタンスをすぐに起動できます。リソーストークンバケットが空になったら、2 つのインスタンスに対して 1 つのリクエストを使用するか、1 つのインスタンスに対して 2 つのリクエストを使用して、毎秒最大 2 つのインスタンスを起動できます。
詳細については、「リソーストークンバケットのサイズとリフィルレート」を参照してください。
リクエストトークンバケットのサイズとリフィルレート
リクエストレート制限の目的で、API アクションは次のカテゴリに分類されます。
-
非変化アクション — リソースに関するデータを取得する API アクション。このカテゴリには通常、
DescribeRouteTables、SearchTransitGatewayRoutes、GetIpamPoolCidrsなどの、すべてのDescribe*、List*、Search*、Get*API アクションが含まれます。これらの API アクションは通常、API スロットリング上限が最も高くなります。 -
フィルタリングされていない非変化アクションとページ分割されていない非変化アクション — 非変化 API アクションの特定のサブセット。[ページ分割] または [フィルター] を指定せずにリクエストされた場合に、より小さなトークンバケットのトークンを使用します。トークンが標準 (より大きな) トークンバケットから引かれるように、ページ分割とフィルタリングを使用することをお勧めします。
-
変化アクション – リソースを作成、変更、または削除する API アクション。このカテゴリには通常、
AllocateHosts、ModifyHosts、CreateCapacityReservationなどの 非変化アクションとして分類されていないすべての API アクションが含まれます。これらのアクションは、非変化 API アクションよりもスロットリング上限が低くなります。 -
リソース集約型アクション — 完了するのに最も時間がかかり、最も多くのリソースを消費する変化 API アクション。これらのアクションのスロットリング上限は、変化アクションよりもさらに低くなります。これらは、他の変化アクションとは別にスロットリングされます。
-
コンソールの非変化アクション — Amazon EC2 コンソールからリクエストされる非変化 API アクション。これらの API アクションは、他の非変化 API アクションとは別にスロットリングされます。
-
未分類アクション — これらは、定義上、他のカテゴリのいずれかに該当していても、独自のトークンバケットサイズとリフィルレートを受け取る API アクションです。
| API アクションカテゴリ | アクション | バケットの最大容量 | バケットリフィルレート |
|---|---|---|---|
| 非変化アクション |
別のカテゴリに含まれていない |
100 | 20 |
| フィルタリングされていない非変化アクションとページ分割されていない非変化アクション |
|
50 | 10 |
| 変化アクション | リソース集約型アクションでも未分類アクションでもないすべての変化 API アクション。 |
50 | 5 |
| リソース集約型アクション |
|
50 | 5 |
| コンソール非変化アクション |
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 |
1,000 | 2 |
TerminateInstances |
1,000 | 20 |
StartInstances |
1,000 | 2 |
StopInstances |
1,000 | 20 |
API スロットリングをモニタリングする
Amazon CloudWatch を使用して Amazon EC2 API リクエストをモニタリングし、API スロットリングに関するメトリクスを収集および追跡できます。API スロットリング上限に近づいたときに警告するアラームを作成することもできます。詳細については、「Amazon CloudWatch を使用して Amazon EC2 API リクエストをモニタリングする」を参照してください。
再試行とエクスポネンシャルバックオフ
アプリケーションで、API リクエストの再試行が必要な場合があります。例:
-
リソースのステータスの更新を確認するには
-
多数のリソース (すべてのボリュームなど) を列挙するには
-
サーバーエラー (5xx) またはスロットリングエラーでリクエストが失敗した後に再試行するには
ただし、クライアントエラー (4xx) は、リクエスト再試行する前にリクエストを修正して問題を解決する必要があります。
リソースの状態変更
状態変更を確認するためのポーリングを開始する前に、リクエストの予想完了時間を指定します。例えば、インスタンスがアクティブかどうかを確認するまで数分待ちます。ポーリングを開始する時に、連続するリクエストの間に適切なスリープ間隔を使用して API リクエストレートを下げます。最良の結果を得るには、漸増または可変スリープ間隔を使用します。
または、Amazon EventBridge を使用して、一部のリソースのステータスを通知することもできます。例えば、EC2 インスタンスの状態変更通知イベントを使用して、インスタンスの状態変更を通知できます。詳細については、「EventBridge を使用して Amazon EC2 を自動化する」を参照してください。
再試行
API リクエストをポーリングまたは再試行する必要がある場合は、エクスポネンシャルバックオフ アルゴリズムを使用して API リクエスト間のスリープ間隔を計算することをお勧めします。エクスポネンシャルバックオフの背後にある考え方は、連続したエラー応答の再試行間の待機時間を徐々に長く使用することです。最大遅延間隔と最大再試行回数を実装する必要があります。ジッター (ランダム化された遅延) を使用して、連続する衝突を防ぐこともできます。詳細については、「タイムアウト、リトライ、ジッターによるバックオフ
各 AWS SDK には、自動再試行ロジックが実装されています。詳細については、「AWS SDK とツールのリファレンスガイド」の「再試行動作」を参照してください。
制限の引き上げのリクエスト
AWS アカウントの API スロットリング上限の引き上げをリクエストできます。
ベストプラクティス
-
1 つのリクエストで既存の上限の最大 3 倍をリクエストします。
-
バケットの最大容量を増やす前に、バケットリフィルレートの増加を優先します。
-
リクエストされたバケットリフィルレートがバケットの最大容量を超える場合は、バケットの最大容量を同時に増やします。
-
増加が必要なすべての API アクションを指定します。上限は、API アクションのカテゴリではなく、個々の API アクションに適用されます。
-
RunInstances、StartInstances、StopInstances、TerminateInstancesの API アクションにはリクエストレートとリソースレートの両方の上限があります。引き上げる上限を必ず指定してください。
この機能へのアクセスをリクエストするには
-
AWS サポート センター
を開きます。 -
[ケースを作成] を選択します。
-
[Account and billing] (アカウントおよび請求) を選択します。
-
[サービス] で [一般情報と開始方法] を選択します。
-
[カテゴリ] で [AWS および各種サービスの利用] を選択します。
-
[Next step: Additional information] (次のステップ:追加情報) を選択します。
-
[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 -
[次のステップ: 今すぐ解決またはお問い合わせ] を選択します。
-
[お問い合わせ] タブをクリックし、連絡の際に希望する言語と連絡方法を選択します。
-
[Submit] を選択してください。