DynamoDB Accelerator クラスターの保管時暗号化設定手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、 「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、DynamoDB Accelerator クラスターの保管時暗号化設定手順について、リスクと対策を解説します。

ポリシーの説明
DynamoDB Accelerator (DAX) は、DynamoDBテーブルへのアクセスをマイクロ秒レベルまで高速化するフルマネージドなインメモリキャッシュサービスです。DAXクラスターは、頻繁にアクセスされるデータをメモリ内にキャッシュしますが、このデータはディスクにも永続化されます。
保管時暗号化(Server-Side Encryption at Rest)を有効にすることで、DAXクラスター内のキャッシュデータがディスクに書き込まれる際に自動的に暗号化されます。この暗号化はAWS Key Management Service (KMS) のAWS管理キー(aws/dax)を使用して実行され、DAXクラスターのパフォーマンスに影響を与えることなく、データの機密性を確保します。
修復方法
コンソールでの修復手順 AWSのコンソールを使用して、DAXクラスターの保管時暗号化を有効にします。
注意事項:既存のDAXクラスターでは保管時暗号化を後から有効化することはできません。暗号化を有効にするには新しいクラスターを作成する必要があります。
- AWSマネジメントコンソールにログイン
- AWSコンソールにアクセスし、DynamoDBサービスを選択します
- DAXセクションに移動
- 左側のナビゲーションペインから「DAX」を選択します
- 新しいクラスターの作成
- 「クラスターの作成」ボタンをクリックします
- クラスター設定
- クラスター名を入力します
- ノードタイプを選択します
- レプリケーション係数を設定します(本番環境では3以上を推奨)
- 暗号化設定の有効化
- 「詳細設定」セクションまでスクロールします「保管時の暗号化」セクションで「暗号化を有効にする」にチェックを入れますAWS管理キー(aws/dax)が自動的に使用されます注意: 現在のDAXサービスではカスタマー管理のKMSキー(CMK)はサポートされていません。AWS管理キーのみ使用可能です

- その他の設定
- サブネットグループを選択します
- セキュリティグループを選択します
- IAMロールを選択または作成します
- 作成の完了
- 設定内容を確認し、「クラスターの作成」をクリックします
- 既存クラスターからの移行(必要な場合)
- アプリケーションのエンドポイントを新しいDAXクラスターに更新します
- 動作確認後、古いクラスターを削除します
Terraformでの修復手順
DAXクラスターの保管時暗号化を有効にするTerraformコードと、主要な修正ポイントを説明します。
# DAXクラスター用のIAMロール
resource "aws_iam_role" "dax_cluster" {
name = "dax-cluster-role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "dax.amazonaws.com"
}
}
]
})
}
# DAXクラスターのIAMポリシーアタッチ
resource "aws_iam_role_policy_attachment" "dax_cluster_policy" {
role = aws_iam_role.dax_cluster.name
policy_arn = "arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess"
}
# サブネットグループ
resource "aws_dax_subnet_group" "example" {
name = "example-dax-subnet-group"
subnet_ids = var.subnet_ids
}
# 暗号化が有効なDAXクラスター
resource "aws_dax_cluster" "example" {
cluster_name = "example-dax-cluster"
iam_role_arn = aws_iam_role.dax_cluster.arn
node_type = "dax.r4.large"
replication_factor = 3 # 本番環境では3以上を推奨(高可用性のため)
# 保管時暗号化の有効化(重要)
server_side_encryption {
enabled = true
# 注意: DAXではAWS管理キー(aws/dax)のみサポート
# カスタマー管理キー(CMK)は現在サポートされていません
}
subnet_group_name = aws_dax_subnet_group.example.name
# セキュリティグループ
security_group_ids = [aws_security_group.dax.id]
# パラメータグループ(オプション)
parameter_group_name = aws_dax_parameter_group.example.name
# 通知設定(推奨)
notification_topic_arn = aws_sns_topic.dax_notifications.arn
# メンテナンスウィンドウ(推奨)
preferred_maintenance_window = "sun:05:00-sun:06:00"
tags = {
Name = "example-dax-cluster"
Environment = "production"
Encrypted = "true"
Purpose = "DynamoDB-Cache"
}
# ライフサイクル設定(暗号化設定の変更を防ぐ)
lifecycle {
prevent_destroy = true
}
}
# パラメータグループの例
resource "aws_dax_parameter_group" "example" {
name = "example-dax-params"
parameters {
name = "query-ttl-millis"
value = "600000"
}
parameters {
name = "record-ttl-millis"
value = "300000"
}
}
# セキュリティグループの例
resource "aws_security_group" "dax" {
name_prefix = "dax-cluster-"
vpc_id = var.vpc_id
ingress {
from_port = 8111
to_port = 8111
protocol = "tcp"
cidr_blocks = [var.vpc_cidr]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
tags = {
Name = "dax-cluster-sg"
}
lifecycle {
create_before_destroy = true
}
}
# SNSトピック(アラート通知用)
resource "aws_sns_topic" "dax_notifications" {
name = "dax-cluster-notifications"
kms_master_key_id = "alias/aws/sns" # SNSトピックも暗号化
}
# CloudWatchアラーム(DAXクラスターの監視)
resource "aws_cloudwatch_metric_alarm" "dax_cpu" {
alarm_name = "dax-cluster-high-cpu"
comparison_operator = "GreaterThanThreshold"
evaluation_periods = "2"
metric_name = "CPUUtilization"
namespace = "AWS/DAX"
period = "300"
statistic = "Average"
threshold = "75"
alarm_description = "This metric monitors DAX cluster CPU utilization"
alarm_actions = [aws_sns_topic.dax_notifications.arn]
dimensions = {
ClusterName = aws_dax_cluster.example.cluster_name
}
}
# 既存の暗号化されていないクラスターから移行する場合の例
resource "null_resource" "migrate_to_encrypted_cluster" {
# 移行スクリプトの実行(例)
provisioner "local-exec" {
command = <<-EOT
echo "Migration steps:"
echo "1. Create new encrypted DAX cluster"
echo "2. Update application endpoint to new cluster"
echo "3. Monitor for errors"
echo "4. Delete old unencrypted cluster"
EOT
}
depends_on = [aws_dax_cluster.example]
}
最後に
この記事では、DynamoDB Accelerator クラスターの保管時暗号化設定手順について、リスクと対策を解説しました。
DAXクラスターの保管時暗号化は、作成時にのみ設定可能な重要なセキュリティ機能です。既存の非暗号化クラスターを使用している場合は、計画的な移行が必要となります。暗号化による性能への影響は最小限であり、データの機密性を確保する上で必須の設定と言えます。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。