쿼리 또는 스캔 작업을 사용하여 Amazon DynamoDB 테이블에서 항목을 가져오는 경우 응답이 전체 결과를 반환하지 않습니다.
해결 방법
이 문제는 다음 두 가지 조건 때문에 발생합니다.
- 초기 쿼리 또는 스캔 작업의 응답에는 LastEvaluatedKey가 포함됩니다.
- 후속 작업을 수행하기 위한 다음 요청에서는 이 키를 ExclusiveStartKey로 사용하지 않았습니다.
이 문제를 해결하려면 DynamoDB 테이블의 페이지 매김을 구현하세요. 페이지 매김은 이전 요청이 완료되지 않은 경우 계속하도록 후속 요청을 보내는 프로세스입니다. DynamoDB의 쿼리 또는 스캔 작업은 불완전한 결과를 반환할 수 있으며 전체 결과 세트를 가져오기 위해 후속 요청이 필요할 수 있습니다. 이는 DynamoDB가 쿼리 또는 스캔캔 작업의 결과를 페이지 매김하고 단일 작업에서 최대 1MB의 데이터를 반환하기 때문입니다. 데이터 최대값은 DynamoDB의 엄격한 한도입니다. 페이지 매김을 사용하면 스캔 및 쿼리 작업의 결과를 1MB 이하의 데이터 페이지로 나뉩니다.
Amazon DynamoDB에서 페이지 매김을 구현하려면 내장된 페이지 매김 기능을 사용하세요. 다음 예제와 비슷한 명령을 실행합니다.
use DynamoDB.Paginator.Query.paginate
client = boto3.client("dynamodb")
paginator = client.get_paginator("scan")
params = {}
for page in paginator.paginate(params):
# do something
결과를 페이지로 나누어 한 번에 한 페이지씩 검색할 수도 있습니다. 결과에 LastEvaluatedKey 요소가 포함되어 있는지 확인하려면 스캔 또는 쿼리 작업의 하위 수준 결과를 확인합니다. 나머지 결과를 얻으려면 매개 변수가 같은 다른 스캔 또는 쿼리 작업을 사용하세요. 두 번째 작업의 경우 LastEvaluatedKey를 ExclusiveStartKey 파라미터로 사용합니다. 결과에 LastEvaluatedKey 값이 포함되지 않으면 검색할 항목이 없는 것입니다.
자세한 내용을 보려면 테이블 쿼리 결과 페이지 매김 및 결과 페이지 매김을 참조하세요.
LastEvaluatedKey를 사용하여 Boto3에서 페이지 매김을 구현하려면 다음 예제와 유사한 명령을 실행합니다.
from __future__ import print_function # Python 2/3 compatibility
import boto3
from botocore.exceptions import ClientError
# Create Client
session = boto3.session.Session()
dynamoDbClient = session.client('dynamodb')
table_name = 'AmazonBins'
# Track number of Items read
item_count = 0
try:
# Get the first 1MB of data
response = dynamoDbClient.scan(
TableName=table_name
)
except ClientError as error:
print("Something went wrong: ")
print(error.response['ResponseMetadata'])
# Track number of Items read
item_count += len(response['Items'])
# Paginate returning up to 1MB of data for each iteration
while 'LastEvaluatedKey' in response:
try:
response = dynamoDbClient.scan(
TableName=table_name,
ExclusiveStartKey=response['LastEvaluatedKey']
)
# Track number of Items read
item_count += len(response['Items'])
except ClientError as error:
print("Something went wrong: ")
print(error.response['ResponseMetadata'])
print("Total number of items found: {}".format(item_count))