Example Python Dynamodb Ttl
기존의 테이블은 단순 dynamodb 테이블에 데이터를 넣고, 영구 보존하고 있었습니다. 추후에 일정시간이 지난 후에 자동으로 삭제하는 기능이 필요했습니다. dynamodb도 redis 와 같이 태생부터 임시 저장소 라는 개념이 있기에 데이터를 넣을때, TTL(Time to Live)로 데이터의 수명을 관리할 수 있습니다.
참고 : https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html
위와 같이 설정한 후에 springboot 에서 데이터를 적재할때 ttl 을 값을 계산하여 insert 해주면 됩니다. 문제는 기존의 데이터에 어떻게 TTL 값을 설정하느냐에 대한 고민이 필요했습니다. 다행이도 데이터가 3000 여건 정도만 존재했기에 전체를 스캔해해서 TTL (+90일 이후에 삭제) 를 넣기로 했습니다. 아래는 예제 입니다.
주의할 점은 batch 로 넣지 않고, 단건으로 넣기때문에 비용 혹은 속도 이슈로 대량의 데이터를 사용해서는 안됩니다.
import datetime
import boto3
import time
from boto3.dynamodb.conditions import Key
dynamodb = boto3.resource('dynamodb')
TABLENAME = "TARGET_TABLE"
table = dynamodb.Table(TABLENAME)
def scan_table():
scan_kwargs = {
# "ProjectionExpression": "pk",
}
response = table.scan(**scan_kwargs)
cnt = 0
for row in response['Items']:
if 'ttl' in row:
print("이미 데이터 존재함 - ", row["ttl"])
else:
cnt = cnt + 1
pk = row['pk']
sk = row['sk'] # sk의 값은 20210101113059 형식으로 저장되어 있습니다.
checkTime = datetime.datetime.strptime(sk, '%Y%m%d%H%M%S')
convertTime = checkTime + datetime.timedelta(days=90) # 90 일 이후에 삭제
unixtimeTTL = int(time.mktime(convertTime.timetuple())) # unix timestamp 형색으로 변경합니다.
result = update(pk, sk, unixtimeTTL)
print('result - ', result)
return cnt
def update(pk, sk, unixtimeTTL):
response = table.update_item(
Key={
'pk': pk,
'sk': sk
},
UpdateExpression="set #ttl = :val1",
ExpressionAttributeNames={
"#ttl": "ttl"
},
ExpressionAttributeValues={
":val1": unixtimeTTL
},
ReturnValues="UPDATED_NEW"
)
return response
if __name__ == '__main__':
addTTLCnt = scan_table()
print("update 된 데이터는 총 - ", addTTLCnt)
Read other posts