기존의 테이블은 단순 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)