PowerShell を使用して複数の Amazon EC2 インスタンスをプログラムで起動するときに、RequestLimitExceeded エラーを回避するにはどうすればよいですか?
最終更新日: 2020 年 9 月 24 日
複数の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスを起動しようとすると、RequestLimitExceeded エラーを受信することがあります。このエラーの受信を防ぐにはどうすればよいですか?
解決方法
Amazon EC2 API の RequestLimitExceeded エラーは、通常、リクエストレート制限またはリソースレート制限API スロットリングを示します。この問題を回避するには、再試行ロジックと指数バックオフ戦略の組み合わせを使用できます。
Amazon EC2 インスタンスの起動は変化する呼び出しであり、リクエストレート制限およびリソースレート制限の両方を受けます。インスタンスの起動に使用するスクリプトは、トークンバケットの補充レートに対応している必要があります。
これらの遅延呼び出しまたは再試行戦略を使用して、RequestLimitExceeded エラーを回避します。
注: AWS SDK for .NET には、デフォルトで有効になっている組み込みの再試行メカニズムがあります。タイムアウトをカスタマイズするには、「Retries and timeouts (再試行とタイムアウト)」を参照してください。
次の例では、リクエストの遅延呼び出しメカニズムが含まれています。これにより、リクエストバケットがいっぱいになります。
# 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)