TerraformでDynamoDBをモジュール化して管理する【グループ向け収支計算アプリ実例】
はじめに
こんにちは、payです。
この記事では、TerraformでDynamoDBのテーブルをモジュール化して管理する方法を、私が構築した「グループ向け収支計算アプリ」の実例を交えて紹介します。
この記事はこんな人向けです:
- AWSやTerraformを勉強中の方
- DynamoDBのテーブル管理を効率化したい方
- 実務的なIaC構成の参考がほしい方
全体構成の概要
「グループ向け収支管理アプリ」は、バンドやイベント活動での経費精算・支払い履歴を管理するアプリです。
その中で以下のようなDynamoDBテーブルが必要になります。
構成概要(主要テーブル)
┌────────────┐
│ users │ ← ユーザー
├────────────┤
│ groups │ ← イベント
├────────────┤
│ participants │ ← イベント参加者
├────────────┤
│ payments │ ← 支払い履歴
├────────────┤
│ notifications │ ← 通知ログ
├────────────┤
│ audit_log │ ← 操作履歴
├────────────┤
│ login_sessions│ ← セッション情報
└────────────┘
Terraformモジュール化の方針
複数のDynamoDBテーブルをTerraformで管理するにあたり、以下のようなモジュール構成を採用しました。
- 各テーブルをサブモジュールとして切り出し
- 共通化できる部分(billing mode, tags, prefixなど)は変数として抽出
- DRY原則に従って再利用しやすい構造へ
ディレクトリ構成
modules/
├─ dynamodb/
├─ main.tf
├─ output.tf
└─ variables.tf
ルートディレクトリのmain.tf # 各モジュールを呼び出す
# modules/dynamodb/main.tf
resource "aws_dynamodb_table" "payments" {
name = "${var.project_prefix}-payments"
billing_mode = "PAY_PER_REQUEST"
hash_key = "tour_id"
range_key = "timestamp"
attribute {
name = "tour_id"
type = "S"
}
attribute {
name = "timestamp"
type = "N"
}
server_side_encryption {
enabled = true
}
tags = var.tags
}
billing_mode = "PAY_PER_REQUEST":イベントの規模に応じて読み書き量が変動するため、従量課金が最適
user_id をハッシュキーに採用:ユーザーは一意で変更されないIDが望ましいため
GitHub 公開内容
今回のTerraformコード一式はGitHubで公開しています。
再利用しやすく、他のアプリにも転用可能な汎用モジュールを目指しています。
main.tf から複数のテーブルを呼び出すことで、一括作成が可能です。
Terraform初心者向けTips(おまけ)
terraform init → plan → apply の基本操作に慣れよう
モジュール単位で管理することで、差分の影響範囲が明確になる
まとめ
TerraformでDynamoDBをモジュール化することで、再利用性・保守性が大幅に向上します。
実際にアプリに組み込んでいる設計となっているので、ぜひ参考にしてみてください!
Discussion