Aurora Serverless v2 は、Aurora の DB インスタンスの大きさ(CPU とメモリ)を、負荷に合わせて自動で増減させる仕組みです。 大きさの単位は ACU(Aurora Capacity Unit、約 2 GiB のメモリと、それに見合う CPU・ネットワーク)で、クラスターに「最小 ACU」と「最大 ACU」を決めます。最小を 0 にすると、接続が無い時間が続いたときにインスタンスが自動で一時停止し、その間のインスタンス料金が 0 になります。 次の接続で再開し、ドキュメントでは再開に約 15 秒(24 時間を超えて止まっていると 30 秒以上)かかるとされています。

# 最小 0 ACU(10 分接続が無ければ一時停止)〜 最大 8 ACU のクラスター
aws rds create-db-cluster --db-cluster-identifier app-db \
  --engine aurora-postgresql --engine-version 16.6 \
  --serverless-v2-scaling-configuration MinCapacity=0,MaxCapacity=8,SecondsUntilAutoPause=600 \
  --master-username postgres --manage-master-user-password \
  --db-subnet-group-name app-db-subnets --vpc-security-group-ids sg-0123456789abcdef0

# インスタンスクラスを db.serverless にしてライターを作る
aws rds create-db-instance --db-instance-identifier app-db-writer \
  --db-cluster-identifier app-db --engine aurora-postgresql --db-instance-class db.serverless
設定 範囲(ドキュメント) 決め方の目安
MinCapacity 0(自動一時停止)/0.5〜 開発・夜は使わない → 0。本番 → よく使うデータがメモリに乗る大きさ
MaxCapacity 1〜256 一番重い時間帯の負荷+余裕。max_connections もこれで決まる
SecondsUntilAutoPause 300〜86,400 秒(既定 300) 最小が 0 のときだけ。誤って止まらない長さ

確認環境:AWS CLI 1.46.1・boto3 1.43.112(Linux)。AWS には接続せず、moto 5.2.4 のサーバーモードで create-db-cluster(--serverless-v2-scaling-configuration)・create-db-instance --db-instance-class db.serverless・modify-db-cluster の形を確かめました。接続の再試行は、PostgreSQL 16.15 と psycopg 3.3.6 を使い、「一時停止中の DB に接続すると再開まで待たされる」動きを 15 秒待たせる中継で模して動かしています。ACU・自動一時停止・再開の時間・料金は AWS のドキュメントと料金ページに基づいています(確認日 2026年10月13日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Aurora Serverless v2の使い方|ACUの決め方と0への自動停止」

ACU とは:最小と最大の意味

項目 内容(ドキュメント)
1 ACU 約 2 GiB のメモリと、それに見合う CPU・ネットワーク
範囲 0〜256 ACU(版によって 0.5〜128、0.5〜256)
増減の幅 最小 0.5 ACU 刻み。今の大きさが大きいほど、速く増える
増減の単位 インスタンスごと。ライターとリーダーはそれぞれ増減する
増減中の処理 接続中・トランザクション中・テーブルのロック中でも増減でき、処理は止まらない
料金 ACU 時間(秒単位で計算)
ACU の範囲 Aurora MySQL Aurora PostgreSQL
0.5〜128 3.02.0 以上 13.6・14.3・15.2・16.1 以上
0.5〜256 3.06.0 以上 13.13・14.10・15.5・16.1 以上
0〜256 3.08.0 以上 13.15・14.12・15.7・16.3 以上

ドキュメントでは「範囲は、エンジンの版とプラットフォームの版のうち低い方で決まる」とされています。プラットフォームの版 1 は 0〜128、版 2〜4 は 0〜256 です。エンジンを上げても最大が 128 のままなら、プラットフォームの版を確かめます。

最小 ACU の決め方

状況 最小 ACU の目安 理由(ドキュメント)
開発・検証、夜間や週末は使わない 0 使わない時間のインスタンス料金が 0
本番で、急な負荷に速く応えたい よく使うデータがバッファプールに乗る大きさ 小さく縮むとキャッシュが捨てられる。大きいほど速く増える
Performance Insights を使う 2 以上 ドキュメントの推奨(変わる可能性あり)
Aurora グローバルデータベースのプライマリ 8 以上 同上
0 にしたいが止まってほしくない時間がある 0.5 止まらずに最小で待つ

ドキュメントでは「最小は 0.5 にしたくなるが、よく使うデータの量に見合う大きさを選ぶ」と書かれています。プロビジョンドから移すなら、今のインスタンスのメモリを 2 GiB で割った値が最初の目安です(db.r6g.large の 16 GiB なら 8 ACU)。

最大 ACU の決め方と max_connections

最大 ACU は、負荷の上限であると同時に、max_connections(同時接続の上限)を決めます。 最大を変えたあとは、max_connections に反映させるために再起動が要ります(静的パラメータのため)。

最大 ACU Aurora MySQL の既定 Aurora PostgreSQL の既定
1 90 189
4 135 823
8 1,000 1,669
16 2,000 3,360
32 3,000 5,000
64 4,000 5,000
128 5,000 5,000
256 6,000 5,000

PostgreSQL で最小を 0 か 0.5 にすると、max_connections は最大 2,000 で頭打ちになります。最大を 1〜4 にした小さなクラスターでは、MySQL で 90〜135 しか接続できません。 Lambda などから多く接続するなら、最大を上げるか、接続をまとめる仕組みを使います。PostgreSQL の接続数の見方は、関連記事「PostgreSQL接続数の確認|pg_stat_activityの見方と対処」で扱っています。MySQL の接続数の上限に達したときは、関連記事「MySQL Too many connectionsの原因と直し方」で扱っています。

最大 ACU の注意(ドキュメント) 内容
最小と同じにする 増減しなくなる。テスト以外では向かない
0.5 にする 不可。1 以上
メモリを使う機能 Performance Insights、MySQL のパラレルクエリ・performance schema・バイナリログのレプリケーションは、その分を見込む
インスタンスが n 台 クラスター全体の最大は n × 最大 ACU

0 ACU への自動一時停止

止まる条件と止まらない原因

最小を 0 にし、ユーザーの接続が1つも無い状態が SecondsUntilAutoPause 秒続くと、インスタンスが一時停止します。 Aurora が健全性の確認に使う管理用の接続は数えません。

止まらない原因の一覧です(ドキュメント)。

止まらない原因 対処
最小 ACU が 0 より大きい 0 にする
ユーザーの接続が開いたまま(接続プール、開発ツール、監視、ALB のヘルスチェックで DB に触る処理) アイドルの接続を閉じる。プールの最小接続数を 0 に
パッチ適用・アップグレードの最中 終わるのを待つ
RDS Proxy を付けている(各インスタンスへの接続を保つ) 0 ACU と RDS Proxy は組み合わせない
PostgreSQL の論理レプリケーション、MySQL のバイナリログレプリケーション ライターと、昇格の優先度 0・1 のリーダーは止まらない
Aurora グローバルデータベース プライマリのライター、セカンダリの全インスタンスは止まらない
Redshift への zero-ETL 統合 ライターと優先度 0・1 のリーダーは止まらない
Babelfish の T-SQL ポートへの接続 接続を閉じる
クラスターにプロビジョンドのインスタンスがある サーバーレスのライターは止まらない

ライターと、昇格の優先度(プロモーションティア)が 0・1 のリーダーは、同時に止まり、同時に再開します。 リーダーを独立して止めたいなら、優先度を 2〜15 にします。

ブログなどでは、Aurora MySQL の binlog_format を有効にしていたため止まらなかった例も報告されています。バイナリログのレプリケーションを使わないなら、クラスターパラメータグループで無効にしておきます。

再開のきっかけと時間

再開する操作(ドキュメント) 再開しない操作
DB への接続(認証に失敗する接続でも再開する) クラスターのスナップショットの作成・削除
RDS Data API からの接続
パラメータグループの値の変更
スケーリングの範囲の変更、エンジンのアップグレード
クローンの作成、バックトラック
ログファイルの一覧・ダウンロード
再開の時間(ドキュメント) 接続タイムアウトの目安
ふつう約 15 秒 15 秒より長く
24 時間を超えて止まっていた(深い眠り) 30 秒以上

pg_cron や MySQL のイベントスケジューラーは、止まったインスタンスを起こしません。 夜間バッチを DB の中のスケジューラーで動かしているなら、外から接続して起こすか、最小を 0 にしません。外から決まった時刻に処理を動かす方法は、関連記事「EventBridge Schedulerの使い方|cron・rate・1回実行」で扱っています。

止まっているかを確かめる

# 3 分間の最小値。0 なら一時停止していた時間がある
aws cloudwatch get-metric-statistics --namespace AWS/RDS \
  --metric-name ServerlessDatabaseCapacity \
  --dimensions Name=DBInstanceIdentifier,Value=app-db-writer \
  --start-time "$(date -u -d '3 minutes ago' +%FT%TZ)" --end-time "$(date -u +%FT%TZ)" \
  --period 60 --statistics Minimum --output text

# 一時停止・再開のイベント(RDS-EVENT-0370〜0374)
aws rds describe-events --source-type db-instance --source-identifier app-db-writer --duration 1440
指標 一時停止中の値
ServerlessDatabaseCapacity 0
ACUUtilization・CPUUtilization 0%
ServerlessV2Usage 0(料金の元になる値)

接続コード:再開を待てるタイムアウトと再試行

ドキュメントでは、タイムアウトを再開の時間より長くし、失敗した接続を 3 回ほど再試行すること、ただし認証エラーは再試行しないことが勧められています。

import os, time, random
import psycopg

def connect_with_retry(dsn: str, *, connect_timeout=30, attempts=3):
    """自動一時停止からの再開(ふつう約 15 秒、長く止まると 30 秒以上)を待てる接続"""
    for i in range(1, attempts + 1):
        started = time.monotonic()
        try:
            conn = psycopg.connect(dsn, connect_timeout=connect_timeout)
            print(f"attempt {i}: connected in {time.monotonic() - started:.1f}s")
            return conn
        except psycopg.OperationalError as e:
            msg = str(e).strip().splitlines()[-1]
            print(f"attempt {i}: {type(e).__name__} after {time.monotonic() - started:.1f}s: {msg}")
            if "password authentication failed" in msg or i == attempts:
                raise                                   # 認証エラーは再試行しない
            time.sleep(min(2 ** i, 10) + random.random())

if __name__ == "__main__":
    dsn = os.environ["DSN"]   # host=app-db.cluster-xxxx.ap-northeast-1.rds.amazonaws.com dbname=app user=app ...
    ct = int(os.environ.get("CT", "30"))
    with connect_with_retry(dsn, connect_timeout=ct) as conn:
        print(conn.execute("select 1").fetchone())

PostgreSQL の前に「しばらく接続が無いと、次の接続を 15 秒待たせてから通す」中継を置いて動かした結果です(Aurora の再開を模したもので、実際の再開時間ではありません)。

== CT=30(タイムアウト 30 秒)
attempt 1: connected in 15.1s
(1,)
== CT=5(タイムアウト 5 秒)
attempt 1: ConnectionTimeout after 5.0s: connection timeout expired
attempt 2: ConnectionTimeout after 5.0s: connection timeout expired
attempt 3: connected in 0.0s
(1,)

タイムアウトが短くても、再試行の間に再開が終われば接続できました。ただし、再開の時間が「タイムアウト × 回数+待ち時間」を超えると失敗します。Lambda や API の前段のタイムアウト(API Gateway の統合タイムアウトの既定 29 秒など)に収まるかも合わせて決めます。

言語・ドライバー 接続タイムアウトの指定
psycopg(Python・PostgreSQL) connect_timeout=30(秒)
PyMySQL connect_timeout=30(秒)
JDBC(PostgreSQL) connectTimeout=30(秒)
JDBC(MySQL Connector/J) connectTimeout=30000(ミリ秒)
HikariCP connectionTimeout=30000(ミリ秒)。minimumIdle=0 にしないと接続が残って止まらない

接続プールは、使っていない接続を閉じる設定にします。 プールが最小数の接続を持ち続けると、ユーザーの接続があるとみなされ、一時停止しません。

プロビジョンドとの比較

項目 Aurora Serverless v2 プロビジョンド
インスタンスクラス db.serverless db.r6g.large など
大きさの変更 自動(0.5 ACU 刻み、処理を止めない) クラスを変える(再起動・フェイルオーバー)
料金 ACU 時間(秒単位) インスタンス時間(秒単位、最小 10 分)
使わない時間 0 ACU なら 0(ストレージは別) 停止できる(最大 7 日で自動起動)
混在 同じクラスターにプロビジョンドとサーバーレスを混ぜられる 同左
向いている負荷 時間帯で大きく変わる、読めない、開発・検証 一日中ほぼ一定
機能 リードレプリカ、マルチ AZ、グローバルデータベース、RDS Proxy、Data API など、プロビジョンドとほぼ同じ —

同じ大きさで一日中動かすなら、プロビジョンドの方が安くなります。 料金ページの米国東部の単価(Aurora Standard)で比べると、次のとおりです。

例(1 か月 = 730 時間) 計算 月額(米国東部)
サーバーレス 8 ACU で常時 8 × 0.12 USD × 730 700.80 USD
プロビジョンド db.r6i.large(16 GiB)で常時 0.29 USD × 730 211.70 USD
損益の分かれ目 0.29 ÷ 0.12 平均 約 2.4 ACU

平均の ACU が約 2.4 を下回るならサーバーレス、上回るならプロビジョンドが安い、という計算です(ストレージ・I/O は同じ)。db.r6i.large の単価は料金ページのグローバルデータベースの例の値です。

費用の計算例

料金ページの米国東部の単価です(東京リージョンの単価は料金ページ・料金計算ツールで確かめます)。

項目 Aurora Standard Aurora I/O-Optimized
ACU 時間 0.12 USD 0.156 USD
ストレージ(GB 月) 0.10 USD 0.225 USD
I/O(100 万回) 0.20 USD 0 USD
使い方(1 か月) 計算(ACU 部分だけ) 月額
最小 0.5 ACU で止めずに置いておく 0.5 × 0.12 × 730 43.80 USD
開発用:平日 8 時間だけ平均 2 ACU、ほかは 0 ACU で一時停止(22 日) 2 × 0.12 × 8 × 22 42.24 USD
本番:1 日 4 時間は 16 ACU、残り 20 時間は 1 ACU(30 日) (4 × 16 + 20 × 1) × 0.12 × 30 302.40 USD

最小 0.5 で何もしなくても、ACU だけで月 40 USD を超えます。 開発環境を 0 ACU にすると、使わない時間のこの分がかかりません。ストレージ・バックアップ・I/O は止まっていてもかかります。費用の確認は、関連記事「AWSの料金を確認する方法|Cost Explorer・CLI・予算アラート」で扱っています。

CLI での作成・変更

クラスターとライター

aws rds create-db-subnet-group --db-subnet-group-name app-db-subnets \
  --db-subnet-group-description "app db" --subnet-ids subnet-0aaa1111 subnet-0bbb2222

aws rds create-db-cluster --db-cluster-identifier app-db \
  --engine aurora-postgresql --engine-version 16.6 \
  --serverless-v2-scaling-configuration MinCapacity=0,MaxCapacity=8,SecondsUntilAutoPause=600 \
  --master-username postgres --manage-master-user-password \
  --db-subnet-group-name app-db-subnets --vpc-security-group-ids sg-0123456789abcdef0 \
  --storage-encrypted

aws rds create-db-instance --db-instance-identifier app-db-writer \
  --db-cluster-identifier app-db --engine aurora-postgresql --db-instance-class db.serverless

aws rds wait db-instance-available --db-instance-identifier app-db-writer

moto で作ると、create-db-cluster の応答に次の値が入りました。

"Endpoint": "app-db.cluster-dreumrh3ab80.ap-northeast-1.rds.amazonaws.com",
"ReaderEndpoint": "app-db.cluster-ro-dreumrh3ab80.ap-northeast-1.rds.amazonaws.com",
"Port": 5432,
"ServerlessV2ScalingConfiguration": {
    "MinCapacity": 0.0,
    "MaxCapacity": 8.0,
    "SecondsUntilAutoPause": 600
},
"MasterUserSecret": {
    "SecretArn": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:rds!cluster-086fb91d-...",
    "SecretStatus": "creating",
オプション 内容
--serverless-v2-scaling-configuration MinCapacity・MaxCapacity・SecondsUntilAutoPause(最小 0 のときだけ)
--db-instance-class db.serverless インスタンスをサーバーレスにする。クラスターだけ作ってもインスタンスが無いと接続できない
--manage-master-user-password マスターパスワードを Secrets Manager で管理(MasterUserSecret.SecretArn)
--storage-type aurora-iopt1 I/O-Optimized。省くと Standard

マスターパスワードの取り出し方は、関連記事「AWS Secrets Managerの使い方 CLI・boto3取得早見表」で扱っています。

範囲を変える・0 をやめる

# 自動一時停止を有効にする(1 時間)
aws rds modify-db-cluster --db-cluster-identifier app-db \
  --serverless-v2-scaling-configuration MinCapacity=0,MaxCapacity=16,SecondsUntilAutoPause=3600

# 0 をやめる(最小を 0 より大きくすると SecondsUntilAutoPause は消える)
aws rds modify-db-cluster --db-cluster-identifier app-db \
  --serverless-v2-scaling-configuration MinCapacity=0.5,MaxCapacity=16 --apply-immediately

# 最大を変えたら、max_connections を反映させるために再起動
aws rds reboot-db-instance --db-instance-identifier app-db-writer

moto で通ったが、AWS では断られる値

値 moto 5.2.4 AWS(ドキュメント)
MinCapacity=0.25 受け付けた 0 か 0.5 以上、0.5 刻み
SecondsUntilAutoPause=60 受け付けた 300〜86,400
--storage-type aurora サーバー側のエラー(500) Standard を表す値として使える

moto はスケーリングの範囲を調べないので、値はドキュメントの範囲で決めます。クラスター・インスタンスの起動・停止・スナップショットの CLI は、関連記事「AWS CLIでRDSを操作|起動・停止・スナップショット・接続先取得」で扱っています。

接続の注意

注意 内容
エンドポイント 書き込みはクラスターエンドポイント、読み取りはリーダーエンドポイント。インスタンスの名前を直接使わない
再開待ち 0 ACU なら接続タイムアウトを 30 秒以上、再試行 3 回ほど
接続プール アイドルの接続を閉じる(minimumIdle=0 など)。残すと止まらない
RDS Proxy 接続数の山をならせるが、付けると一時停止しない
Lambda から 呼び出しごとに接続を作ると max_connections に達しやすい。最大 ACU を上げるか RDS Proxy(0 ACU と両立しない)か Data API
最大 ACU を小さくした max_connections が小さい(MySQL で最大 1 ACU なら 90)
再開時の最初の応答 再開直後は小さい ACU から増えるので、最初の重いクエリは遅いことがある

Lambda からの接続を RDS Proxy でまとめる方法は、関連記事「RDS Proxyの使い方|LambdaからDB接続を安定させる設定」で扱っています。

よくある質問

Q. 0 ACU にしたのに止まりません。 A. まず pg_stat_activity(MySQL なら SHOW PROCESSLIST)で、自分の接続以外が残っていないかを見ます。接続プール、BI ツール、監視、ヘルスチェック、RDS Proxy、バイナリログのレプリケーションがよくある原因です。止まらない原因の表を順に確かめます。

Q. 既存のクラスターを 0 ACU にできますか。 A. エンジンが 0 ACU に対応した版(PostgreSQL 16.3・15.7・14.12・13.15 以上、MySQL 3.08.0 以上)なら、modify-db-cluster で MinCapacity=0 にできます。それより前の版なら、先にアップグレードします。

Q. Aurora Serverless v1 とは何が違いますか。 A. v2 は通常の Aurora クラスターのインスタンスクラス(db.serverless)として動き、リードレプリカ・マルチ AZ・プロビジョンドとの混在などが使えます。0 への一時停止も v2 で使えるようになりました(2024年11月の発表)。

Q. 再開中の接続はエラーになりますか。 A. ドキュメントでは、止まったインスタンスに接続すると自動で再開して接続を受け付けるとされています。タイムアウトが再開の時間より短いと、クライアント側でタイムアウトになります。

まとめ

  • ACU は約 2 GiB のメモリと CPU。最小・最大の範囲で自動に増減し、秒単位で課金
  • 最小は「よく使うデータがメモリに乗る大きさ」、開発は 0。最大は負荷と max_connections で決める
  • 0 ACU は MySQL 3.08.0・PostgreSQL 16.3 などから。SecondsUntilAutoPause は 300〜86,400 秒
  • 止まらない原因は 開いたままの接続・RDS Proxy・レプリケーション・グローバルデータベース
  • 再開は約 15 秒(24 時間超で 30 秒以上)。接続タイムアウト 30 秒以上+再試行、認証エラーは再試行しない
  • 一日中同じ負荷ならプロビジョンドが安い(米国東部の単価で平均 約 2.4 ACU が分かれ目)

参考・出典

確認日はいずれも 2026年10月13日です。

  • Amazon Aurora User Guide「Scaling to Zero ACUs with automatic pause and resume for Aurora Serverless v2」:https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2-auto-pause.html
  • Amazon Aurora User Guide「How Aurora Serverless v2 works」:https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.how-it-works.html
  • Amazon Aurora User Guide「Performance and scaling for Aurora Serverless v2」(最小・最大 ACU と max_connections):https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2.setting-capacity.html
  • AWS CLI Command Reference「rds create-db-cluster」:https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-cluster.html
  • Amazon Aurora の料金:https://aws.amazon.com/rds/aurora/pricing/
  • AWS What's New「Amazon Aurora Serverless v2 supports scaling to zero capacity」(2024年11月):https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-aurora-serverless-v2-scaling-zero-capacity
  • AWS Database Blog「Introducing scaling to 0 capacity with Amazon Aurora Serverless v2」:https://aws.amazon.com/blogs/database/introducing-scaling-to-0-capacity-with-amazon-aurora-serverless-v2/
  • クラスメソッド「Amazon Aurora Serverless v2が最小キャパシティ0に対応し、自動停止・再開が可能になりました」:https://dev.classmethod.jp/articles/amazon-aurora-serverless-v2-supports-acu0-pause-resume/
  • Zenn(team_delta)Aurora Serverless v2 が 0 ACU にならなかった事例(binlog_format):https://zenn.dev/team_delta/articles/dd1372fa046af7

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Aurora Serverless v2の使い方|ACUの決め方と0への自動停止」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?