Como faço para evitar erros de RequestLimitExceeded ao usar o PowerShell para executar várias instâncias do Amazon EC2 programaticamente?

3 minuto de leitura
0

Ao usar o PowerShell para executar várias instâncias do Amazon Elastic Compute Cloud (Amazon EC2), às vezes ocorrem erros de RequestLimitExceeded.

Resolução

Erros de RequestLimitExceeded para APIs do Amazon EC2 em geral indicam controle de utilização da API de limitação da taxa de solicitações ou limitação da taxa de recursos. Você pode usar uma combinação de estratégias de recuo exponencial e lógica de repetição para contornar esse problema.

A execução de uma instância do Amazon EC2 é uma chamada mutante que está sujeita à limitação da taxa de solicitações e da taxa de recursos. O script que você usa para executar as instâncias deve acomodar a taxa de recarga do bucket do token.

Use uma das seguintes estratégias de repetição ou invocação atrasada para evitar erros de RequestLimitExceeded.

Observação: o AWS SDK para .NET tem um mecanismo de repetição integrado que é ativado por padrão. Para personalizar os tempos limite, consulte Repetições e tempos limite.

O exemplo a seguir inclui um mecanismo de invocação atrasada para suas solicitações. A invocação atrasada permite que o bucket de solicitações seja preenchido:

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

O exemplo a seguir inclui a lógica de repetição no 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)

Informações relacionadas

Controle de utilização de solicitações para a API do Amazon EC2

Comportamento de repetição

AWS OFICIAL
AWS OFICIALAtualizada há um ano