16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TerraformでAurora Serverless v2を自動構築する

Last updated at Posted at 2022-04-23

はじめに

2022/4/22についにGAされた待望のAurora Serverless v2。
v1の弱点であるスケーラビリティを確保して瞬時にスケール可能という夢のようなDBインスタンスの登場だ。

だが、構築が難しくては意味がない。

今回は、2022/4/23時点でTerraform未対応のAurora Serverless v2を自動構築をして冪等性を高めてみる。
⇒ 2022/4/28に対応した。

なお、ベースとなるTerraformは過去の記事のものを流用している。
周辺リソースについては上記記事を参照していただきたい。

IaC(過去のバージョンのProviderを使う場合)

全体像としてはこのようになる。

################################################################################
# Aurora                                                                       #
################################################################################
resource "aws_rds_cluster" "example" {
  cluster_identifier                  = local.aurora_cluster_identifier
  engine                              = "aurora-postgresql"
  engine_version                      = "13.6"
  engine_mode                         = "provisioned"
  master_username                     = local.aurora_master_username
  master_password                     = local.aurora_master_password
  port                                = 5432
  database_name                       = local.aurora_database_name
  vpc_security_group_ids              = [aws_security_group.aurora.id]
  db_subnet_group_name                = aws_db_subnet_group.example.name
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.example.name

  skip_final_snapshot = true
  apply_immediately   = true
}

resource "aws_rds_cluster_instance" "example" {
  depends_on = [
    null_resource.aws_rds_cluster_add_serverless_v2_scaling_configuration,
  ]

  cluster_identifier = aws_rds_cluster.example.id
  identifier         = "${local.aurora_cluster_identifier}-serverless-instance"

  engine                  = aws_rds_cluster.example.engine
  engine_version          = aws_rds_cluster.example.engine_version
  instance_class          = "db.serverless"
  db_subnet_group_name    = aws_db_subnet_group.example.name
  db_parameter_group_name = aws_db_parameter_group.example.name

  monitoring_role_arn = aws_iam_role.aurora_monitoring.arn
  monitoring_interval = 60

  publicly_accessible = true
}

resource "aws_db_subnet_group" "example" {
  name       = local.db_subnet_group_name
  subnet_ids = data.aws_subnet_ids.my_vpc.ids
}

resource "aws_rds_cluster_parameter_group" "example" {
  name   = local.rdscluster_parameter_group_name
  family = "aurora-postgresql13"
}

resource "aws_db_parameter_group" "example" {
  name   = local.db_parameter_group_name
  family = "aurora-postgresql13"

  parameter {
    apply_method = "pending-reboot"
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_hint_plan"
  }
}

################################################################################
# Modify DB Cluster                                                            #
#   Add Serverless v2 Scaling Configuration                                    #
################################################################################
resource "null_resource" "aws_rds_cluster_add_serverless_v2_scaling_configuration" {
  depends_on = [
    aws_rds_cluster.example,
  ]

  provisioner "local-exec" {
    command = <<-EOF
      aws rds modify-db-cluster \
        --db-cluster-identifier ${aws_rds_cluster.example.cluster_identifier} \
        --serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=1
    EOF

    on_failure = fail
  }
}

Aurora Serverless v1は、クラスタ全体でサーバレスにするため、aws_rds_clusterengine_mode = "serverless"で構築するが、v2の場合はインスタンスとして扱われるため、engine_mode = "provisioned"で構築し、aws_rds_cluster_instanceinstance_class = "db.serverless"を指定する。

ただし、上記を指定するためには、クラスタに

CLIの実行結果抜粋
        "ServerlessV2ScalingConfiguration": {
            "MinCapacity": 0.5,
            "MaxCapacity": 1.0
        }

のようにServerlessV2ScalingConfigurationが設定されていないといけないため、

aws_rds_cluster

null_resource(CLI実行)

aws_rds_cluster_instance

の順で作成するようにdepends_onの指定をした。

現在はちょっと捻ったことをしないと構築できないが、じきにTerraformが対応したらaws_rds_clusterで指定ができるようになるだろう。
⇒ 2022/4/28にTerraformがAWS Providerバージョン4.12.0で、serverlessv2_scaling_configurationに対応したので追記。

IaC(AWS Providerバージョン4.12.0以降を扱う場合)

以下のブロックを追記すれば、CLIの呼び出しが不要になる。

################################################################################
# Aurora                                                                       #
################################################################################
resource "aws_rds_cluster" "example" {
  cluster_identifier                  = local.aurora_cluster_identifier
  engine                              = "aurora-postgresql"
  engine_version                      = "13.6"
  engine_mode                         = "provisioned"
  master_username                     = local.aurora_master_username
  master_password                     = local.aurora_master_password
  port                                = 5432
  database_name                       = local.aurora_database_name
  vpc_security_group_ids              = [aws_security_group.aurora.id]
  db_subnet_group_name                = aws_db_subnet_group.example.name
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.example.name
  iam_database_authentication_enabled = true

+  serverlessv2_scaling_configuration {
+    min_capacity = 0.5
+    max_capacity = 1.0
+  }

  skip_final_snapshot = true
  apply_immediately   = true

  tags = {
    Name = "r-kubota"
  }
}

resource "aws_rds_cluster_instance" "example" {
  cluster_identifier = aws_rds_cluster.example.id
  identifier         = "${local.aurora_cluster_identifier}-serverless-instance"

  engine                  = aws_rds_cluster.example.engine
  engine_version          = aws_rds_cluster.example.engine_version
  instance_class          = "db.serverless"
  db_subnet_group_name    = aws_db_subnet_group.example.name
  db_parameter_group_name = aws_db_parameter_group.example.name

  monitoring_role_arn = aws_iam_role.aurora_monitoring.arn
  monitoring_interval = 60

  publicly_accessible = true
}

resource "aws_db_subnet_group" "example" {
  name       = local.db_subnet_group_name
  subnet_ids = data.aws_subnet_ids.my_vpc.ids

  tags = {
    Name = "r-kubota"
  }
}

resource "aws_rds_cluster_parameter_group" "example" {
  name   = local.rdscluster_parameter_group_name
  family = "aurora-postgresql13"

  tags = {
    Name = "r-kubota"
  }
}

resource "aws_db_parameter_group" "example" {
  name   = local.db_parameter_group_name
  family = "aurora-postgresql13"

  parameter {
    apply_method = "pending-reboot"
    name         = "shared_preload_libraries"
    value        = "pg_stat_statements,pg_hint_plan"
  }
}

これで、よりスケーラブルなサーバレス構成を組むことができるようになった!

16
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?