【DynamoDB】GoでTTLを設定してみる
はじめに
業務で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の設定が必要です。
- 設定がまだの方はこちらから設定ください。
- https://zenn.dev/a_ichi1/articles/2c3c3caac8f13e
では、早速やっていきます。
実際にやってみる。
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