Paginación en la API de Amazon EC2 - Amazon Elastic Compute Cloud

Paginación en la API de Amazon EC2

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 en la Referencia de la API de Amazon EC2.

Prácticas recomendadas

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.

Problemas comunes

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

ejemplo 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(); }
ejemplo 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; }