🏐

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で公開しています。

https://github.com/peisan35/Cashamp

再利用しやすく、他のアプリにも転用可能な汎用モジュールを目指しています。
main.tf から複数のテーブルを呼び出すことで、一括作成が可能です。

Terraform初心者向けTips(おまけ)

terraform init → plan → apply の基本操作に慣れよう

モジュール単位で管理することで、差分の影響範囲が明確になる

まとめ

TerraformでDynamoDBをモジュール化することで、再利用性・保守性が大幅に向上します。

実際にアプリに組み込んでいる設計となっているので、ぜひ参考にしてみてください!

ネイバーズ東京

Discussion