RDS

MySQLのパラメターグループ

resource "aws_db_parameter_group" "example" {
  name   = "example"
  family = "mysql5.7" <========== ファミリーはengine:vertionを合わせた値

  parameter {
    name  = "character_set_database"
    value = "utf8mb4"
  }

  parameter {
    name  = "character_set_server"
    value = "utf8mb4"
  }
}

DBのオプショングループ

resource "aws_db_option_group" "example" {
  name                 = "example"
  engine_name          = "mysql"
  major_engine_version = "5.7"

  option {
    option_name = "MARIADB_AUDIT_PLUGIN" <========= これはユーザーのログオンや実行したクエリのアクティビティを記録するための別のDB
  }
}

DB専用のサブネットグループ

  • サブネットはプライベートを選択する
  • multi AZなので、複数のprivate subnetを選択する
resource "aws_db_subnet_group" "example" {
  name       = "example"
  subnet_ids = [aws_subnet.private_0.id, aws_subnet.private_1.id]
}

DBインスタンスの定義

resource "aws_db_instance" "example" {
  identifier                 = "example" <============ DBのエンドポイントで使う識別子
  engine                     = "mysql"
  engine_version             = "5.7.23"
  instance_class             = "db.t3.small"
  allocated_storage          = 20
  storage_type               = "gp2" <===== 汎用SSDかプロビジョン度IOPS。gp2は汎用SSD
  storage_encrypted          = true
  kms_key_id                 = aws_kms_key.example.arn <========== これを設定すると、DISK暗号化が有効になる。
  username                   = "admin" 
  password                   = "VeryStrongPassword!" <===== これは例えvariableにしても、平文でtfstateに書き込まれてしまう。。。
  multi_az                   = true <==== multi_azの有効化、無論subnet_groupで複数のAZのサブネットを有効化する必要がある。
  publicly_accessible        = false
  backup_window              = "09:10-09:40" <====== RDSの毎日のバックアップのタイミング(UTC)、maintenance_windowの前に設定すると安心感がある
  backup_retention_period    = 30 <======== バックアップ保存期間。最大は35
  maintenance_window         = "mon:10:10-mon:10:40"  <===== メンテナンスタイミング(UTC)
  auto_minor_version_upgrade = false <===== マイナーバージョンのアップグレードを無効化
  deletion_protection        = true  <============= 削除保護
  skip_final_snapshot        = false <================ インスタンス削除時にスナップショットを作成するため、これはfalse
  port                       = 3306 <====== mysqlのデフォは3306
  apply_immediately          = false <========= 一部の変更は再起動が必要なので、即時に変更はかけない(=メンテナンスウィンドウにかけられる)
  vpc_security_group_ids     = [module.mysql_sg.security_group_id]  <==== RDSインスタンスのセキュリティグループ
  parameter_group_name       = aws_db_parameter_group.example.name
  option_group_name          = aws_db_option_group.example.name
  db_subnet_group_name       = aws_db_subnet_group.example.name

  lifecycle {
    ignore_changes = [password]  <====== 上のpasswordは平文でtfに管理されてしまうため。無視する
  }
}

上の場合は、gitやtfにPWを管理させないので、aws cliで自分で更新する必要がある。

RDSのセキュリティグループ

module "mysql_sg" {
  source      = "./security_group"
  name        = "mysql-sg"
  vpc_id      = aws_vpc.example.id
  port        = 3306
  cidr_blocks = [aws_vpc.example.cidr_block]
}

ElasticCache(redis)のインスタンス化

resource "aws_elasticache_parameter_group" "example" {
  name   = "example"
  family = "redis5.0" <==== redisを使う

  parameter {
    name  = "cluster-enabled"
    value = "no"
  }
}

ElasticCacheサブネットグループ

resource "aws_elasticache_subnet_group" "example" {
  name       = "example"
  subnet_ids = [aws_subnet.private_0.id, aws_subnet.private_1.id]
}

ElasticCacheのインスタンス

resource "aws_elasticache_replication_group" "example" {
  replication_group_id          = "example"
  replication_group_description = "Cluster Disabled"
  engine                        = "redis"
  engine_version                = "5.0.3"
  number_cache_clusters         = 3
  node_type                     = "cache.m3.medium"
  snapshot_window               = "09:10-10:10"
  snapshot_retention_limit      = 7
  maintenance_window            = "mon:10:40-mon:11:40"
  automatic_failover_enabled    = true
  port                          = 6379
  apply_immediately             = false
  security_group_ids            = [module.redis_sg.security_group_id]
  parameter_group_name          = aws_elasticache_parameter_group.example.name
  subnet_group_name             = aws_elasticache_subnet_group.example.name
}

ElasticCacheのSG

module "redis_sg" {
  source      = "./security_group"
  name        = "redis-sg"
  vpc_id      = aws_vpc.example.id
  port        = 6379
  cidr_blocks = [aws_vpc.example.cidr_block]
}