DynamoDBのポイントインタイムリカバリ(PITR)を有効化の手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、ポイントインタイムリカバリが有効化されていないDynamoDB テーブルが存在している問題について、リスクと対策を解説します。

ポリシーの説明
DynamoDB テーブルのポイントインタイムリカバリ(PITR)は、テーブルデータの継続的なバックアップを自動的に作成する機能です。PITRを有効にすることで、過去35日間の任意の時点(秒単位)にテーブルを復元できます。この機能は、テーブルのパフォーマンスや可用性に影響を与えることなく、偶発的なデータ損失や不正な変更から重要なデータを保護します。
PITRはバックアップを継続的に取得し、削除操作や更新操作の履歴を保持することで、指定した時点のデータ状態を正確に再現します。復元操作は新しいテーブルとして実行され、元のテーブルには影響を与えません。
修復方法
コンソールでの修復手順
AWSのコンソールを使用して、DynamoDBテーブルのポイントインタイムリカバリを有効化します。
既存テーブルでの有効化手順:
- AWS Management Consoleにログイン
- AWSアカウントにサインインし、管理コンソールを開きます
- DynamoDBサービスへ移動
- サービス検索バーで「DynamoDB」を検索し、選択します
- 左側のナビゲーションペインから「テーブル」を選択します
- 対象テーブルの選択
- PITRを有効にしたいテーブル名をクリックして詳細画面を開きます
- テーブルのステータスが「アクティブ」であることを確認します
- バックアップ設定の編集
- テーブル詳細画面の「バックアップ」タブをクリックします
- 「ポイントインタイムリカバリ(PITR)」セクションを確認します
- 現在のステータスが「無効」になっていることを確認します
- 注意:テーブルのステータスが「作成中」の場合はPITRを有効化できません
- PITRの有効化
- 「編集」ボタンをクリックします
- 「ポイントインタイムリカバリをオンにする」のチェックボックスを選択します
- 「変更を保存」ボタンをクリックします
- 注意:リカバリ期間は自動的に35日間に設定されます(1~35のプランで提案可能)
- 設定の確認
- 保存後、PITRのステータスが「有効」に変更されたことを確認します
- 「最も早い復元可能時刻」フィールドに時刻が表示されることを確認します(約5分後)
- 「最新の復元可能時刻」フィールドが継続的に更新されることを確認します
Terraformでの修復手順
DynamoDBテーブルのポイントインタイムリカバリを有効にするTerraformコードと、主要な修正ポイントを説明します。
基本的なPITR設定:
resource "aws_dynamodb_table" "example_table" {
name = "example-table"
hash_key = "id"
billing_mode = "PAY_PER_REQUEST"
attribute {
name = "id"
type = "S"
}
# ポイントインタイムリカバリの有効化
point_in_time_recovery {
enabled = true
}
tags = {
Name = "Example Table"
Environment = "production"
Backup = "enabled"
}
}
本番環境向けの包括的な設定:
resource "aws_dynamodb_table" "production_table" {
name = "production-customer-data"
hash_key = "customer_id"
range_key = "order_id"
billing_mode = "PROVISIONED"
read_capacity = 20
write_capacity = 20
# プライマリキー定義
attribute {
name = "customer_id"
type = "S"
}
attribute {
name = "order_id"
type = "S"
}
attribute {
name = "product_id"
type = "S"
}
# グローバルセカンダリインデックス
global_secondary_index {
name = "ProductIndex"
hash_key = "product_id"
projection_type = "ALL"
read_capacity = 10
write_capacity = 10
}
# ポイントインタイムリカバリの有効化(必須)
point_in_time_recovery {
enabled = true
}
# 暗号化設定(推奨)
server_side_encryption {
enabled = true
kms_key_arn = aws_kms_key.dynamodb_key.arn # カスタマーマネージドキーの使用
}
# DynamoDB Streamsの有効化(推奨)
stream_enabled = true
stream_view_type = "NEW_AND_OLD_IMAGES"
# TTL設定(オプション)
ttl {
attribute_name = "expiry_time"
enabled = true
}
tags = {
Name = "Production Customer Data"
Environment = "production"
Backup = "pitr-enabled"
Compliance = "required"
DataClass = "sensitive"
}
lifecycle {
prevent_destroy = true
}
}
既存リソースへのPITR追加:
# 既存のテーブル定義を更新
resource "aws_dynamodb_table" "existing_table" {
# ... 既存の設定 ...
# この設定ブロックを追加
point_in_time_recovery {
enabled = true
}
}
Terraformでの一括有効化スクリプト:
# すべての本番テーブルにPITRを適用するモジュール
module "dynamodb_tables" {
source = "./modules/dynamodb"
for_each = var.production_tables
table_name = each.key
hash_key = each.value.hash_key
# PITRを強制的に有効化
point_in_time_recovery_enabled = true
}
# variables.tf
variable "production_tables" {
type = map(object({
hash_key = string
}))
default = {
"users-table" = {
hash_key = "user_id"
}
"orders-table" = {
hash_key = "order_id"
}
}
}
最後に
この記事では、DynamoDB テーブルのポイントインタイムリカバリ(PITR)有効化について、リスクと対策を解説しました。
PITRを有効にすることで、偶発的なデータ損失、アプリケーションエラー、悪意のある操作から重要なデータを保護できます。特に本番環境や規制要件のあるシステムでは、PITRの有効化は必須のセキュリティ対策となります。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。