

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Acceso programático a Amazon EC2
<a name="ec2-api-intro"></a>

Puede crear y administrar los recursos de Amazon EC2 utilizando la Consola de administración de AWS o una interfaz de programación. Para obtener información sobre el uso de la consola de Amazon EC2, consulte la [Guía del usuario de Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/).

**Funcionamiento**
+ [Puntos de conexión de Amazon EC2](ec2-endpoints.md)
+ [Consistencia final](eventual-consistency.md)
+ [Idempotencia](ec2-api-idempotency.md)
+ [Limitación controlada de solicitudes](ec2-api-throttling.md)
+ [Paginación](ec2-api-pagination.md)

**Interfaces de programación**
+ [AWS Command Line Interface (AWS CLI)](ec2-aws-cli.md)
+ [AWS CloudFormation](ec2-cloudformation.md)
+ [AWS SDK](sdk-general-information-section.md)
+ [API de bajo nivel](ec2-low-level-api.md)

**Introducción**
+ [Ejemplos de código](service_code_examples.md)
+ [Console-to-Code](console-to-code.md)

**Monitorización**
+ [AWS CloudTrail](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitor-with-cloudtrail.html)
+ [Monitorización de las solicitudes](monitor.md)

# Puntos de conexión de servicio de Amazon EC2
<a name="ec2-endpoints"></a>

Un punto final es una URL que sirve como punto de entrada para un servicio AWS web. Amazon EC2 admite los siguientes tipos de puntos de conexión:
+ [IPv4 puntos finales](#ipv4)
+ [Terminales de doble pila (compatibles](#ipv6) con y) IPv4 IPv6
+ [Puntos de conexión de FIPS](https://docs.aws.amazon.com/general/latest/gr/rande.html#FIPS-endpoints)

Al realizar una solicitud, puede especificar el punto de conexión que se va a utilizar. Si no especifica un punto final, el IPv4 punto final se utiliza de forma predeterminada. Para utilizar un tipo de punto de conexión diferente, debe especificarlo en la solicitud. Para ver ejemplos prácticos, consulte [Especificación de puntos de conexión](#examples). Para obtener una tabla de los puntos de conexión disponibles, consulte [Puntos de conexión de servicio por región](#service-endpoints).

## IPv4 puntos finales
<a name="ipv4"></a>

IPv4 los puntos finales solo admiten IPv4 tráfico. IPv4 los puntos finales están disponibles en todas las regiones.

Si especifica el punto de conexión general `ec2.amazonaws.com`, utilizamos el punto de conexión para `us-east-1`. Para utilizar una región diferente, especifique su punto de conexión asociado. Por ejemplo, si especifica `ec2.us-east-2.amazonaws.com` como punto de conexión, dirigimos su solicitud al punto de conexión `us-east-2`. 

IPv4 los nombres de los puntos finales utilizan la siguiente convención de nomenclatura: 
+ `service.region.amazonaws.com`

Por ejemplo, el nombre del IPv4 punto final de la `eu-west-1` región es`ec2.eu-west-1.amazonaws.com`.

## Puntos finales de doble pila (IPv4 y IPv6)
<a name="ipv6"></a>

Los puntos finales de doble pila admiten tanto el tráfico como el tráfico. IPv4 IPv6 Al realizar una solicitud a un punto final de doble pila, la URL del punto final se convierte en una IPv6 o una IPv4 dirección, según el protocolo utilizado por la red y el cliente.

Amazon EC2 admite puntos de conexión de doble pila regionales solamente, lo que significa que debe especificar la región como parte del nombre del punto de conexión. Los nombres de puntos de conexión de doble pila utilizan la siguiente convención de nomenclatura:
+ `ec2.region.api.aws`

Por ejemplo, el nombre del punto de conexión de doble pila para la región `eu-west-1` es `ec2.eu-west-1.api.aws`.

## Puntos de conexión de servicio por región
<a name="service-endpoints"></a>

Los siguientes son los puntos de conexión de servicio para Amazon EC2. Para obtener más información acerca de las regiones, consulte [Regiones y zonas de disponibilidad](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html) en la *Guía del usuario de Amazon EC2*.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ec2/latest/devguide/ec2-endpoints.html)

## Especificación de puntos de conexión
<a name="examples"></a>

En esta sección, se proporcionan algunos ejemplos de cómo especificar un punto de conexión al hacer una solicitud.

------
#### [ AWS CLI ]

En los siguientes ejemplos, se muestra cómo especificar un punto de conexión para la región `us-east-2` mediante la AWS CLI.
+ **Doble pila**

  ```
  aws ec2 describe-regions --region us-east-2 --endpoint-url https://ec2.us-east-2.api.aws
  ```
+ **IPv4**

  ```
  aws ec2 describe-regions --region us-east-2 --endpoint-url https://ec2.us-east-2.amazonaws.com
  ```

------
#### [ AWS SDK for Java 2.x ]

En los siguientes ejemplos, se muestra cómo especificar un punto de conexión para la región `us-east-2` mediante AWS SDK for Java 2.x.
+ **Doble pila**

  ```
  Ec2Client client = Ec2Client.builder()
      .region(Region.US_EAST_2)
      .endpointOverride(URI.create("https://ec2.us-east-2.api.aws"))
      .build();
  ```
+ **IPv4**

  ```
  Ec2Client client = Ec2Client.builder()
      .region(Region.US_EAST_2)
      .endpointOverride(URI.create("https://ec2.us-east-2.amazonaws.com"))
      .build();
  ```

------
#### [ AWS SDK para Java 1.x ]

Los siguientes ejemplos muestran cómo especificar un punto final para la `eu-west-1` región mediante la AWS SDK para Java 1.x.
+ **Doble pila**

  ```
  AmazonEC2 s3 = AmazonEC2ClientBuilder.standard()
       .withEndpointConfiguration(new EndpointConfiguration(
            "https://ec2.eu-west-1.api.aws",
            "eu-west-1"))
       .build();
  ```
+ **IPv4**

  ```
  AmazonEC2 s3 = AmazonEC2ClientBuilder.standard()
       .withEndpointConfiguration(new EndpointConfiguration(
            "https://ec2.eu-west-1.amazonaws.com",
            "eu-west-1"))
       .build();
  ```

------
#### [ AWS SDK for Go ]

En los siguientes ejemplos, se muestra cómo especificar un punto de conexión para la región `us-east-1` mediante AWS SDK para Go.
+ **Doble pila**

  ```
  sess := session.Must(session.NewSession())
  svc := ec2.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast1RegionID),
      Endpoint: aws.String("https://ec2.us-east-1.api.aws")
  })
  ```
+ **IPv4**

  ```
  sess := session.Must(session.NewSession())
  svc := ec2.New(sess, &aws.Config{
      Region: aws.String(endpoints.UsEast1RegionID),
      Endpoint: aws.String("https://ec2.us-east-1.amazonaws.com")
  })
  ```

------

# Coherencia eventual en la EC2 API de Amazon
<a name="eventual-consistency"></a>

La EC2 API de Amazon sigue un modelo de coherencia eventual, debido a la naturaleza distribuida del sistema que admite la API. Esto significa que el resultado de un comando de API que ejecute y que afecte a sus EC2 recursos de Amazon podría no estar inmediatamente visible para todos los comandos posteriores que ejecute. Debe tenérselo en cuenta cuando se ejecute un comando de API que siga inmediatamente a un comando de API anterior.

La consistencia final puede afectar a la forma en que administra los recursos. Por ejemplo, si ejecuta un comando para crear un recurso, acabará siendo visible para otros comandos. Esto significa que si ejecuta un comando para modificar o describir el recurso que acaba de crear, es posible que su ID no se haya propagado por todo el sistema y aparecerá un error al responder que el recurso no existe.

Para administrar la consistencia final, puede hacer lo siguiente:
+ Confirme el estado del recurso antes de ejecutar un comando para modificarlo. Ejecute el comando `Describe` correspondiente mediante un algoritmo de retroceso exponencial para asegurarse de que dispone de tiempo suficiente para que el comando anterior se propague en el sistema. Para ello, ejecuta el `Describe` comando varias veces, empezando con un par de segundos de espera y aumentando gradualmente hasta unos minutos de espera. 
+ Agregue tiempo de espera entre los comandos siguientes, incluso si un comando `Describe` devuelve una respuesta precisa. Aplique un algoritmo de retroceso exponencial comenzando con un par de segundos de tiempo de espera y aumente gradualmente hasta unos pocos minutos de tiempo de espera.

**Ejemplos de posibles errores de consistencia**  
A continuación se muestran ejemplos de códigos de error que se pueden encontrar debido a una consistencia final.
+ `InvalidInstanceID.NotFound`

  Si ejecuta correctamente el comando `RunInstances` y ejecuta inmediatamente otro comando con el ID de instancia que se proporcionó en la respuesta de `RunInstances`, es posible que devuelva un error `InvalidInstanceID.NotFound`. Esto no significa que la instancia no exista. 

  Algunos comandos específicos que pueden verse afectados son:
  + `DescribeInstances`: para confirmar el estado real de la instancia, ejecute este comando mediante un algoritmo de retroceso exponencial.
  + `TerminateInstances`: para confirmar el estado real de la instancia, ejecute primero el comando `DescribeInstances` mediante un algoritmo de retroceso exponencial.
**importante**  
Si aparece un error `InvalidInstanceID.NotFound` después de ejecutar `TerminateInstances`, no significa que la instancia esté terminada o vaya a estarlo. Es posible que la instancia siga ejecutándose. Por eso es importante confirmar primero el estado de la instancia mediante `DescribeInstances`.
+ `InvalidGroup.NotFound`

  Si ejecuta correctamente el comando `CreateSecurityGroup` y ejecuta inmediatamente otro comando con el ID de grupo de seguridad que se proporcionó en la respuesta de `CreateSecurityGroup`, es posible que devuelva un error `InvalidGroup.NotFound`. Para confirmar el estado del grupo de seguridad, ejecute el comando `DescribeSecurityGroups` mediante un algoritmo de retroceso exponencial.
+ `InstanceLimitExceeded`

  Ha solicitado más instancias de las que permite el límite de instancias actual para el tipo de instancia especificado. Podría alcanzar este límite de forma inesperada si inicia y termina instancias rápidamente, ya que las instancias terminadas se tienen en cuenta para el límite de instancias durante un tiempo después de su terminación.

# Ensuring idempotency in Amazon EC2 API requests
<a name="ec2-api-idempotency"></a>

Cuando realiza una solicitud de API de mutación, la solicitud suele devolver un resultado antes de que se hayan completado los flujos de trabajo asíncronos de la operación. También es posible que se agote el tiempo de espera de las operaciones o que surjan otros problemas con el servidor antes de que finalicen, aunque la solicitud ya haya devuelto un resultado. Esto podría dificultar la determinación de si la solicitud se ha realizado correctamente o no, y podría dar lugar a múltiples reintentos para garantizar que la operación se completa correctamente. No obstante, si la solicitud original y los reintentos posteriores se realizan correctamente, la operación se completa varias veces. Esto significa que podría crear más recursos de los previstos.

La *idempotencia* garantiza que una solicitud a la API no se complete más de una vez. Con una solicitud idempotente, si la solicitud original se completa correctamente, cualquier reintento posterior también se completa correctamente sin realizar ninguna otra acción. Sin embargo, el resultado podría contener información actualizada, como el estado de creación actual.

**Topics**
+ [Idempotencia en Amazon EC2](#client-tokens)
+ [Idempotencia de RunInstances](#run-instances-idempotency)
+ [Ejemplos](#Run_Instance_Idempotency_CLI)
+ [Vuelva a intentar las recomendaciones para solicitudes idempotentes](#recommended-actions)

## Idempotencia en Amazon EC2
<a name="client-tokens"></a>

Las siguientes acciones de la API son idempotentes de forma predeterminada y no requieren configuración adicional. Los comandos AWS CLI correspondientes también admiten idempotencia de forma predeterminada.

**Idempotente de forma predeterminada**
+ AssociateAddress
+ CreateVpnConnection
+ DisassociateAddress
+ ReplaceNetworkAclAssociation
+ TerminateInstances

Las siguientes acciones de la API admiten opcionalmente idempotencia mediante un *token de cliente*. Los comandos AWS CLI correspondientes también admiten idempotencia usando un token de cliente. Un token de cliente es una cadena única que distingue entre mayúsculas y minúsculas de hasta 64 caracteres ASCII. Para realizar una solicitud de API idempotente mediante una de estas acciones, especifique un token de cliente en la solicitud. No debe reutilizar el mismo token de cliente para diferentes solicitudes de API. Si reintenta una solicitud que se completó correctamente con el mismo token de cliente y los mismos parámetros, el reintento se realizará correctamente sin realizar ninguna otra acción. Si vuelve a intentar una solicitud correcta usando el mismo token de cliente, pero uno o más de los parámetros son diferentes, excepto la región o la zona de disponibilidad, el reintento falla y se produce un error `IdempotentParameterMismatch`.

**Idempotencia usando un token de cliente**
+ AllocateHosts
+ AllocateIpamPoolCidr
+ AssociateClientVpnTargetNetwork
+ AssociateIpamResourceDiscovery
+ AttachVerifiedAccessTrustProvider
+ AuthorizeClientVpnIngress
+ CopyFpgaImage
+ CopyImage
+ CreateCapacityReservation
+ CreateCapacityReservationFleet
+ CreateClientVpnEndpoint
+ CreateClientVpnRoute
+ CreateEgressOnlyInternetGateway
+ CreateFleet
+ CreateFlowLogs
+ CreateFpgaImage
+ CreateInstanceConnectEndpoint
+ CreateIpam
+ CreateIpamPool
+ CreateIpamResourceDiscovery
+ CreateIpamScope
+ CreateLaunchTemplate
+ CreateLaunchTemplateVersion
+ CreateManagedPrefixList
+ CreateNatGateway
+ CreateNetworkAcl
+ CreateNetworkInsightsAccessScope
+ CreateNetworkInsightsPath
+ CreateNetworkInterface
+ CreateReplaceRootVolumeTask
+ CreateReservedInstancesListing
+ CreateRouteTable
+ CreateTrafficMirrorFilter
+ CreateTrafficMirrorFilterRule
+ CreateTrafficMirrorSession
+ CreateTrafficMirrorTarget
+ CreateVerifiedAccessEndpoint
+ CreateVerifiedAccessGroup
+ CreateVerifiedAccessInstance
+ CreateVerifiedAccessTrustProvider
+ CreateVolume
+ CreateVpcEndpoint
+ CreateVpcEndpointConnectionNotification
+ CreateVpcEndpointServiceConfiguration
+ DeleteVerifiedAccessEndpoint
+ DeleteVerifiedAccessGroup
+ DeleteVerifiedAccessInstance
+ DeleteVerifiedAccessTrustProvider
+ DetachVerifiedAccessTrustProvider
+ ExportImage
+ ImportImage
+ ImportSnapshot
+ ModifyInstanceCreditSpecification
+ ModifyLaunchTemplate
+ ModifyReservedInstances
+ ModifyVerifiedAccessEndpoint
+ ModifyVerifiedAccessEndpointPolicy
+ ModifyVerifiedAccessGroup
+ ModifyVerifiedAccessGroupPolicy
+ ModifyVerifiedAccessInstance
+ ModifyVerifiedAccessInstanceLoggingConfiguration
+ ModifyVerifiedAccessTrustProvider
+ ProvisionIpamPoolCidr
+ PurchaseHostReservation
+ RequestSpotFleet
+ RequestSpotInstances
+ RunInstances
+ StartNetworkInsightsAccessScopeAnalysis
+ StartNetworkInsightsAnalysis

**Tipos de idempotencia**
+ Regional: las solicitudes son idempotentes en cada región. Sin embargo, puede usar la misma solicitud, incluido el mismo token de cliente, en una región diferente.
+ Zonal: las solicitudes son idempotentes en cada zona de disponibilidad de una región. Por ejemplo, si especifica el mismo token de cliente en dos llamadas a **AllocateHosts** en la misma región, las llamadas se realizan correctamente si especifican valores diferentes para el parámetro **AvailabilityZone**.

## Idempotencia de RunInstances
<a name="run-instances-idempotency"></a>

La acción de la API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) utiliza idempotencia regional y zonal.

El tipo de idempotencia que se utilice depende de cómo especifique la zona de disponibilidad en la solicitud de la API RunInstances. La solicitud utiliza **idempotencia zonal** en los siguientes casos:
+ Si especifica explícitamente una zona de disponibilidad mediante el parámetro **AvailabilityZone** en el tipo de datos **Ubicación**
+ Si especifica implícitamente una zona de disponibilidad mediante el parámetro **SubnetId**

Si no especifica una zona de disponibilidad de forma explícita o implícita, la solicitud usa **Idempotencia regional**.

### Idempotencia zonal
<a name="zonal-idempotency"></a>

La idempotencia zonal garantiza que una solicitud de la API RunInstances sea idempotente en cada zona de disponibilidad de una región. Esto garantiza que una solicitud con el mismo token de cliente solo se pueda completar una vez en cada zona de disponibilidad de una región. Sin embargo, el mismo token de cliente se puede usar para lanzar instancias en otras zonas de disponibilidad de la región.

Por ejemplo, si envía una solicitud idempotente para lanzar una instancia en la zona de disponibilidad `us-east-1a` y, a continuación, utiliza el mismo token de cliente en una solicitud en la zona de disponibilidad `us-east-1b`, lanzamos instancias en cada una de esas zonas de disponibilidad. Si uno o más de los parámetros son diferentes, los reintentos posteriores con el mismo token de cliente en esas zonas de disponibilidad se devuelven correctamente sin realizar ninguna otra acción o se produce un error `IdempotentParameterMismatch`.

### Idempotencia regional
<a name="regional-idempotency"></a>

La idempotencia regional garantiza que una solicitud de la API RunInstances sea idempotente en una región. Esto garantiza que una solicitud con el mismo token de cliente solo se pueda completar una vez en una región. Sin embargo, se puede usar exactamente la misma solicitud, con el mismo token de cliente, para lanzar instancias en una región diferente.

Por ejemplo, si envía una solicitud idempotente para lanzar una instancia en la región `us-east-1` y, a continuación, utiliza el mismo token de cliente en una solicitud en la región `eu-west-1`, lanzamos instancias en cada una de esas regiones. Si uno o más de los parámetros son diferentes, los reintentos posteriores con el mismo token de cliente en esas regiones se devuelven correctamente sin realizar ninguna otra acción o se produce un error `IdempotentParameterMismatch`.

**sugerencia**  
Si una de las zonas de disponibilidad de la región solicitada no está disponible, las solicitudes de RunInstances que utilizan la idempotencia regional podrían fallar. Para aprovechar las características de las zonas de disponibilidad que ofrece la infraestructura de AWS, le recomendamos que utilice la idempotencia zonal al lanzar instancias. Las solicitudes de RunInstances que utilizan la idempotencia zonal y se dirigen a una zona de disponibilidad disponible se ejecutan correctamente aunque no haya otra zona de disponibilidad disponible en la región solicitada.

## Ejemplos
<a name="Run_Instance_Idempotency_CLI"></a>

### Ejemplos de comando de AWS CLI
<a name="cli-example"></a>

Para hacer que un comando AWS CLI sea idempotente, agregue la opción `--client-token`. 

**Ejemplo 1: idempotencia**  
El siguiente comando [allocate-hosts](https://docs.aws.amazon.com/cli/latest/reference/ec2/allocate-hosts.html) utiliza la idempotencia, ya que incluye un token de cliente.

```
aws ec2 allocate-hosts  --instance-type m5.large  --availability-zone eu-west-1a  --auto-placement on  --quantity 1 --client-token 550e8400-e29b-41d4-a716-446655440000
```

**Ejemplo 2: idempotencia regional de run-instances**  
El siguiente comando [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) usa idempotencia regional, ya que incluye un token de cliente, pero no especifica explícita o implícitamente una zona de disponibilidad.

```
aws ec2 run-instances --image-id ami-b232d0db --count 1 --key-name my-key-pair --client-token 550e8400-e29b-41d4-a716-446655440000
```

**Ejemplo 3: idempotencia zonal de run-instances**  
El siguiente comando [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html) usa idempotencia zonal, ya que incluye un token de cliente y una zona de disponibilidad especificada explícitamente.

```
aws ec2 run-instances  --placement "AvailabilityZone=us-east-1a" --image-id ami-b232d0db --count 1 --key-name my-key-pair --client-token 550e8400-e29b-41d4-a716-446655440000
```

### Ejemplos de solicitud de la API
<a name="api-example"></a>

Para hacer que una solicitud de la API sea idempotente, agrega el parámetro `ClientToken`.

**Ejemplo 1: idempotencia**  
La siguiente API [AllocateHosts](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateHosts.html) utiliza idempotencia, ya que incluye un token de cliente.

```
https://ec2.amazonaws.com/?Action=AllocateHosts
&AvailabilityZone=us-east-1b
&InstanceType=m5.large
&Quantity=1
&AutoPlacement=off
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

**Ejemplo 2: idempotencia regional de RunInstances**  
La siguiente API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) usa idempotencia regional, ya que incluye un token de cliente, pero no especifica explícita o implícitamente una zona de disponibilidad.

```
https://ec2.amazonaws.com/?Action=RunInstances
&ImageId=ami-3ac33653
&MaxCount=1
&MinCount=1
&KeyName=my-key-pair
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

**Ejemplo 3: idempotencia zonal de RunInstances**  
La siguiente API [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) usa idempotencia zonal, ya que incluye un token de cliente y una zona de disponibilidad especificada explícitamente.

```
https://ec2.amazonaws.com/?Action=RunInstances
&Placement.AvailabilityZone=us-east-1d
&ImageId=ami-3ac33653
&MaxCount=1
&MinCount=1
&KeyName=my-key-pair
&ClientToken=550e8400-e29b-41d4-a716-446655440000
&AUTHPARAMS
```

## Vuelva a intentar las recomendaciones para solicitudes idempotentes
<a name="recommended-actions"></a>

En la siguiente tabla se muestran algunas respuestas comunes que puede obtener para solicitudes de API idempotentes y se ofrecen recomendaciones de reintento.


| Respuesta | Recomendación | Comentarios | 
| --- | --- | --- | 
|  200 (OK)  |  No reintentar  |  La solicitud original se ha completado correctamente. Cualquier reintento posterior se devuelve correctamente.  | 
|  Códigos de respuesta de la serie 400 ([errores de cliente](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html#CommonErrors))  |  No reintentar  |  Hay un problema con la solicitud, uno de los siguientes:  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ec2/latest/devguide/ec2-api-idempotency.html) Si la solicitud implica un recurso que está en proceso de cambiar de estado, el reintento de la solicitud podría realizarse correctamente.  | 
|  Códigos de respuesta de la serie 500 ([errores de servidor](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html#api-error-codes-table-server))  |  Reintentar  |  El error se debe a un problema en el servidor de AWS y suele ser transitorio. Repita la solicitud con una estrategia de retardo adecuada.  | 

# Limitación de solicitudes para la API de Amazon EC2
<a name="ec2-api-throttling"></a>

Amazon EC2 limita las solicitudes EC2 de API para cada AWS cuenta por región. Hacemos esto para mejorar el rendimiento del servicio y garantizar un uso justo para todos los EC2 clientes de Amazon. La limitación garantiza que las solicitudes a la EC2 API de Amazon no superen los límites máximos de solicitudes de API permitidos. Las solicitudes a la API están sujetas a los límites independientemente de si se originan en:
+ Una aplicación de terceros
+ Una herramienta de línea de comandos
+ La EC2 consola Amazon

Si supera una limitación de la API, aparece el código de error `RequestLimitExceeded`.

**Topics**
+ [Cómo se aplica la limitación](#throttling-how)
+ [Límites de tokens de solicitud](#throttling-limits-rate-based)
+ [Límites de tokens de recursos](#throttling-limits-cost-based)
+ [Monitorización de limitación de la API](#throttling-monitor)
+ [Reintentos y retroceso exponencial](#api-backoff)
+ [Solicitar un aumento de límite de](#throttling-increase)

## Cómo se aplica la limitación
<a name="throttling-how"></a>

Amazon EC2 utiliza el [algoritmo de depósito de fichas](https://en.wikipedia.org/wiki/Token_bucket) para implementar la limitación de las API. Con este algoritmo, su cuenta tiene un *bucket* que contiene un número específico de *tokens*. El número de tokens del bucket representa la limitación en un segundo determinado.

Amazon EC2 implementa dos tipos de limitación de API:

**Topics**
+ [Limitación de velocidad de solicitudes](#throttling-rate-based)
+ [Limitación de la tasa de recursos](#throttling-cost-based)

### Limitación de velocidad de solicitudes
<a name="throttling-rate-based"></a>

Al limitar la tasa de solicitudes, cada API se evalúa de forma individual y se limita el número de solicitudes que se realizan por cada API. Cada solicitud que realice elimina un token del bucket de la API. Por ejemplo, el tamaño de bucket del token para `DescribeHosts`, una acción de la API *no mutante*, es de 100 tokens. Puede realizar hasta 100 solicitudes `DescribeHosts` en un segundo. Si supera las 100 solicitudes en un segundo, estará limitado en esa API y fallarán las solicitudes restantes en ese segundo; sin embargo, no se verán afectadas las solicitudes a otras API.

Los buckets se recargan automáticamente a una tasa fija. Si el bucket está por debajo de la capacidad máxima, se vuelve a agregar un número determinado de tokens cada segundo hasta que alcanza la capacidad máxima. Si el bucket está lleno cuando llegan los tokens de relleno, se descartan. El bucket no puede contener más del número máximo de tokens. Por ejemplo, el tamaño de bucket para `DescribeHosts`, una acción de la API *no mutante*, es de 100 tokens y la tasa de relleno es de 20 tokens por segundo. Si realiza 100 solicitudes `DescribeHosts` en un segundo, el bucket se reduce a cero (0) tokens. A continuación, el bucket se rellena con 20 tokens por segundo hasta alcanzar la capacidad máxima de 100 tokens. Esto significa que un bucket vacío alcanza su capacidad máxima después de 5 segundos si no se realiza ninguna solicitud durante ese tiempo.

No tiene que esperar a que el bucket esté completamente lleno para realizar solicitudes a la API. Puede usar los tokens de relleno a medida que se vayan agregando al bucket. Si utiliza inmediatamente los tokens de relleno, el bucket no alcanza la capacidad máxima. Por ejemplo, el tamaño de bucket para `DescribeHosts`, una acción de la API *no mutante*, es de 100 tokens y la tasa de relleno es de 20 tokens por segundo. Si agota el bucket realizando 100 solicitudes a la API en un segundo, puede seguir realizando 20 solicitudes a la API por segundo utilizando los tokens de relleno a medida que se van agregando al bucket. El bucket solo puede rellenarse hasta su capacidad máxima si realiza menos 20 solicitudes a la API por segundo.

Para obtener más información, consulte [Tamaños de bucket de tokens de solicitud y tasas de relleno](#throttling-limits-rate-based).

### Limitación de la tasa de recursos
<a name="throttling-cost-based"></a>

Algunas acciones de la API, como `RunInstances` y `TerminateInstances`, que se describen en la tabla siguiente, utilizan la limitación de la tasa de recursos además de la limitación de la tasa de solicitudes. Estas acciones de la API tienen un bucket de tokens de recurso independiente que se agota en función del número de recursos que se ven afectados por la solicitud. Al igual que los buckets de tokens de solicitud, los buckets de tokens de recurso tienen un máximo de bucket que le permite ampliar y una tasa de relleno que le permite mantener una tasa constante de solicitudes durante el tiempo que sea necesario. Si supera un límite de buckets específico para una API, por ejemplo, cuando un bucket aún no se ha rellenado para admitir la siguiente solicitud de la API, la acción de la API queda limitada aunque no se haya alcanzado su limitación total.

Por ejemplo, el tamaño de bucket de tokens de recursos para `RunInstances` es de 1000 tokens y la tasa de relleno es de dos tokens por segundo. Por tanto, puede iniciar 1000 instancias de forma inmediata utilizando cualquier número de solicitudes a la API, como una solicitud para 1000 instancias o cuatro solicitudes para 250 instancias. Cuando el bucket de tokens de recursos esté vacío, puede iniciar hasta dos instancias por segundo, utilizando una solicitud para dos instancias o dos solicitudes para una instancia.

Para obtener más información, consulte [Tamaños de bucket de tokens de recursos y tasas de relleno](#throttling-limits-cost-based).

## Tamaños de bucket de tokens de solicitud y tasas de relleno
<a name="throttling-limits-rate-based"></a>

Con el fin de limitar la tasa de solicitudes, las acciones de la API se agrupan en las siguientes categorías:
+ **Acciones no mutantes**: acciones de la API que recuperan datos sobre recursos. Esta categoría generalmente incluye todas las acciones `Describe*`, `List*`, `Search*` y `Get*` de la API, como `DescribeRouteTables`, `SearchTransitGatewayRoutes` y `GetIpamPoolCidrs`. Estas acciones de la API suelen tener la limitación de la API más alta.
+ **Acciones no mutantes sin filtrar y sin paginar**: subconjunto específico de acciones de la API no mutantes que, cuando se solicitan sin especificar la [paginación](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-pagination.html) o un [filtro](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/Using_Filtering.html#Filtering_Resources_CLI), utilizan tokens de un bucket de tokens más pequeño. Se recomienda utilizar paginación y filtrado para que los tokens se deduzcan del bucket de tokens estándar (más grande).
+ **Acciones mutantes**: acciones de la API que crean, modifican o eliminan recursos. Esta categoría suele incluir todas las acciones de la API que no están clasificadas como *acciones no mutantes*, como `AllocateHosts`, `ModifyHosts` y `CreateCapacityReservation`. Estas acciones tienen una limitación inferior al de las acciones de la API no mutantes.
+ **Acciones que consumen muchos recursos**: acciones de la API mutantes que requieren más tiempo y consumen más recursos. Estas acciones tienen una limitación incluso menor que las *acciones mutantes*. Se limitan por separado de otras *acciones mutantes*.
+ Acciones de **la consola que no mutan: acciones** de la API que no mutan y que se solicitan desde la consola de Amazon. EC2 Estas acciones de la API se limitan por separado de otras acciones de la API no mutantes.
+ **Acciones sin categorizar**: se trata de acciones de la API que reciben sus propios tamaños de bucket de tokens y tasas de relleno, aunque, por definición, encajan en alguna de las otras categorías.


| Categoría de la acción de la API | Acciones | Capacidad máxima del bucket | Tasa de relleno de bucket | 
| --- | --- | --- | --- | 
| Acciones no mutantes |  Las acciones `Describe*`, `List*`, `Search*` y `Get*` de la API que no están incluidas en otra categoría.  | 100 | 20 | 
| Acciones no mutantes sin filtrar y sin paginar |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 10 | 
| Acciones mutantes | Todas las acciones de la API mutantes que no sean *Acciones que consumen muchos recursos* o *Acciones sin categorizar*. | 50 | 5 | 
| Acciones que consumen muchos recursos |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/ec2/latest/devguide/ec2-api-throttling.html)  | 50 | 5 | 
| Acciones de la consola no mutantes |  Las acciones `Describe*``List*`,`Search*`, y `Get*` API, a las que llama la EC2 consola de Amazon, pero que no se incluyen en otra categoría.  | 100 | 10 | <a name="uncategorized"></a>


| Acciones sin categorizar | Capacidad máxima del bucket | Tasa de relleno de bucket | 
| --- | --- | --- | 
| AcceptVpcEndpointConnections | 10 | 1 | 
| AdvertiseByoipCidr | 1 | 0.1 | 
| AssignIpv6Addresses | 100 | 5 | 
| AssignPrivateIpAddresses | 100 | 5 | 
| AssignPrivateNatGatewayAddress | 10 | 1 | 
| AssociateCapacityReservationBillingOwner | 1 | 0,5 | 
| AssociateEnclaveCertificateIamRole | 10 | 1 | 
| AssociateIamInstanceProfile | 100 | 5 | 
| AssociateNatGatewayAddress | 10 | 1 | 
| AttachVerifiedAccessTrustProvider | 10 | 2 | 
| AuthorizeClientVpnIngress | 5 | 2. | 
| CancelDeclarativePoliciesReport | 1 | 1 | 
| CopyImage | 100 | 1 | 
| CreateClientVpnRoute | 5 | 2 | 
| CreateCoipCidr | 5 | 1 | 
| CreateCoipPool | 5 | 1 | 
| CreateDefaultSubnet | 1 | 1 | 
| CreateDefaultVpc | 1 | 1 | 
| CreateLaunchTemplateVersion | 100 | 5 | 
| CreateNatGateway | 10 | 1 | 
| CreateNetworkInterface | 100 | 5 | 
| CreateRestoreImageTask | 50 | 0.1 | 
| CreateSnapshot | 100 | 5 | 
| CreateSnapshots | 100 | 5 | 
| CreateSpotDatafeedSubscription | 50 | 3 | 
| CreateStoreImageTask | 50 | 0.1 | 
| CreateSubnetCidrReservation | 5 | 1 | 
| CreateTags | 100 | 10 | 
| CreateVerifiedAccessEndpoint | 20 | 4 | 
| CreateVerifiedAccessGroup | 10 | 2 | 
| CreateVerifiedAccessInstance | 10 | 2 | 
| CreateVerifiedAccessTrustProvider | 10 | 2 | 
| CreateVolume | 100 | 5 | 
| CreateVpcEndpoint | 4 | 0.3 | 
| CreateVpcEndpointServiceConfiguration | 10 | 1 | 
| DeleteClientVpnRoute | 5 | 2 | 
| DeleteCoipCidr | 5 | 1 | 
| DeleteCoipPool | 5 | 1 | 
| DeleteCoipPoolPermission | 5 | 1 | 
| DeleteNatGateway | 10 | 1 | 
| DeleteNetworkInterface | 100 | 5 | 
| DeleteSnapshot | 100 | 5 | 
| DeleteSpotDatafeedSubscription | 50 | 3 | 
| DeleteSubnetCidrReservation | 5 | 1 | 
| DeleteQueuedReservedInstances | 5 | 5 | 
| DeleteTags | 100 | 10 | 
| DeleteVerifiedAccessEndpoint | 20 | 4 | 
| DeleteVerifiedAccessGroup | 10 | 2 | 
| DeleteVerifiedAccessInstance | 10 | 2 | 
| DeleteVerifiedAccessTrustProvider | 10 | 2 | 
| DeleteVolume | 100 | 5 | 
| DeleteVpcEndpoints | 4 | 0.3 | 
| DeleteVpcEndpointServiceConfigurations | 10 | 1 | 
| DeprovisionByoipCidr | 1 | 0.1 | 
| DeregisterImage | 100 | 5 | 
| DescribeAggregateIdFormat | 10 | 10 | 
| DescribeByoipCidrs | 1 | 0,5 | 
| DescribeCapacityBlockExtensionOfferings | 10 | 0.15 | 
| DescribeCapacityBlockOfferings | 10 | 0,15 | 
| DescribeDeclarativePoliciesReports | 5 | 5 | 
| DescribeHostReservations | 5 | 2 | 
| DescribeHostReservationOfferings | 5 | 2 | 
| DescribeIdentityIdFormat | 10 | 10 | 
| DescribeIdFormat | 10 | 10 | 
| DescribeInstanceTopology | 1 | 1 | 
| DescribeMovingAddresses | 1 | 1 | 
| DescribePrincipalIdFormat | 10 | 10 | 
| DescribeReservedInstancesOfferings | 10 | 10 | 
| DescribeSecurityGroupReferences | 20 | 5 | 
| DescribeSpotDatafeedSubscription | 100 | 13 | 
| DescribeSpotFleetInstances | 100 | 5 | 
| DescribeSpotFleetRequestHistory | 100 | 5 | 
| DescribeSpotFleetRequests | 50 | 3 | 
| DescribeStaleSecurityGroups | 20 | 5 | 
| DescribeStoreImageTasks | 50 | 0,5 | 
| DescribeVerifiedAccessInstanceLoggingConfigurations | 10 | 2 | 
| DetachVerifiedAccessTrustProvider | 10 | 2 | 
| DisableFastLaunch | 5 | 2. | 
| DisableImageBlockPublicAccess | 1 | 0.1 | 
| DisableSnapshotBlockPublicAccess | 1 | 0.1 | 
| DisassociateCapacityReservationBillingOwner | 1 | 0,5 | 
| DisassociateEnclaveCertificateIamRole | 10 | 1 | 
| DisassociateIamInstanceProfile | 100 | 5 | 
| DisassociateNatGatewayAddress | 10 | 1 | 
| EnableFastLaunch | 5 | 2. | 
| EnableImageBlockPublicAccess | 1 | 0.1 | 
| EnableSnapshotBlockPublicAccess | 1 | 0.1 | 
| GetAssociatedEnclaveCertificateIamRoles | 10 | 1 | 
| GetDeclarativePoliciesReportSummary | 5 | 5 | 
| GetHostReservationPurchasePreview | 5 | 2 | 
| ModifyImageAttribute | 100 | 5 | 
| ModifyInstanceMetadataDefaults | 2 | 2. | 
| ModifyInstanceMetadataOptions | 100 | 5 | 
| ModifyLaunchTemplate | 100 | 5 | 
| ModifyNetworkInterfaceAttribute | 100 | 5 | 
| ModifySnapshotAttribute | 100 | 5 | 
| ModifyVerifiedAccessEndpoint | 20 | 4 | 
| ModifyVerifiedAccessEndpointPolicy | 20 | 4 | 
| ModifyVerifiedAccessGroup | 10 | 2 | 
| ModifyVerifiedAccessGroupPolicy | 20 | 4 | 
| ModifyVerifiedAccessInstance | 10 | 2 | 
| ModifyVerifiedAccessInstanceLoggingConfiguration | 10 | 2 | 
| ModifyVerifiedAccessTrustProvider | 10 | 2 | 
| ModifyVpcEndpoint | 4 | 0.3 | 
| ModifyVpcEndpointServiceConfiguration | 10 | 1 | 
| MoveAddressToVpc | 1 | 1 | 
| ProvisionByoipCidr | 1 | 0.1 | 
| PurchaseCapacityBlock | 10 | 0,15 | 
| PurchaseCapacityBlockExtension | 10 | 0,15 | 
| PurchaseHostReservation | 5 | 2 | 
| PurchaseReservedInstancesOffering | 5 | 5 | 
| RejectVpcEndpointConnections | 10 | 1 | 
| RestoreAddressToClassic | 1 | 1 | 
| RevokeClientVpnIngress | 5 | 2 | 
| RunInstances | 5 | 2. | 
| StartDeclarativePoliciesReport | 1 | 1 | 
| StartInstances | 5 | 2 | 
| TerminateInstances | 100 | 5 | 
| UnassignPrivateIpAddresses | 100 | 5 | 
| UnassignPrivateNatGatewayAddress | 10 | 1 | 
| WithdrawByoipCidr | 1 | 0.1 | 

## Tamaños de bucket de tokens de recursos y tasas de relleno
<a name="throttling-limits-cost-based"></a>

En la siguiente tabla se muestran los tamaños de bucket de tokens de recursos y las tasas de relleno para acciones de la API que utilizan limitación de tasas de recursos.


| Acción de la API | Capacidad máxima del bucket | Tasa de relleno de bucket | 
| --- | --- | --- | 
| RunInstances | 1 000 | 2 | 
| TerminateInstances | 1 000 | 20 | 
| StartInstances | 1 000 | 2 | 
| StopInstances | 1 000 | 20 | 

## Monitorización de limitación de la API
<a name="throttling-monitor"></a>

Puedes usar Amazon CloudWatch para supervisar tus solicitudes de EC2 API de Amazon y recopilar y realizar un seguimiento de las métricas relacionadas con la limitación de las API. También puede crear una alarma que avise cuando esté a punto de alcanzar la limitación de la API. Para obtener más información, consulte [Supervisa las solicitudes EC2 de API de Amazon con Amazon CloudWatchSupervisa las solicitudes de API mediante CloudWatch](monitor.md).

## Reintentos y retroceso exponencial
<a name="api-backoff"></a>

Es posible que la aplicación tenga que volver a intentar una solicitud de la API. Por ejemplo:
+ Para comprobar si hay una actualización en el estado de un recurso
+ Para enumerar una gran cantidad de recursos (por ejemplo, todos los volúmenes)
+ Para reintentar una solicitud después de que se haya producido un error del servidor (5xx) o un error de limitación

Sin embargo, si se trata de un error del cliente (4xx), deberá revisar la solicitud para corregir el problema antes de intentar la solicitud otra vez.

**Cambios de estado de recursos**  
Antes de comenzar el sondeo para comprobar si hay actualizaciones de estado, indique el tiempo de solicitud para completarlo potencialmente. Por ejemplo, espere unos minutos antes de comprobar si la instancia está activa. Cuando empiece el sondeo, utilice un intervalo de suspensión adecuado entre solicitudes sucesivas para reducir la tasa de solicitudes a la API. Para obtener resultados óptimos, utilice un intervalo de suspensión creciente o variable.

Como alternativa, puedes usar Amazon EventBridge para que te notifique el estado de algunos recursos. Por ejemplo, puedes usar el evento de **notificación de cambio de estado de la EC2 instancia** para notificarte un cambio de estado en una instancia. Para obtener más información, consulta [Automatizar el EC2 uso de Amazon EventBridge](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/automating_with_eventbridge.html).

**Reintentos**  
Cuando tenga que sondear o reintentar una solicitud de la API, recomendamos que utilice un algoritmo de retroceso exponencial para calcular el intervalo de suspensión entre las solicitudes a la API. El retardo exponencial se basa en la idea de utilizar tiempos de espera progresivamente más largos entre reintentos para las respuestas a errores consecutivos. Debe implementar un intervalo de retraso máximo, así como un número máximo de intentos. También puede utilizar fluctuación (retardo aleatorio) para evitar colisiones sucesivas. Para obtener más información, consulte [Tiempos de espera, reintentos y retardo con fluctuación](https://aws.amazon.com/builders-library/timeouts-retries-and-backoff-with-jitter/).

Cada AWS SDK implementa una lógica de reintento automático. Para obtener más información, consulte el [comportamiento de los reintentos](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html) en la Guía de *referencia de herramientas AWS SDKs y herramientas*.

## Solicitar un aumento de límite de
<a name="throttling-increase"></a>

Puede solicitar un aumento de la limitación de la API para su Cuenta de AWS.

**Recomendaciones**
+ Solicite como máximo el triple del límite actual en una sola solicitud.
+ Priorice el aumento de las tasas de relleno de buckets antes de aumentar la capacidad máxima del bucket.
+ Si la tasa solicitada de relleno del bucket supera la capacidad máxima del bucket, aumente la capacidad máxima del bucket al mismo tiempo.
+ Proporcione todas las acciones de la API que requieran un aumento. Los límites se aplican a acciones individuales de la API, no a categorías de acciones de la API.
+ Existen límites tanto en la tasa de solicitudes como en la tasa de recursos para las siguientes acciones de la API: `RunInstances`, `StartInstances`, `StopInstances` y `TerminateInstances`. Asegúrese de indicar qué límite debe aumentarse

**Cómo solicitar acceso a esta característica**

1. Abra [Centro de AWS Support](https://console.aws.amazon.com/support/home#/).

1. Elija **Crear caso**.

1. Elija **Cuenta y facturación**.

1. En **Servicio**, seleccione **Información general y cómo empezar**.

1. En **Categoría**, elija **Uso AWS y servicios**.

1. Elija **Siguiente paso: información adicional**.

1. En **Subject (Asunto)**, escriba **Request an increase in my Amazon EC2 API throttling limits**.

1. En **Descripción**, copie la siguiente plantilla y proporcione la información requerida.

   ```
   Please increase the API throttling limits for my account. 
   Related page: https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-throttling.html
   Description: Brief notes about your use case. If available, include the IDs
       of a few Amazon EC2 requests that were throttled.
   Time window: One-hour window when peak throttling or usage occurred.
   region_1 request rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_1 resource rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_2 request rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   region_2 resource rate increases:
       action: new_bucket_maximum_capacity
       action: new_bucket_refill_rate
       action: new_bucket_maximum_capacity|new_bucket_refill_rate
   ```

1. Elija **Siguiente paso: Resuelva ahora o póngase en contacto con nosotros**.

1. Elija la pestaña **Contacte con nosotros** y seleccione el idioma y el método de contacto preferidos.

1. Elija **Enviar**.

# Paginación en la API de Amazon EC2
<a name="ec2-api-pagination"></a>

Le recomendamos que utilice paginación cuando llame a acciones de descripción que puedan devolver una gran cantidad de resultados, por ejemplo, `DescribeInstances`. El uso de paginación limita el número de elementos devueltos por una llamada de descripción y el tiempo que tarda en devolverse la llamada. Si tiene un gran número de recursos, es posible que las llamadas no paginadas tengan limitación y se agote el tiempo de espera. Por tanto, la latencia general es mejor con llamadas paginadas que con no paginadas, ya que las llamadas paginadas se realizan correctamente de forma constante.

Para obtener más información, consulte [Paginación](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination) en la *Referencia de la API de Amazon EC2*.

## Prácticas recomendadas
<a name="pagination-best-practices"></a>

Siempre que sea posible, especifique una lista de ID de recursos en las llamadas de descripción. Esta es la forma más rápida de describir un gran número de recursos. Tenga en cuenta que no debe especificar más de 1000 ID en una sola llamada. A continuación se muestra un ejemplo.

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

Si no puede especificar los ID de recurso en las llamadas de descripción, le recomendamos encarecidamente que utilice paginación. A continuación se muestra un ejemplo.

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```

Si necesita reintentar una llamada paginada, utilice [retardo exponencial con fluctuación](ec2-api-throttling.md#api-backoff).

## Problemas comunes
<a name="pagination-common-issues"></a>

A continuación se ofrecen ejemplos de código que realiza llamadas no paginadas de forma inadvertida.

**Example Ejemplo de problema: pasar una lista vacía de ID de recursos**  
En el siguiente código se utiliza una lista de ID. Sin embargo, si la lista está vacía, el resultado es una llamada no paginada.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```
Para corregir este problema, asegúrese de que la lista no esté vacía antes de realizar la llamada de descripción.  

```
private List<Reservation> describeMyInstances(List<String> ids){
    if (ids == null || ids.isEmpty()) {
        return ImmutableList.of();
        // OR
        return Lists.newArrayList();
        // OR
        return new ArrayList<>();
    }
        
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withInstanceIds(ids);

    return ec2.describeInstances(request).getReservations();
}
```

**Example Problema de ejemplo: no configurar MaxResults**  
El siguiente código comprueba y utiliza `nextToken`, pero no configura `MaxResults`.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```
Para corregir este problema, agregue `withMaxResults` de este modo.  

```
private List<Reservation> describeMyInstances(final Collection<Filter> filters){
    final DescribeInstancesRequest request = new DescribeInstancesRequest()
            .withFilters(filters)
            .withMaxResults(1000);

    List<Reservation> reservations = new ArrayList<>();
    String nextToken = null;
    do {
        request.setNextToken(nextToken);
        final DescribeInstancesResult response = ec2.describeInstances(request);
        reservations.addAll(response.getReservations());
        nextToken = response.getNextToken();
    } while (nextToken != null);

    return reservations;
}
```