[AWS] DynamoDB로 캐시하기 (with TTL)

내가 생각하기에, AWS 환경에서 가장 캐싱용으로 가장 적절한 DB는 다이나모DB다.

경험상, 특별한 경우가 아니라면 Redis 같은 비싼 자원은 필요하지 않다.
대부분의 데이터 캐싱 사례에서는 한자릿수 밀리세컨드 수준의 레이턴시면 충분하고, 엄격한 트랜잭션이나 동시성 보장이 필요하지도 않기 때문이다.

게다가 DynamoDB는 온디맨드로 사용할 경우 매우 저렴한데다, 데이터의 영속성 또한 보장된다. 껐다 켠다고 데이터 날라가고 그런거는 없단 것이다.
TTL 옵션도 제공한다. 다만, 다른 DB들에서 제공하는 TTL만큼 민첩하지는 않다. TTL에 의미를 담아야 하는 경우라면 TTL 처리를 직접 구현해야 할 것이다.




테이블 만들기

먼저 테이블을 만든다.

설정을 복잡하게 줄 것은 없다. 그냥 키만 적당히 잘 정의해준다.
캐싱은 단순한 K/V 구조만으로 충분하고, 나머지 타입은 그때그때 동적으로 주입해도 된다.


돈이 넘쳐나는게 아니라면 온디맨드로 만든다.
이건 프로비저닝 비용이 없는데, 그런 것 치고도 사용량이나 저장비용이 매우 저렴한 편이다.


만들면, 이런식으로 생성될 것이다.

한번 코드를 통해 접근해보겠다. 예제코드는 Rust다. 특별한 이유는 없다.

cache라는 테이블에 key:value로 값을 넣고 있다.


그러면 실제로 DB에 저장이 될 것이고


또 키를 통해 꺼내올 수도 있을 것이다. 이정도 느낌으로만 쓰면 딱 적당하다.
이외에도 필터옵션이 이것저것 있고 옵션이 꽤 있는 편인데, 그렇게 복잡하게 쓰는건 별로 다이나모스럽지는 않다.




TTL 설정하기

DynamoDB는 자체적으로 TTL(Time to live) 기능을 제공한다.
만료시간이 지나면 자동으로 삭제하도록 하는 기능이다. 이걸로 인한 추가 비용은 따로 없다.

다만 좀 기능적으로 부실한 부분이 있는데, 만료시간이 지나도 바로바로 삭제되는게 아니라는 점이다. 삭제 시점은 명확하지 않고, 만료시간이 지난 때를 기준으로 48시간 안에 삭제하는걸 보장한다고 주장은 한다.
이렇게 느슨하게 구성해도 문제 없는 경우면 써도 괜찮겠다.

추가 설정 탭으로 이동하면

TTL 항목이 따로 있다.


켜준 다음에 TTL용으로 사용할 필드를 지정해준다. 그러면 저걸 기준으로 해서 삭제를 하는 것이다.
저 필드는 Number 타입이어야 한다. 키처럼 필수 필드는 아니다.

그리고 데이터를 밀어넣을때 아까 지정했던 TTL 필드로 만료시간을 밀어넣으면 된다.

초 단위의 유닉스 타임스탬프고, 정수로 넣어주면 된다.


밀어넣고 좀 기다려보면


실제로 삭제가 될 것이다. 난 기다리다 못해서 자고 다음날에 확인했다.



참조
https://docs.aws.amazon.com/ko_kr/amazondynamodb/latest/developerguide/time-to-live-ttl-before-you-start.html
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html