Quando utilizzo PowerShell per avviare più istanze Amazon Elastic Compute Cloud (Amazon EC2), a volte ricevo errori RequestLimitExceeded.
Risoluzione
Un errore RequestLimitExceeded per le API Amazon EC2 di solito indica una limitazione della frequenza delle richieste o una limitazione della velocità delle risorse alle API. È possibile utilizzare una combinazione di logica di ripetizione e strategie di backoff esponenziali per ovviare a questo problema.
Il lancio di un'istanza Amazon EC2 è una chiamata mutante ed è soggetta alla limitazione della velocità delle richieste e della velocità delle risorse. Lo script utilizzato per avviare le istanze deve soddisfare la frequenza di ricarica del bucket di token.
Utilizza una delle seguenti strategie di chiamata ritardata o di ripetizione per evitare errori RequestLimitExceeded.
Nota: AWS SDK for .NET dispone di un meccanismo di ripetizione dei tentativi integrato che è attivato per impostazione predefinita. Per personalizzare i timeout, consulta Ritentativi e timeout.
L'esempio seguente include un meccanismo di chiamata ritardata per le tue richieste. L'invocazione ritardata consente al bucket di richiesta di riempire:
# 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!"
}
L'esempio seguente include la logica dei tentativi nello script:
# 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)
Informazioni correlate
Limitazione delle richieste per l'API Amazon EC2
Comportamento del ritentativo