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クラスターを起動させると費用の節約になります。
- Aurora Serverless v1には
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"
}
}
参考