¿Cómo puedo evitar los errores RequestLimitExceeded cuando utilizo PowerShell para lanzar varias instancias de Amazon EC2 mediante programación?

3 minutos de lectura
0

Cuando utilizo PowerShell para lanzar varias instancias de Amazon Elastic Compute Cloud (Amazon EC2), a veces recibo los errores RequestLimitExceeded.

Resolución

Un error RequestLimitExceeded en las API de Amazon EC2 suele indicar una limitación de la velocidad de las solicitudes o una limitación de la velocidad de los recursos de las API. Puede utilizar una combinación de estrategias de lógica de reintentos y de retroceso exponencial para solucionar este problema.

El lanzamiento de una instancia de Amazon EC2 es una llamada mutante y está sujeto a la limitación de la velocidad de solicitudes y de recursos. El script que se utilice para lanzar las instancias debe adaptarse a la frecuencia de relleno del bucket de tokens.

Utilice una de las siguientes estrategias de invocación retrasada o de reintento para evitar los errores RequestLimitExceeded .

**Nota:**AWS SDK para .NET tiene un mecanismo de reintento integrado que está activado de forma predeterminada. Para personalizar los tiempos de espera, consulte Reintentos y tiempos de espera.

El siguiente ejemplo incluye un mecanismo de invocación retrasada para sus solicitudes. La invocación retrasada permite que el bucket de solicitudes se llene:

# 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!"
}

El siguiente ejemplo incluye lógica de reintento en el 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)

Información relacionada

Limitación de solicitudes para la API de Amazon EC2

Comportamiento de reintento

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año