Traffine I/O

日本語

2022-10-02

Aurora Serverless v1 と v2 について

Amazon Aurora とは

Amazon Auroraとは、AWSが独自に開発したMySQLとPostgreSQLと互換性のあるリレーショナルデータベースです。AWSによると、AuroraはMySQLの最大5倍、PostgreSQLの最大3倍の性能を誇るそうで、AmazonのECサイトやNetflixなど有名なサービスでも利用されています。

Auroraはクラスターという単位で構成されており、クラスター内には1つ以上のDBサーバーで構成されるインスタンス層とデータを管理するストレージ層の2層で構成されており、インスタンスとストレージが分離しています。このアーキテクチャにより、ネットワーク障害やディスク破損などの際にもデータベースへの影響がなくなるため、可用性に優れています。

Aurora Serverless とは

Aurora Serverlessとは、DBインスタンスのスケーリング管理が不要なAmazon Auroraです。Aurora Serverlessに来たリクエスト量に合わせて自動的に起動、シャットダウン、スケールアップ、スケールダウンしてくれます。スケーリングの性能を表す単位をACU(Aurora Capacity Unit)といい、1ACUが約2GBのメモリに相当します。

Aurora Serverless v1 と v2 の比較

Aurora Serverlessにはv1とv2があります。v1は2018年10月に正式版になり、v2は2022年4月に正式版となりました。以下がv1とv2の比較表になります。

Aurora Serverless v1 Aurora Serverless v2
ACU 最小:1 ACU、最大:128 ACU 最小:0.5 ACU、最大:256 ACU
料金 1 ACU あたり 0.10 USD/時間 1ACU あたり 0.20 USD/時間
クラスター Serverless Provisioned
DB インスタンス Serverless インスタンス Serverless インスタンス、Provisioned インスタンス
マルチ AZ 機能 なし あり
自動停止機能 あり なし
Data API 利用 可能 不可
RDS Proxy 利用 不可 可能
クエリ中の自動スケーリング 不可 可能

v1とv2はバージョンは一つ違うだけですが、かなり大きな仕様の変更が入っています。特にクラスターとDBインスタンスの管理が全く異なっており、v2になってできなくなることもあります。v1とv2はそれぞれ別のサービスと考えた方が良さそうです。

v2で使えなくなる機能として次の2点を紹介します。

  • Data API
    • Aurora Serverless v1はData APIを使って他のサーバーレスサービスとの連携することができます。Data APIを使うことにより、APIの通信はHTTPSで行われるため、DBに直接接続しなくて済みます。従来のRDBMSであれば、トラフィックが多くなりコネクション数の上限に達すると通信ができなくなってしまうこともあるかと思いますが、HTTPSであればコネクション数の上限といったボトルネックはなく、アプリケーションの拡張性に一層柔軟に対応可能です。
  • 一時停止機能
    • Aurora Serverless v1にはauto_pauseという設定項目があり、接続が無い状態が一定時間経過すると、DBが一時停止状態となり、DBインスタンスの料金がかかりません。ただし、停止後の立ち上がりに1分程度時間がかかります。例えば平日の6:00 ~ 21:00の間は自動停止を回避し,それ以外(土日など)は0 ACUとなるようにEventBridgeでLambdaを定期実行してAuroraクラスターを起動させると費用の節約になります。

Serverless v1 のユースケース

Aurora Serverless v1は次のようなユースケースに向いています。

  • 不定期使用のアプリケーションや開発データベース
    v1では自動停止機能により不使用時にDBサーバーを自動シャットダウンすることができます。シャットダウン時は0ACUとなり、ストレージに料金しかかからなくなるのでコスト面で有利です。

Serverless v2 のユースケース

Aurora Serverless v2は次のようなユースケースに向いています。

  • 本番環境での予測困難なワークロード
    自動でスケールング機能により、必要なインスタンスサイズやトラフィックが予想しづらい場合に便利です。

v1にも自動スケーリング機能があるのですが、v1は次の点で本番環境での利用は向いていません。

  • マルチAZ機能がないため、可用性や耐障害性に懸念がある
  • トランザクション実行中やテーブルロック中は自動スケーリングができない

Serverless v1 の Terraform での構築例

以下にAurora Serverless v1のTerraformコード例を紹介します。

resource "aws_rds_cluster" "main" {
  cluster_identifier                  = local.aurora_cluster_identifier
  database_name                       = local.aurora_database_name
  master_username                     = local.aurora_master_username
  master_password                     = local.aurora_master_password
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.main.name
  db_subnet_group_name                = data.aws_db_subnet_group.main.name
  deletion_protection                 = true
  skip_final_snapshot                 = false
  engine                              = "aurora-mysql"
  engine_version                      = "5.7.mysql_aurora.2.07.1"
  engine_mode                         = "serverless"
  backup_retention_period             = 7
  storage_encrypted                   = true
  iam_database_authentication_enabled = false
  enable_http_endpoint                = true

  scaling_configuration {
    min_capacity = 2
    max_capacity = 256
    auto_pause   = true
  }

  lifecycle {
    ignore_changes = [
      availability_zones,
      engine_version,
      master_username,
      master_password,
    ]
  }
}

resource "aws_rds_cluster_parameter_group" "main" {
  name        = "cluster-pg"
  family      = "aurora-mysql5.7"
  description = "RDS cluster parameter group"
  parameter {
    name  = "character_set_server"
    value = "utf8"
  }
  parameter {
    name  = "character_set_client"
    value = "utf8"
  }
  parameter {
    apply_method = "immediate"
    name         = "server_audit_events"
    value        = "QUERY"
  }
  parameter {
    apply_method = "immediate"
    name         = "server_audit_logging"
    value        = "1"
  }
  parameter {
    apply_method = "immediate"
    name         = "time_zone"
    value        = "Asia/Tokyo"
  }
}

resource "random_password" "main" {
  length           = 16
  special          = true
  override_special = "_!%^"
}

Serverless v2 の Terraform での構築例

以下にAurora Serverless v2のTerraformコード例を紹介します。

resource "aws_rds_cluster" "main" {
  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.main.name
  db_cluster_parameter_group_name     = aws_rds_cluster_parameter_group.main.name
  iam_database_authentication_enabled = true

  serverlessv2_scaling_configuration {
    min_capacity = 0.5
    max_capacity = 1.0
  }

  skip_final_snapshot = true
  apply_immediately   = true
}

resource "aws_rds_cluster_instance" "main" {
  cluster_identifier = aws_rds_cluster.main.id
  identifier         = "${local.aurora_cluster_identifier}-serverless-instance"
  engine                  = aws_rds_cluster.main.engine
  engine_version          = aws_rds_cluster.main.engine_version
  instance_class          = "db.serverless"
  db_subnet_group_name    = aws_db_subnet_group.main.name
  db_parameter_group_name = aws_db_parameter_group.main.name

  monitoring_role_arn = aws_iam_role.aurora_monitoring.arn
  monitoring_interval = 60

  publicly_accessible = true
}

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

resource "aws_rds_cluster_parameter_group" "main" {
  name   = local.cluster_parameter_group_name
  family = "aurora-postgresql13"
}

resource "aws_db_parameter_group" "main" {
  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"
  }
}

参考

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless.html
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/CHAP_AuroraOverview.html
https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/rds_cluster

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!