Come faccio a evitare gli errori RequestLimitExceeded quando utilizzo PowerShell per avviare più istanze Amazon EC2 a livello di programmazione?

3 minuti di lettura
0

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

AWS UFFICIALE
AWS UFFICIALEAggiornata un anno fa