Comment éviter les erreurs RequestLimitDépassées lors du lancement par programme de plusieurs instances Amazon EC2 à l'aide de PowerShell ?

Dernière mise à jour : 24/09/2020

Lorsque j'essaie de lancer plusieurs instances Amazon Elastic Compute Cloud (Amazon EC2), je reçois parfois des erreurs RequestLimitDépassées. Comment puis-je éviter de recevoir cette erreur ? 

Solution

Une erreur RequestLimitDépassée pour les API Amazon EC2 indique généralement la limitation du taux de demande ou le taux de ressource limitant la limitation de l'API. Vous pouvez utiliser une combinaison de logique de relance et de stratégies d'interruption exponentielles pour contourner ce problème.

Le lancement d'une instance Amazon EC2 est un appel mutant et est soumis à la limitation du taux de demande et du taux de ressource. Le script que vous utilisez pour lancer les instances doit tenir compte du taux de recharge du compartiment de jeton.

Utilisez l'une de ces stratégies d'invocation retardée ou de rétentative pour éviter les erreurs RequestLimitDépassées.

Remarque: AWS SDK pour .NET dispose d'un mécanisme de relance intégré qui est activé par défaut. Pour personnaliser les délais d'expiration, reportez-vous à la section Rétentatives et délais d'expiration.

L'exemple suivant inclut un mécanisme d'appel différé pour vos demandes, qui permet au compartiment de requêtes de se remplir :

# 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'exemple suivant inclut la logique de nouvelle tentative dans le 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)

Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?