Amazon Aurora・Aurora Serverlessとは？

# はじめに
SAAの資格勉強を行っていく中でAuroraやAurora Serverlessについての理解があいまいだと感じました。
データベースの企業に勤めていることもあり、AuroraやAurora Serverlessについての知識が必要だと感じたためまとめてみました。初見でよくわからなかった用語もまとめました。


# Amazon Auroraとは
Amazon Aurora(オーロラ)とは、AWSが提供する高性能・高可用性のフルマネージド型リレーショナルデータベース（RDB）サービス 。 PostgreSQL、MySQL、DSQL に対応している。
MySQLおよびPostgreSQLについては従来のRDSデータベースよりもMySQLでは5倍、PostgreSQLでは3倍のスループット（転送できるデータ量）を[発揮できる](https://aws.amazon.com/jp/rds/aurora/)とのこと。

### DSQLとは？？
PostgreSQLと互換性のあるAWSの提供するSQL。（完全互換ではない）


# Amazon Aurora のアーキテクチャ
Auroraのストレージは、3つのアベイラビリティゾーン（AZ）に6つのコピーで分散されたデータを保持する分散型ストレージシステムを使用している。
これによりデータは分散保存され、1つのAZで障害が発生しても問題なく運用可能。
Amazon Auroraのデータベースクラスターには「プライマリ（Writer）DBインスタンス」と「Auroraレプリカ（Reader DBインスタンス）」という2種類のデータベースインスタンスがある。


## プライマリ（Writer）DBインスタンス
各Aurora DB クラスター内に1つのみ存在する読み取りと書き込みの両方をサポートするインスタンス。
すべてのデータ変更トランザクション（INSERT、UPDATE、DELETE文など）はこのインスタンスを通して処理される

## Auroraレプリカ（Reader DBインスタンス）
Auroraレプリカは読み取り操作（SELECT文）のみをサポートする。
各Aurora DB クラスター内に最大15個までリードレプリカを作成できる。

### Aurora リーダーエンドポイント
Aurora リーダーエンドポイントはAurora DBクラスター内の利用可能なすべての Aurora レプリカに接続するための単一のエンドポイント。このエンドポイントは、クラスター内のレプリカインスタンス間で読み取りワークロードを分散させる負荷分散機能を提供する。


# Amazon Aurora の自動スケーリング
データベースの読み取りワークロードの変化に応じて、Aurora レプリカの数を自動的に調整する機能をAmazon Auroraは持っている。これをAurora Auto Scalingという。
もちろん、ワークロードが減少すると、Aurora Auto Scaling は不要な Aurora レプリカを削除するため未使用の DB インスタンスに対して料金が発生することはない。Aurora Auto Scalingを使う際にはAurora リーダーエンドポイントを使用することが[推奨](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.Integrating.AutoScaling.html)されている。

# Aurora Serverlessとは
Amazon Auroraの一種。運用モデルがAuroraと異なる。
大きな特徴としてデータベース容量の手動プロビジョニング（リソースの確保や設定、管理）が不要で、使用量に応じて自動的にスケールする特徴がある。

## Amazon Auroraの場合
事前にリソースを確保して提供するモデル。（これをプロビジョンドとよぶ）
・インスタンスベース: 特定のインスタンスタイプ（db.r6g.largeなど）を選択し、固定の処理能力を確保
・手動スケーリング: 処理能力の変更には手動での操作（インスタンスタイプの変更）が必要
・一貫したパフォーマンス: 常に同じ処理能力を確保できる
・料金体系: 稼働している時間に対して固定料金を支払う

## Aurora Serverless
サーバー（この場合はデータベースインスタンス）の管理が不要なモデル。
以下Aurora Serverlessの特徴。
・自動スケーリング: ワークロードに応じて自動的にスケールアップ/ダウン
・容量単位ベース: ACU単位で測定される処理能力
・使用量ベースの課金: 実際に使用したリソース（ACU時間）に対してのみ課金
・管理の簡素化: キャパシティプランニングが不要

### ACU (Aurora Capacity Unit)
ACUはAurora Serverlessの処理能力を測定する単位。
1 ACUは約2GBのメモリと対応するCPUとネットワーク
ACU-秒という単位で使用量が計測され、課金される


# Amazon Aurora とAurora Serverlessの使い分け
料金体系の違いからAmazon Aurora とAurora Serverlessが使い分けされる。

Amazon Auroraの場合、インスタンスタイプに応じた固定料金が時間単位で発生し、稼働時間全体に対して支払いが必要となる。つまり、実際の使用状況に関わらず、プロビジョニングしたリソースに対して常に料金が発生する。

Aurora Serverlessの場合、実際に使用したACU（Aurora Capacity Unit）時間に応じた従量課金となり、データベースが実際に処理するワークロードに合わせて秒単位で課金される。使用していない時間帯や低負荷時には自動的にスケールダウンするため、リソース使用率に合わせた最適な支払いとなる。

そのため、Amazon Aurora とAurora Serverlessが適しているケースは以下のようになる。
## Amazon Auroraが適しているケース

・予測可能で安定したワークロード: トラフィックパターンが比較的安定しており、必要なリソースが予測できる場合
・常時高負荷の本番環境: 継続的に高いパフォーマンスが必要な重要なワークロード
特定のインスタンスタイプの機能が必要: メモリ最適化インスタンスなど、特定のインスタンスタイプの特性が必要な場合
・すべての高度な機能を使用したい: Aurora の全機能（パラレルクエリなど）を利用したい場合
・長期的なコスト予測: 固定費用でのリソース確保が予算計画に適している場合

## Aurora Serverlessが適しているケース

・変動が大きく予測困難なワークロード: 使用量が時間帯や日によって大きく変動する場合
・開発・テスト環境: 常時フル稼働しない環境
・間欠的な使用: 一日に数回のみ高負荷になるアプリケーション
・新規サービス: トラフィックパターンが未確定な新しいアプリケーション
・コスト最適化: 使用したリソースに対してのみ支払いたい場合
・運用負荷の軽減: キャパシティプランニングやスケーリング管理の工数を削減したい場合
・マルチテナント環境: 各テナントの使用量が大きく異なり、予測が難しい場合


# Aurora Auto Scaling と Aurora Serverlessの違い

Aurora Auto ScalingとAurora Serverlessは、どちらもAWSが提供する自動スケーリング機能だがその仕組みと適用対象が大きく異なる。Aurora Auto Scalingはプロビジョンド型Auroraで読み取りキャパシティを水平に拡張するのに対し、Aurora Serverlessは垂直スケーリングによりデータベース全体のリソースを調整する。

## Aurora Auto Scaling

・水平スケーリング: リードレプリカの数を自動的に増減
・対象: 読み取り専用レプリカのみ（プライマリインスタンスはスケーリングされない）
・単位: インスタンス単位でスケーリング（1台、2台、3台...）
・粒度: インスタンスタイプは変更されず、同一サイズのインスタンスが追加/削除される
・スピード: 完了までに数分かかる
・目的: 読み取りスケーラビリティと負荷分散の自動化

## Aurora Serverless

・垂直スケーリング: 個々のデータベースインスタンスのキャパシティを自動調整
・対象: ライター（プライマリ）インスタンスとリーダー（レプリカ）インスタンスの両方
・単位: Aurora容量単位（ACU）で0.5単位から細かくスケーリング
・粒度: 0.5 ACUという非常に細かい粒度でリソースを調整
・スピード: 数秒以内にスケーリングが完了
・目的: 使用パターンに応じたリソースの自動最適化とコスト効率の向上

# まとめ
Amazon Auroraとは、AWSが提供する高性能・高可用性のフルマネージド型リレーショナルデータベース
Amazon Auroraにはプロビジョンドモデルとサーバレスモデルがある。

プロビジョンドはリソースに対して料金が発生するのに対して、サーバーレスは時間に対して料金が発生する。この違いからそれぞれのモデルの棲み分けが行われている。

# 終わりに
Amazon AuroraとAurora Serverlessの違いについてアウトプットしてみるとそれぞれのモデルの違いについて理解することができたような気がする。
久しぶりのアウトプットで、知らないことを文章にすることってこんな難しいことだっけと感じました。
間違いがあればコメントでこっそりと教えてください。
この記事が誰かのお役に立てれば幸いです。