見出し画像

ちょっとマニアックなterraform RDSの設定

長くなってきてるのでDB部分だけ分離した。

resource "aws_security_group" "rds_sg" {
  # RDS 用セキュリティグループ
  vpc_id = aws_vpc.main.id

  # インバウンドルール(MySQL 接続を許可)
  ingress {
    from_port       = 3306
    to_port         = 3306
    protocol        = "tcp"
    security_groups = [aws_default_security_group.default.id]
  }

  # アウトバウンドルール(全トラフィック許可)
  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "RDS Security Group"
  }
}

resource "aws_db_subnet_group" "db_subnet_group_private" {
  # プライベートサブネットグループ
  name       = "private-db-subnet-group"
  subnet_ids = values(aws_subnet.private_subnet)[*].id

  lifecycle {
    create_before_destroy = true
  }

  tags = {
    Name = "Private DB Subnet Group"
  }
}

resource "aws_db_instance" "mysql" {
  # RDS インスタンス
  identifier             = "exampledb-instance"
  allocated_storage      = 20
  engine                 = "mysql"
  engine_version         = "8.0"
  instance_class         = "db.t4g.micro"
  db_name                = "exampledb"
  username               = "admin"
  password               = "securepassword123!"
  publicly_accessible    = false
  vpc_security_group_ids = [aws_security_group.rds_sg.id]
  db_subnet_group_name   = aws_db_subnet_group.db_subnet_group_private.name
  skip_final_snapshot    = true

  tags = {
    Name = "Private RDS MySQL Instance"
  }
}

パスワードをパラメーターストアに移動する

さすがに

password = "securepassword123!"

はあんまよくないだろみたいな

resource "random_password" "db_pass" {
  length  = 16    # パスワードの長さ
  special = false # 特殊文字を含めない(必要なら true)
}

こんな感じでランダムなパスワードを作っといた。登録すると

こんな感じでパラメータストアに登録される。どういうパスワードがセットされたんかは上記のスクショのように、パラメータストアにアクセスして複合してみる事

パラメーターグループ

DBの設定を弄るのにほぼ必須。パラメータを操作しないのであってもこれを脳死状態で作っておく事。

# RDS パラメーターグループ
resource "aws_db_parameter_group" "mysql_params" {
  name   = "custom-mysql-params"
  family = "mysql8.0" # MySQL 8.0 に対応したパラメーターグループ

  #parameter {
  #  name  = "slow_query_log"
  #  value = "1" # スロークエリログを有効化
  #}
  #
  #parameter {
  #  name  = "long_query_time"
  #  value = "1" # スロークエリとみなす時間を1秒に設定
  #}


  tags = {
    Name = "Custom MySQL Parameter Group"
  }
}

スロークエリーとかは後でやるかもしれんけど、まあこんな感じで設定を置いていく。これを本体に適用する

resource "aws_db_instance" "mysql" {
  # RDS インスタンス
  identifier             = "exampledb-instance"
  allocated_storage      = 20
  engine                 = "mysql"
  engine_version         = "8.0"
  instance_class         = "db.t4g.micro"
  db_name                = "exampledb"
  username               = "admin"
  password               = aws_ssm_parameter.db_pass.value
  publicly_accessible    = false
  vpc_security_group_ids = [aws_security_group.rds_sg.id]
  db_subnet_group_name   = aws_db_subnet_group.db_subnet_group_private.name
  skip_final_snapshot    = true
 
  # これ
  parameter_group_name   = aws_db_parameter_group.mysql_params.name

  tags = {
    Name = "Private RDS MySQL Instance"
  }
}

Performance Insights

resource "aws_db_instance" "mysql" {
  # RDS インスタンス
  identifier             = "exampledb-instance"

...
  performance_insights_enabled = true

みたいなのを付ける、といいたい所ではあるが、これが使えるのはmedium以上だったりするのでT系のmicroとかsmallとかでは使えない

resource "aws_db_instance" "mysql" {
  # RDS インスタンス
  identifier        = "exampledb-instance"
  allocated_storage = 20
  engine            = "mysql"
  engine_version    = "8.0"
  #instance_class               = "db.t4g.micro"
  instance_class               = "db.t4g.medium"
  db_name                      = "exampledb"
  username                     = "admin"
  password                     = aws_ssm_parameter.db_pass.value
  publicly_accessible          = false
  vpc_security_group_ids       = [aws_security_group.rds_sg.id]
  db_subnet_group_name         = aws_db_subnet_group.db_subnet_group_private.name
  skip_final_snapshot          = true
  parameter_group_name         = aws_db_parameter_group.mysql_params.name
  performance_insights_enabled = true

Performance Insightsについては別項で細かく見てみ、る、かも


#aws #terraform

いいなと思ったら応援しよう!