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