RDS/Aurora DBクラスターのマルチAZ構成の設定について

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

この記事では、RDS DBクラスターおよびAurora DBクラスターのマルチAZ構成について、リスクと対策を解説します。

ポリシーの説明

すべてのRDS DBクラスターおよびAurora DBクラスターをマルチAZ(アベイラビリティーゾーン)で構成してください。これにより、単一AZの障害時でもデータベースの可用性を維持できます。自動フェイルオーバー設定を確認し、定期的にフェイルオーバーテストを実施してください。

修復方法

コンソールでの修復手順

Aurora DBクラスターの場合

  1. AWSマネジメントコンソールにログインし、「RDS」サービスに移動します
  2. 左側のナビゲーションペインから「データベース」を選択します
  3. 対象のAuroraクラスターを選択し可用性と耐久性でマルチAZ配置を有効化します

RDS DBクラスター(Aurora以外)の場合

  1. AWSマネジメントコンソールにログインし、「RDS」サービスに移動します
  2. 左側のナビゲーションペインから「データベース」を選択します
  3. 対象のDBインスタンスを選択します
  4. 「アクション」メニューから「変更」を選択します
  5. 「可用性と耐久性」セクションで「マルチAZ配置」を「はい」に設定します
  1. 「DBインスタンスの変更」をクリックし、変更のタイミングを選択します:
    • 「すぐに適用」: 即座に変更を適用(ダウンタイムが発生する可能性があります)
    • 「次のメンテナンスウィンドウ中に適用」: 計画的な適用(推奨)

Terraformでの修復手順

Aurora DBクラスターのマルチAZ構成

# DBサブネットグループ(複数AZにまたがる)
resource "aws_db_subnet_group" "aurora_subnet_group" {
  name       = "aurora-subnet-group"
  subnet_ids = [
    aws_subnet.private_subnet_az1.id,  # AZ-1のサブネット
    aws_subnet.private_subnet_az2.id,  # AZ-2のサブネット
    aws_subnet.private_subnet_az3.id   # AZ-3のサブネット
  ]

  tags = {
    Name = "Aurora DB subnet group"
  }
}

# Aurora DBクラスター
resource "aws_rds_cluster" "aurora_cluster" {
  cluster_identifier      = "my-aurora-cluster"
  engine                  = "aurora-mysql"
  engine_version          = "8.0.mysql_aurora.3.02.0"
  availability_zones      = ["us-west-2a", "us-west-2b", "us-west-2c"]
  database_name           = "mydb"
  master_username         = "admin"
  master_password         = var.db_password  # Secrets Managerから取得推奨
  db_subnet_group_name    = aws_db_subnet_group.aurora_subnet_group.name

  # 高可用性とセキュリティ設定
  backup_retention_period = 7
  preferred_backup_window = "03:00-04:00"
  preferred_maintenance_window = "sun:04:00-sun:05:00"
  storage_encrypted       = true
  kms_key_id             = aws_kms_key.rds_key.arn
  deletion_protection     = true
  enabled_cloudwatch_logs_exports = ["audit", "error", "general", "slowquery"]

  tags = {
    Name        = "Production Aurora Cluster"
    Environment = "production"
  }
}

# Aurora インスタンス(Writer)
resource "aws_rds_cluster_instance" "aurora_writer" {
  identifier              = "aurora-writer"
  cluster_identifier      = aws_rds_cluster.aurora_cluster.id
  instance_class          = "db.r6g.large"
  engine                  = aws_rds_cluster.aurora_cluster.engine
  engine_version          = aws_rds_cluster.aurora_cluster.engine_version
  availability_zone       = "us-west-2a"

  performance_insights_enabled = true
  monitoring_interval         = 60
  monitoring_role_arn        = aws_iam_role.rds_enhanced_monitoring.arn
}

# Aurora インスタンス(Reader 1)
resource "aws_rds_cluster_instance" "aurora_reader_1" {
  identifier              = "aurora-reader-1"
  cluster_identifier      = aws_rds_cluster.aurora_cluster.id
  instance_class          = "db.r6g.large"
  engine                  = aws_rds_cluster.aurora_cluster.engine
  engine_version          = aws_rds_cluster.aurora_cluster.engine_version
  availability_zone       = "us-west-2b"  # 異なるAZ

  performance_insights_enabled = true
  monitoring_interval         = 60
  monitoring_role_arn        = aws_iam_role.rds_enhanced_monitoring.arn
}

# Aurora インスタンス(Reader 2)
resource "aws_rds_cluster_instance" "aurora_reader_2" {
  identifier              = "aurora-reader-2"
  cluster_identifier      = aws_rds_cluster.aurora_cluster.id
  instance_class          = "db.r6g.large"
  engine                  = aws_rds_cluster.aurora_cluster.engine
  engine_version          = aws_rds_cluster.aurora_cluster.engine_version
  availability_zone       = "us-west-2c"  # さらに異なるAZ

  performance_insights_enabled = true
  monitoring_interval         = 60
  monitoring_role_arn        = aws_iam_role.rds_enhanced_monitoring.arn
}

 

RDS DBインスタンス(非Aurora)のマルチAZ構成

resource "aws_db_instance" "rds_instance" {
  identifier             = "my-rds-instance"
  engine                 = "mysql"
  engine_version         = "8.0.35"
  instance_class         = "db.t3.medium"
  allocated_storage      = 100
  storage_type           = "gp3"
  storage_encrypted      = true
  kms_key_id            = aws_kms_key.rds_key.arn

  # マルチAZ設定
  multi_az               = true  # これが重要

  db_name                = "mydb"
  username               = "admin"
  password               = var.db_password
  db_subnet_group_name   = aws_db_subnet_group.rds_subnet_group.name
  vpc_security_group_ids = [aws_security_group.rds_sg.id]

  # バックアップ設定
  backup_retention_period = 7
  backup_window          = "03:00-04:00"
  maintenance_window     = "sun:04:00-sun:05:00"

  # その他の重要設定
  deletion_protection    = true
  skip_final_snapshot    = false
  final_snapshot_identifier = "${var.identifier}-final-snapshot-${formatdate("YYYY-MM-DD-hhmm", timestamp())}"

  # モニタリング
  enabled_cloudwatch_logs_exports = ["error", "general", "slowquery"]
  performance_insights_enabled     = true
  monitoring_interval             = 60
  monitoring_role_arn            = aws_iam_role.rds_enhanced_monitoring.arn

  tags = {
    Name        = "Production RDS Instance"
    Environment = "production"
  }
}

 

ベストプラクティス

  1. 最小構成の推奨:
    • Aurora: Writer 1台 + Reader 2台以上(異なるAZに配置)
    • RDS: マルチAZ有効化(自動的にスタンバイが別AZに作成)
  2. コスト最適化:
    • 開発環境では単一AZで運用し、本番環境のみマルチAZ構成とする
    • Aurora Serverless v2の使用を検討(自動スケーリングでコスト最適化)
  3. 監視とアラート:
    • CloudWatchでフェイルオーバーイベントを監視
    • レプリケーションラグをモニタリング
    • 定期的な接続テストの実施
  4. ドキュメント化:
    • フェイルオーバー手順書の作成
    • RTO/RPO目標の明文化
    • 緊急時連絡先リストの維持

まとめ

この記事では、RDS/Aurora DBクラスターのマルチAZ構成について、詳細なリスク分析と具体的な修復手順を解説しました。マルチAZ構成は、高可用性を実現するための最も基本的かつ重要な設定です。

この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。 運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。 最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。

参考資料

この記事をシェアする

クラウドセキュリティ対策実践集一覧へ戻る

貴社の利用状況に合わせた見積もりを作成します。

料金プランを詳しく見る