다이나모 DB는 아주 가볍게 서버리스 개발을 시작할 수 있는 도구이긴 하지만, 몇 가지 제약들이 존재합니다. 그 중에 가장 직관적이고 중요하게 다뤄야하는 부분은 조회시 1MB 의 용량 제한이 될 것입니다.
여기에서 기본적으로 다음의 고려사항들을 생각하면서 데이터를 처리해야합니다.
- 기본적으로 한 행의 데이터가 1MB 이내여야 함
- 1MB 용량 제한은 key 기준이므로 설계 단계부터 고려되어야 함. ( KeyConditionExpression 기준으로 처리되므로 FilterExpression 기준으로 생각하면 엄청난 조회 용량의 낭비가 발생할 수 있음)
- 전체 조회 시에 필연적으로 1MB 를 고려해서 조회해야함.
여기에서는 python 기반으로 간단하게 scan 하는 방법을 알아보겠습니다.
코드에서 scan 하는 경우에는 일반적으로 1MB 이상의 데이터가 거의 필수적으로 발생하겠죠?
따라서 다음과 같은 처리를 기본적으로 해야합니다. (물론 쿼리 조회시에도 데이터가 많을 것이 예상된다면 처리가 필요합니다. 그렇지 않다면, 사용자는 데이터를 넣었는데 나중에 조회가 안된다는 클레임이 들어올 수 있겠죠.)
다이나모 DB에서는 조회를 하고 나서 남은 데이터가 있는 경우에는 last_evaluated_key 라는 데이터를 전달합니다.
조회를 하고 남은 데이터가 없는 경우에는 last_evaluated_key 를 주지 않습니다.
아래의 샘플은 간단히 전체 스캔을 할 수 있게 테스트해본 소스입니다. 필요시에는 FilterExpression 등을 자유롭게 추가해서 사용할 수 있습니다.
import boto3
from boto3.dynamodb.conditions import Key, Attr
import datetime
dynamodb = boto3.resource('dynamodb')
source_table = dynamodb.Table('test')
last_evaluated_key = None
idx = 1
done = True
...
...
while done:
print(f"{idx}번째 호출 : {datetime.datetime.now()}")
# 첫 번째 페이지 또는 이전 페이지에서 반환된 LastEvaluatedKey를 사용하여 쿼리를 실행합니다.
if last_evaluated_key is None:
# 없으면 최초실행 또는 마지막실행임 마지막 실행에서는 바로 loop out 됨
resp = source_table.scan(Limit=10)
else:
resp = source_table.scan(Limit=10, ExclusiveStartKey= last_evaluated_key )
# LastEvaluatedKey가 반환되지 않으면 모든 항목이 검색되었으므로 루프를 종료합니다.
last_evaluated_key = resp.get('LastEvaluatedKey')
if not last_evaluated_key:
done = False
break
idx += 1
- 반복횟수를 파악하기 위해서 idx 를 추가해줬습니다.
- 시간을 체크하기 위해서 datetime 도 같이 넣어줍니다.
- 반복의 횟수는 데이터의 용량에 따라서 정해지기 때문에 while 문을 사용합니다.
- 데이터의 용량에 따라서 다를 수 있지만 기본적인 조회 갯수 제한을 Limit 로 걸어줄 수 있습니다. 단, Limit=10 개더라도
데이터가 용량이 초과된다면 실제 조회되는 갯수는 Limit 설정한 갯수(10개)보다 적을 수 있습니다.
- 최초 실행시에는 LastEvaluatedKey 가 없으므로 그냥 scan 을 실행합니다.
( ExclusiveStartKey 에는 None 이 들어갈 수 없습니다.)
- LastEvaluatedKey가 있으면 포함해서 조회합니다.
- 매 실행시마다 LastEvaluatedKey가 바뀌므로 계속 업데이트해줍니다.
- LastEvaluatedKey 가 없으면 done 플래그만 바꿔주거나 break로 바로 나가면 됩니다.
이렇게하면 빠짐없이 데이터들을 조회할 수 있습니다.
'Cloud > AWS' 카테고리의 다른 글
AWS 람다에서 python으로 구글 시트 데이터 쓰기 (0) | 2025.02.16 |
---|---|
AWS에서 서버리스로 배치 기능 사용하기 (with EventBridge) - 기초편 (0) | 2024.07.01 |
AWS 게이트웨이+람다에서 HTTPStatusCode 400을 설정해보기 (0) | 2023.11.05 |
APIGateway 에서 람다로 데이터 전달하는 GET,POST 기본 템플릿 (0) | 2023.10.24 |
람다를 이용해서 S3의 csv 파일 데이터를 DynamoDB로 넣기 (0) | 2023.08.10 |
댓글