PowerShell を使用して複数の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動すると、RequestLimitExceeded エラーが発生することがあります。
解決方法
Amazon EC2 API の RequestLimitExceeded エラーは通常、リクエストレート制限または リソースレート制限の API スロットリングが原因です。再試行ロジックとエクスポネンシャルバックオフ戦略を組み合わせてこの問題を回避できます。
Amazon EC2 インスタンスの起動は変更呼び出しであるため、リクエストレート制限とリソースレート制限の両方の対象となります。インスタンスを起動するために使用するスクリプトは、トークンバケットのリフィルレートに対応している必要があります。
RequestLimitExceeded エラーを回避するには、次のいずれかの遅延呼び出しまたは再試行戦略を使用します。
**注:**AWS SDK for .NET には、デフォルトで有効になっている再試行メカニズムが組み込まれています。タイムアウトをカスタマイズするには、「再試行とタイムアウト」を参照してください。
次の例には、リクエストの遅延呼び出しメカニズムが含まれています。遅延呼び出しにより、リクエストバケットがいっぱいになることがあります。
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
# Example Code to launch 50 EC2 instances of type 'm5a.large'.
try {
$params = @{
ImageId = '<AMI_ID>'
InstanceType = 'm5a.large'
AssociatePublicIp = $false
SubnetId = '<Subnet_ID>'
MinCount = 10
MaxCount = 10
}
for ($i=0;$i<=5;$i++){
$instance = New-EC2Instance @params
Start-Sleep 5000 #Sleep for 5 seconds to allow Request bucket to refill at the rate of 2 requests per second
}
} catch {
Write-Error "An Exception Occurred!"
}
次の例では、スクリプトに再試行ロジックが含まれています。
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: MIT-0
#Example Code to launch 50 EC2 instances of type 'm5a.large'.
$Stoploop = $false
[int] $Retrycount = "0"
do {
try {
$params = @{
ImageId = '<AMI_ID>'
InstanceType = 'm5a.large'
AssociatePublicIp = $false
SubnetId = '<Subnet_ID>'
MinCount = 50
MaxCount = 50
}
$instance = New-EC2Instance @params
$Stoploop = $true
} catch {
if ($Retrycount -gt 3) {
Write - Host "Could not complete request after 3 retries."
$Stoploop = $true
} else {
Write-Host "Could not complete request retrying in 5 seconds."
Start-Sleep -Seconds 25
#25 seconds of sleep allows for 50 request tokens to be refilled at the rate of 2/sec
$Retrycount = $Retrycount + 1
}
}
} While($Stoploop -eq $false)
関連情報
Amazon EC2 API のリクエストスロットリング
再試行動作