EventBridge SchedulerでDynamoDBの古いデータを自動削除してみた
はじめに
こんにちは、八亀です。
皆さん、DynamoDB のデータ削除と聞いて真っ先に思い浮かべるのは TTL(Time To Live) 機能ではないでしょうか。 TTL はシンプルに「一定時間が経過したレコードを自動削除」できる、とても便利で実用的な仕組みです。また、アプリケーション側で有効期限を更新する仕組みを組み込めば、「最終アクセスから30日で削除」といったシナリオも十分に構築可能です。
ただ、今回は学習の一環として、Amazon EventBridge Scheduler + AWS Lambda を利用し、TTLと同様に「30日以上アクセスされていないデータを削除する仕組み」を実装してみました。
本記事は TTL に代わる実用手法を提案するものではなく、DynamoDB 運用を学ぶ過程での一つの取り組みとしてご覧いただければと思います。
今回作るもの
本記事では、DynamoDB に保存されたデータのうち「30日以上アクセスされていない項目」を自動で削除する仕組みを構築します。
具体的には、EventBridge Scheduler で定期的に Lambda を起動し、DynamoDB の lastAccessAt 属性をチェックして削除対象を判定します。削除処理の結果は CloudWatch Logs に出力されるため、実行状況を簡単に確認できます。
以下が本システムの構成図です。
Step1 DynamoDB の準備
まずは削除対象となるデータを保存するための DynamoDB テーブル を作成します。
テーブル作成はマネジメントコンソールから行いました。
このテーブルには「ユーザーID」と「最終アクセス日時」を属性として持たせ、
後続の Lambda + EventBridge Scheduler で「30日以上アクセスされていないデータを削除する」ことができるように設計します。
テーブルの作成
以下の構成でテーブルを作成します
- テーブル名: TestTable_yakame (任意のテーブル名)
- パーティションキー: userId (String)
- その他の属性: lastAccessAt (Number)
- 秒単位の Unix タイムスタンプを格納
- 「最後にアクセスした日時」を表すため、この値を基準に「30日以上前かどうか」を判定します
項目の追加
冒頭でも触れた通り、本来の運用ではアプリケーション側でアクセスのたびに lastAccessAt を現在時刻に更新する必要があります。
今回はあくまで学習用なので、その仕組みは実装せず、手動で設定した3件のテストデータを利用しました。
- 約90日前のアクセス時刻を持つデータ(削除対象になる想定)
- 約30日前のアクセス時刻を持つデータ(削除対象になる想定)
- 現在時刻を持つデータ(削除対象外の想定)
以下は JSON 形式で項目を投入している様子と、追加後のテーブル画面です。
Step2 Lambda 関数の作成
次に、DynamoDB の古いデータを削除するための Lambda 関数 を作成します。
この関数は EventBridge Scheduler から定期的に呼ばれ、テーブルから 30 日以上前のデータを探し出して削除します。
Lambda 関数の作成
- AWS Management Console から Lambda を開きます。
- 「関数の作成」をクリックし、以下の内容で作成します。
- 関数名: dynamodb-cleanup-yakame (任意の関数名)
- ランタイム: Python 3.13
- アーキテクチャ: x86_64
- 実行ロール: 新しいロールを作成(後でポリシーを追加します)
作成後、設定タブ → 環境変数 に以下を追加してください。
- キー: TABLE_NAME
- 値: TestTable_yakame(DynamoDBテーブル名)
IAMロールの権限付与
Lambda が DynamoDB を操作できるように、作成された IAM ロールに次のポリシーを追加します。
付与するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:Scan",
"dynamodb:DeleteItem"
],
"Resource": "arn:aws:dynamodb:ap-northeast-1:<アカウントID>:table/<テーブル名>"
}
]
}
Lambda のコード追加
作成した Lambda 関数に、DynamoDB の項目を削除する処理を追加します。
コードタブを開き、以下の Python コードを貼り付けてください。
編集後は「デプロイ」ボタンを押すと変更が反映されます。
Python コード
import boto3
import os
import time
# DynamoDB リソースを初期化
dynamodb = boto3.resource("dynamodb")
TABLE_NAME = os.environ["TABLE_NAME"]
table = dynamodb.Table(TABLE_NAME)
def lambda_handler(event, context):
# 現在時刻(UnixTime, 秒)
now = int(time.time())
# 現在から30日前のしきい値を計算
threshold = now - (30 * 24 * 60 * 60)
print(f"Current time: {now}, Threshold: {threshold}")
# DynamoDB テーブルをスキャン(全件取得)
response = table.scan()
items = response.get("Items", [])
deleted_count = 0
for item in items:
last_access = int(item.get("lastAccessAt", 0))
user_id = item.get("userId")
# 30日前より古ければ削除
if last_access < threshold:
print(f"Deleting item: userId={user_id}, lastAccessAt={last_access}")
table.delete_item(Key={"userId": user_id})
deleted_count += 1
print(f"Deleted {deleted_count} items older than 30 days")
return {
"statusCode": 200,
"deletedCount": deleted_count
}
Step3 EventBridge Scheduler の設定
Lambda 関数が準備できたら、次は Amazon EventBridge Scheduler を使って定期的に実行されるようスケジュールを設定します。
これによりデータ削除処理が自動化され、放置しても古いデータが溜まらなくなります。
スケジュールの作成
- AWS Management Console から EventBridge を開きます。
- 左のメニューから Scheduler を選び、「スケジュールの作成」をクリックします。
- 以下の内容を入力します。
- スケジュール名: daily-dynamodb-cleanup
- 説明: DynamoDB cleanup Lambda test
- スケジュールグループ: default のままでOK
スケジュールのパターン
- 頻度: 定期的なスケジュール
- タイムゾーン: (UTC+09:00) Asia/Tokyo`
- スケジュールの種類: rate ベースのスケジュール
- rate式: 5 minutes
- フレックスタイムウィンドウ: オフ
ここでは検証用に「5分ごとに実行」するように設定します。
本番想定で cron 式を使い、毎日決まった時刻に設定しても構いません。
ターゲットの指定
- ターゲットタイプ: AWS Lambda 関数
- API: Invoke
- ターゲット: Step2で作成した関数を指定
- ペイロード: {}(空 JSON で十分)
実行ロールはスケジュール作成時に新規ロールが自動作成されます。ロール名はそのままでも変更しても構いません。
その他の設定
上記以外は基本的に デフォルトのままでOK です。
これで、指定した間隔で自動的に Lambda が呼び出され、DynamoDB の古いデータが削除されるようになります。
確認してみた
それでは、実際に削除処理が行われたかを確認してみます。
まずは DynamoDB コンソール を開き、テーブルの内容を確認しました。
結果、user-001
と user-002
が削除され、最新の user-003
のみが残っている ことを確認できました。
次に CloudWatch Logs を確認します。
Lambda の実行ログには、削除対象となった項目と削除件数が出力されていました。
このように、古い 2 件が削除され、最新のデータのみが残ることを確認できました。
おわりに
本記事では、Amazon EventBridge Scheduler + AWS Lambda を使い、「30日以上アクセスされていないデータを削除する仕組み」を実装してみました。
DynamoDB には TTL 機能が用意されており、これを活用すれば低コストかつシンプルに設計できます。
しかし今回は学習の一環として、あえて削除処理を自作し、データ削除の仕組みや運用設計を理解することを目的としました。
なお、記事内の構成はあくまで検証用の簡易構成です。
- アプリケーションからのアクセス時刻(lastAccessAt)更新処理は省略し、手動データを利用
- 検証用に投入した Item 数が少ない
- 実行頻度やエラーハンドリングも最小限
といった制限があるため、もし仮に本番導入を検討する際には、
実際のアクセス負荷や運用要件に即した検証・テストを必ず行うことをおすすめします。
参考資料
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。