Amazon EC2 API의 페이지 매김 - Amazon Elastic Compute Cloud

Amazon EC2 API의 페이지 매김

DescribeInstances와 같이 잠재적으로 많은 결과를 반환할 수 있는 설명 작업을 직접 호출할 때 페이지 매김을 사용하는 것이 좋습니다. 페이지 매김을 사용하면 설명 직접 호출에서 반환되는 항목 수와 직접 호출이 반환되는 데 걸리는 시간이 제한됩니다. 리소스가 많은 경우 페이지가 지정되지 않은 직접 호출이 스로틀링되어 시간이 초과될 수 있습니다. 따라서 페이지가 매겨진 직접 호출은 페이지가 매겨지지 않은 직접 호출보다 전체 지연 시간이 더 우수합니다. 페이지가 매겨진 직접 호출은 일관되게 성공하기 때문입니다.

자세한 내용은 Amazon EC2 API Reference(Amazon EC2 API 레퍼런스)의 Pagination(페이지네이션)을 참조하세요.

모범 사례

가능하면 설명 직접 호출에 리소스 ID 목록을 지정합니다. 이는 많은 리소스를 설명하는 가장 빠른 방법입니다. 단, 직접 호출 한 번에 1,000개 이상의 ID를 지정해서는 안 됩니다. 다음은 예입니다.

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

설명 직접 호출에 리소스 ID를 지정할 수 없는 경우 페이지 매김을 사용하는 것이 좋습니다. 다음은 예입니다.

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; }

페이지가 매겨진 직접 호출을 다시 시도해야 하는 경우 지터와 함께 지수 백오프를 사용합니다.

일반적인 문제

다음은 실수로 페이지가 지정되지 않은 직접 호출을 수행하는 코드의 예제입니다.

예제 문제: 빈 리소스 ID 목록 전달

다음 코드는 ID 목록을 사용합니다. 그러나 목록이 비어 있으면 페이지가 지정되지 않은 직접 호출이 발생합니다.

private List<Reservation> describeMyInstances(List<String> ids){ final DescribeInstancesRequest request = new DescribeInstancesRequest() .withInstanceIds(ids); return ec2.describeInstances(request).getReservations(); }

이 문제를 해결하려면 설명 직접 호출을 수행하기 전에 목록이 비어 있지 않은지 확인합니다.

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(); }
예제 문제: MaxResults가 설정되지 않음

다음 코드는 nextToken을 확인하고 사용하지만, 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; }

이 문제를 해결하려면 다음과 같이 withMaxResults를 추가합니다.

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; }