最小 0 ACUs 設定の Aurora Serverless v2 で Amazon Bedrock Knowledge Bases をコスパ良く維持する

:::note info
結論
0 ACUs にスケールイン後の初回リクエストはエラーになりますが、数秒で再開するので開発環境等の場合は問題なく使用できます。
:::

## はじめに
2024/11/20 のアップデートで Aurora Serverless v2 の最小容量が 0.5 ACUs → 0 ACUs になりました。これにより指定された期間内によって開始された接続がない場合、Aurora Serverless v2 のインスタンスを自動的に一時停止するよう設定できます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-aurora-serverless-v2-scaling-zero-capacity/

https://aws.amazon.com/jp/blogs/database/introducing-scaling-to-0-capacity-with-amazon-aurora-serverless-v2/

もともと Aurosa PostgreSQL + pgvector + Aurora Serverless v2 は Amazon Bedrock Knowledge Bases をできるだけ低コストで利用するための構成として一つの選択肢であり、バージニア北部リージョンでは 0.5 ACUs で 0.12 × 0.5 × 730 = $43.8/月 程度の月額料金でした。

このアップデートによりナレッジベースを使用していない間のコンピューティングコストを $0 に抑えることができます。


## ナレッジベースの動作確認
### Aurora PostgreSQL をベクターストアとしたナレッジベースの作成
前提として、以前投稿した以下の記事の手順に沿って環境を用意しました。

https://qiita.com/hayao_k/items/45e59c1c2a183c27b20d

### Aurora クラスターの設定変更
Aurora Serverless v2 のスケーリング範囲はクラスターレベルで変更する必要があります。(クラスター内のすべての Serverless v2 インスタンスに適用されます。

また Aurora PostgreSQL のバージョンは以下の要件を満たす必要があります。

* バージョン 16.3 以上
* バージョン 15.7 以上
* バージョン 14.12 以上
* バージョン 13.15 以上




DB クラスターの変更から Serverless v2 容量の設定に移動し、最小キャパシティ (ACU) を 0 に設定します。停止を行うまでの非アクティブ時間は 5 分に設定しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/436aea49-d803-fdae-258b-0062b4dc72f2.png)

変更の反映が完了したら、インスタンスの停止が完了するまでしばらく待ちます。インスタンスの一時停止と再開はクラスターレベルのイベントログまたはイベント通知 (`RDS-EVENT-0370` ～ `RDS-EVENT-0374`) で確認できます。もしくは ACUUtilization メトリクスが 0 になっていれば一時停止状態です。

:::note info
一時停止中もインスタンスのステータスは「利用可能」として表示されます。
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/b3feb520-c5d4-e2b3-f243-86d1c735693f.png)

due to database background activitiy というログ出力がありますが、ユーザーアクティビティ以外にもデータベースのバックグラウンド処理やメンテナンス処理で再開が走るケースもあるようです。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2-auto-pause.html

> Aurora Serverless v2 instances undergo maintenance operations with the same frequency as provisioned instances do. Because Aurora automatically resumes instances when such maintenance is needed, you might find that Aurora Serverless v2 instance resume more frequently than Aurora Serverless v1 clusters did.

### インスタンスが一時停止した状態でナレッジベースの検索を実行
ナレッジベースは Data API を介して Aurora クラスターにリクエストを送信します。インスタンスが一時停止した状態で検索を実行すると以下のようなエラーが返ります。Data API を介したアクセスでも Aurora によってインスタンスが再開されることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/096d340a-5bc9-7b1d-3fbe-9f4dd2de4f86.png)

数秒後に同じクエリを実行すると、正常に応答が得られました。

通常の再開時間は 15 秒以下ですが、停止から 24 時間以上が経過すると「deeper sleep」という状態に移行します。この状態からの再開は 30 秒以上になる可能性があり、これはインスタンスの再起動とほぼ同じであるとされています。

https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/aurora-serverless-v2-auto-pause.html

> if an Aurora Serverless v2 instance remains paused more than 24 hours, Aurora can put the instance into a deeper sleep that takes longer to resume. In that case, the resume time can be 30 seconds or longer, roughly equivalent to doing a reboot of the instance. 

ログメッセージは変わらないのでわかりにくいですが、実際に停止から 1 日以上経過し、 deeper sleep と思われる状態からの再開を試したところ 1 分程度を要しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125105/3ef913ba-8e85-0ca5-8ab1-909a90239a6b.png)

以上です。
参考になれば幸いです。