Open3

【Terraform】分析用リードレプリカの作り方

TocyukiTocyuki

TerraformでAuroraの分析用リードレプリカを作るコードについてメモ

resource "aws_rds_cluster" "db" {
  cluster_identifier              = "${var.name}-${var.env}-${var.service}-db-cluster"
  engine_mode                     = var.engine_mode
  engine                          = var.engine
  engine_version                  = var.engine_version
  availability_zones              = values(var.azs)[*]
  db_subnet_group_name            = aws_db_subnet_group.db.name
  db_cluster_parameter_group_name = aws_rds_cluster_parameter_group.db.name
  vpc_security_group_ids          = [aws_security_group.db.id]
  master_username                 = aws_ssm_parameter.db_username.value
  master_password                 = aws_ssm_parameter.db_password.value
  backup_retention_period         = var.backup_retention_period
  preferred_backup_window         = var.preferred_backup_window
  skip_final_snapshot             = true
  apply_immediately               = true

  lifecycle {
    ignore_changes = [
      master_password,
      availability_zones
    ]
  }

  tags = merge(var.common_tags, {
    Name = "${var.name}-${var.env}-${var.service}-db-cluster"
    Role = "RDS"
  })
}

resource "aws_rds_cluster_instance" "db" {
  count = length(var.azs)

  cluster_identifier      = aws_rds_cluster.db.id
  identifier              = "${var.name}-${var.env}-${var.service}-db-instance-${format("%02d", count.index + 1)}"
  db_subnet_group_name    = aws_db_subnet_group.db.name
  db_parameter_group_name = aws_db_parameter_group.db.name
  instance_class          = var.instance_class
  engine                  = var.engine
  engine_version          = var.engine_version
  apply_immediately       = true
}

resource "aws_rds_cluster_instance" "analysis" {
  cluster_identifier      = aws_rds_cluster.db.id
  identifier              = "${var.name}-${var.env}-${var.service}-db-instance-analysis"
  db_subnet_group_name    = aws_db_subnet_group.db.name
  db_parameter_group_name = aws_db_parameter_group.db.name
  instance_class          = var.instance_class
  engine                  = var.engine
  engine_version          = var.engine_version
  apply_immediately       = true
  promotion_tier          = 10
  depends_on              = [aws_rds_cluster_instance.db]
}

resource "aws_rds_cluster_endpoint" "analysis" {
  cluster_identifier          = aws_rds_cluster.db.id
  cluster_endpoint_identifier = "${var.name}-${var.env}-${var.service}-analysis"
  custom_endpoint_type        = "READER"

  static_members = [
    aws_rds_cluster_instance.analysis.id,
  ]
}

resource "aws_rds_cluster_endpoint" "reader" {
  cluster_identifier          = aws_rds_cluster.db.id
  cluster_endpoint_identifier = "${var.name}-${var.env}-${var.service}-reader"
  custom_endpoint_type        = "READER"

  excluded_members = [
    aws_rds_cluster_instance.analysis.id,
  ]
}
TocyukiTocyuki

他のモジュールで使えるようにoutputする

output "contents_db_reader_endpoint" {
  value = aws_rds_cluster_endpoint.reader.endpoint
}

output "contents_db_analysis_endpoint" {
  value = aws_rds_cluster_endpoint.analysis.endpoint
}