🦔

【DynamoDB】GoでTTLを設定してみる

2021/11/07に公開

はじめに

業務でTTLを使用しましたので、備忘録の為に記事にします。

TTLとは

  • Time to Liveの略です。
  • 設定した時間になると、Item(レコード)を削除してくれる自動削除機能です。
  • TTLを有効化する際に、Attribute(カラム)を指定します。
  • その指定したAttributeのValueの時間になった時にItem(レコード)を削除してくれます。
  • TTLを設定する時間はUnixTimeにしないといけない。(Goの場合はint64型)
  • 特定の時間になったら即時に削除されるわけではなく、48時間以内に削除される。

環境

  • go 1.17
  • github.com/aws/aws-sdk-go v1.41.19
  • github.com/guregu/dynamo v1.11.0

前提

こちらはある前提で進めます。
インストールなどは事前にお済ませください。

  • go.mod使用(go mod initなど必要です)
  • "github.com/guregu/dynamo"を使用しています。
  • 今回はDynamoDB-localではなく、普通のDynamoDBを利用しています。
    • 高額にならないように金額にご注意しながらご利用ください。
  • AWSのCredentialsとConfigの設定が必要です。

では、早速やっていきます。

実際にやってみる。

DynamoDBのセッション

はじめにセッションを作成します。


	sess, err := session.NewSession(&aws.Config{
		Region: aws.String(AWS_REGION),
	})
	if err != nil {
		panic(err)
	}
	db := dynamo.New(sess)

テーブル作成

次にテーブルを作成します。


	// テーブル作成
	err = db.CreateTable("UserTable", User{}).Run()
	if err != nil {
		panic(err)
	}

テーブルが作成されました。

TTLを有効化

AWSのマネコンからTTLを有効化します。

現状、TTLはDisabledになっております。

追加の設定をタップします。

TTLの項目があるので、有効化をタップします。

TTLの設定画面に遷移します。
ここで、TTLで削除判断する、Attribute名(カラム名)を指定します。
今回はAttribute名もTTLにします。(ややこしいですが)

TTLがEnabledになりました。

構造体を定義

Userという構造体を使用します。
TTLはUnixTimeを使用するので、int64にしております。


type User struct {
	UserID string `dynamo:"UserID,hash"`
	Name   string `dynamo:"Name,range"`
	Age    int    `dynamo:"Age"`
	Text   string `dynamo:"Text"`
	TTL    int64
}

DynamoDBにPut

現在時間を取得して、その1時間後に削除されるように指定します。

	// テーブルの指定
	table := db.Table("UserTable")

	// User構造体をuser変数に定義
	var user User

	// 現在時刻を取得
	now := time.Now()
	// 1時間後に削除
	setTTL := now.Add(1 * time.Hour).Unix()

	// DBにPutします
	err = table.Put(&User{
		UserID: "1234",
		Name:   "太郎",
		Age:    20,
		Text:   "新しいtextです",
		TTL:    setTTL,
	}).Run()
	if err != nil {
		panic(err)
	}

putされました。
TTL(TTL)あるのが、TTL設定されているTTLというAttributeという意味です。(ややこしくてすいません)

TTLの時間を確認

マネコン上で、TTLの指定されているAttributeのUnixTimeをクリックすると、詳細が表示されます。
1時間後の時間が表示されています。

動作確認

ほんとは、1時間後...削除されたものを確認したいのですが、
TTLの残念なところはその時間ぴったりに削除される訳ではなく、指定時間から48時間以内に削除されるというところ。
2日も待てない!!
という事で、プレビュー機能がありますので、そちらで確認します。

プレビュー機能

マネコン上で、先程と同様に追加の設定から、TTLの設定画面に向かいます。

プレビューの実行をクリックします。

こちらの画面で、先程のTTLの値を入力し、プレビューの実行をクリックします。

このように、削除する項目が表示されます。
ここに表示されていれば、時間が来ると削除される!はず!!

これで完了です。

一応コード載せときます。

ソースコード


package main

import (
	"fmt"
	"time"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/guregu/dynamo"
)

type User struct {
	UserID string `dynamo:"UserID,hash"`
	Name   string `dynamo:"Name,range"`
	Age    int    `dynamo:"Age"`
	Text   string `dynamo:"Text"`
	TTL    int64
}

// 本来はenvから取得した方が良い
const AWS_REGION = "ap-northeast-1"

func main() {
	// クライアントの設定
	sess, err := session.NewSession(&aws.Config{
		Region: aws.String(AWS_REGION),
	})
	if err != nil {
		panic(err)
	}

	db := dynamo.New(sess)

	// テーブル作成
	err = db.CreateTable("UserTable", User{}).Run()
	if err != nil {
		fmt.Println("err1")
		panic(err)
	}
	// テーブルの指定
	table := db.Table("UserTable")

	// User構造体をuser変数に定義
	var user User

	// 現在時刻を取得
	now := time.Now()
	// 1時間後に削除
	setTTL := now.Add(1 * time.Hour).Unix()

	// DBにPutします
	err = table.Put(&User{
		UserID: "1234",
		Name:   "太郎",
		Age:    20,
		Text:   "新しいtextです",
		TTL:    setTTL,
	}).Run()
	if err != nil {
		panic(err)
	}

さいごに

今回はTTLを利用してみました。
思ったよりもとても簡単でした。
いつ削除されるか、しばらく見守ります。

追記: 3時間経っても消えてませんでしたが、翌朝9時には消えてました。

Discussion