Direkt zum Inhalt

Wie behebe ich „RequestLimitExceeded“-Fehler, die auftreten, wenn ich PowerShell verwende, um mehrere Amazon EC2-Instances programmgesteuert zu starten?

Lesedauer: 3 Minute
0

Wenn ich PowerShell verwende, um mehrere Amazon Elastic Compute Cloud (Amazon EC2)-Instances zu starten, erhalte ich „RequestLimitExceeded“-Fehler.

Lösung

Das Skript, das du zum Starten einer EC2-Instance verwendest, muss das Kontingent für API-Anforderungsraten und das Kontingent für API-Ressourcenraten einhalten. Wenn du diese Kontingente überschreitest, erhältst du „RequestLimitExceeded“-Fehler.

Um dieses Problem zu beheben, implementiere Wiederholungslogik und Strategien für exponentielles Backoff.

Hinweis: Standardmäßig verfügt das AWS SDK für .NET über einen integrierten Wiederholungsmechanismus.

Voraussetzungen:

Wenn deine Anforderungsrate vorhersehbar ist und du sie im Voraus steuern kannst, verwende den verzögerten Aufruf, um die Drosselung bei deren Auftreten zu beheben.

Beispielskript:

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

Hinweis: Ersetze AMI_ID durch die ID deines Amazon Machine Image (AMI), Subnet_ID durch deine Subnetz-ID und m5a.large durch deinen Instance-Typ. Ersetze außerdem 10 durch die minimale Anzahl der zu startenden Instances und 15 durch die maximale Anzahl der zu startenden Instances.

Wenn deine Anforderungsrate nicht vorhersehbar ist, schließe eine Wiederholungslogik in das Skript ein.

Beispielskript:

# 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 = 40
            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)

Hinweis: Ersetze AMI_ID durch deine AMI-ID, Subnet_ID durch deine Subnetz-ID und m5a.large durch deinen Instance-Typ. Ersetze außerdem 40 durch die minimale Anzahl der zu startenden Instances und 50 durch die maximale Anzahl der zu startenden Instances.

Weitere Informationen

Request throttling for the Amazon EC2 API (Anfordern einer Drosselung für die Amazon EC2-API)

Retry behavior (Verhalten bei Wiederholung)

AWS OFFICIALAktualisiert vor 6 Monaten