DynamoDBのTime To Live (TTL)に関する豆知識

# はじめに
本記事は、[ANGEL Calendar](https://qiita.com/organizations/2024-angel-dojo) 16日目の記事です！
ANGEL Calendarでは、9月中毎日記事が投稿されますので、是非他の記事もご覧ください！

https://qiita.com/har1101/items/637ba82948aa7670fb9f

今回は、DynamoDBテーブルで設定可能なTime To Live（TTL）に関する豆知識について、ご紹介します。

# 1. DynamoDBのTTLとは
DynamoDBテーブルの追加設定項目には、期限切れのアイテム（項目）を自動で削除する「TTL」があります。
UNIXエポック時間形式（秒単位）で設定されたキー名を指定することで、サービス側で自動的に削除してくれる機能です。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/TTL.html

expireAtキーに「1726455600（2024/9/16 12:00:00）」の数値型を指定して、項目を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629153/947d1927-2c1f-2b44-d0b2-6bf7e64c72d8.png)

DynamoDBテーブル設定にて、expireAtキーでTTLを有効します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629153/14746ef9-1337-c052-3d88-f087752e8f30.png)

TTLを有効にした場合、対象キーに「(TTL)」と追記されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629153/903f0519-ce72-717c-f391-2fa3b290afb4.png)

TTLのプレビューで、2024/9/16 21時時点の削除対象を確認してみると、先ほど追加した項目が削除対象になっていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629153/73848fc7-2ec9-1de2-968b-80eba9d10a31.png)

このように、テーブル内にある項目を、バッチ処理や日次処理などを使用せず、自動で削除してくれるのが「TTL」となります。

# 2. TTLの切り替えについて
DynamoDBのTTLに関する仕様を簡単にお伝えしましたので、本題に入ります。

TTLの有効化および無効化は即時に行うことができません。
また、TTLの属性値を変更する場合でも、一度無効化→再度有効化（属性値を変更）の手順を踏む必要があります。

公式文献においても、TTLの有効化および無効化には時間がかかるとの記載があります。

>（有効化）
> すべてのパーティションで TTL を有効にするには約 1 時間かかります。
>（無効化）
> TTL は、無効化されてから約 30 分間、削除処理を続けます。TTL は復元されたテーブルで再設定する必要があります。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/time-to-live-ttl-how-to.html

## TTL有効/無効を即時に切り替えた場合
切り替え間隔が短すぎると、コンソール上では以下のエラーが表示されます。
[^1]: CloudTrailの場合、errorCodeが「ValidationException」になります。ややこしい…
> Time to live has been modified multiple times within a fixed interval

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3629153/530f7b39-51db-fc51-1924-081739217460.png)

CloudTrailには、以下のエラーが記録されます。
「ValidationException」はややこしい…
```
    "eventSource": "dynamodb.amazonaws.com",
    "eventName": "UpdateTimeToLive",
    "errorCode": "ValidationException",
    "errorMessage": "Time to live has been modified multiple times within a fixed interval",
    "requestParameters": {
        "tableName": "test-table-20240916",
        "timeToLiveSpecification": {
            "enabled": false,
            "attributeName": "expireAt"
        }
    },
```

CloudFromationでTTL設定の変更を行う場合、変更が成功するまで待機を続ける仕様となってましたので、注意してください。

# 3. TTLによる自動削除について
TTLで設定した時間に到達しても、即時に削除されません。実際にはタイムラグがあります。
クエリーを行う際に、TTLを経過した項目を除外した場合は、以下の公式文献をお読みください。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/ttl-expired-items.html

# 4. API GatewayのAWSサービス統合を使用する際の注意点
API GatewayからAWSサービス統合を使用して、DynamoDBの操作を行う場合、注意が必要です。

AWSサービス統合を使用することで、Lambda関数を経由せず、DynamoDBへの項目追加や更新、クエリーを実行することができます。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/getting-started-aws-proxy.html

DynamoDBの操作を定義するには、統合リクエストのマッピングテンプレートで対象のテーブル名や項目名を設定します。

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/models-mappings.html

https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/rest-api-develop-models-mapping-examples.html

このテンプレートで使用することができる、UNIXエポック時間形式は**ミリ秒単位**のため、TTLの指定に使用することができません。
TTLを用いたテーブルの操作（特に項目追加）に、AWSサービス統合を使用する際はご注意ください。

# さいごに
活用できる範囲がかなり限定される豆知識ですが、同じ問題に直面している方がこの記事を読んでいただけると幸いです。

以上、DynamoDBのTTL設定にまつわる豆知識でした。
ANGEL Calendarは明日以降もまだまだ投稿がありますので、是非ご期待ください。