💴

Aurora Serverless v2のACUを利用状況に合わせて変更する

2023/06/30に公開

Aurora Serverless v2とは

Aurora Serverless v2 を使用する

Amazon Auroraは、AWSで提供されるサービスの一つで、PostgreSQLやMySQLといったデータベースを利用できます。
Aurora Serverlessは、通常はEC2と同様にインスタンスで提供されるAmazon Auroraを、インスタンスのタイプによるリソースの制限を、気にすることなく利用できるサービスになります。

ACUとは

ACUは、インスタンスでいうところのタイプで決定されるCPUのコア数やメモリのサイズ、転送速度に相当する、Aurora Serverlessで利用可能なリソースを決める設定の単位で、最小0.5(最大値側は最小1)から最大128までの間で設定できます。
最小値と最大値を設定することで、アイドル時や低負荷の間は最小値で稼働し、負荷の状況に合わせて最大値までの間で変動することで、パフォーマンスの維持をしつつ稼働します。

Aurora Serverless v2のコスト

Aurora Serverlessの料金はACUのサイズで計算されます。

安定した稼働を求める場合、利用のピークに合わせた余裕のある値を設定することで実現は可能です。
しかし、ACUは最小値に設定した値以下には変化しないため、常時同じ設定で運用すると無駄なリソースを維持し続けることになり、コストの無駄にもつながります。

この無駄になるコストを軽減するためには、リソースの消費状況に合わせて、ACUを適切な値に調整する必要があります。

ACUの設定

AWSのコンソールから設定を行うことができます。

ですが、人が常時張り付いて設定を都度変えるということは、現実にはあり得ません。

このため、プログラムを利用して決まった時間や、稼働状況に応じて設定の変更を行うように設定することが必要になります。

状況に応じてACUの設定を行うには

AWSのサービスで実現するのであれば、IAMでDBClusterに対して操作を行う権限を与えるポリシーを作成し、Lambdaの関数を作成して、EventBridgeでトリガーを設定することで、設定を変更させることができます。

関数のコードの内容は、設定を行いたいAurora Serverlessクラスターのスケーリング設定に対して、最小値と最大値を設定するシンプルなものになります。

例として、Pythonでは以下のようなコードになります。

import boto3
import os

def lambda_handler(event, context):
    client = boto3.client('rds')
    client.modify_db_cluster(
        DBClusterIdentifier=os.environ['CLUSTER_IDENTIFIER'],
        ServerlessV2ScalingConfiguration= {
            'MinCapacity': event['minCapacity'], 
            'MaxCapacity': event['maxCapacity']  
        },
        ApplyImmediately=True,
    )

CLUSTER_IDENTIFIERは、Lambdaの環境変数で設定し、値はAurora ServerlessクラスターのDBクラスターIDを設定します。

EventBridgeでは、例としてCron式で時間を指定して実行させる設定を行ってみます。

(0 13 * * ? *)

ターゲットへの入力で定数を指定し、トリガーが実行されたときに設定するminCapacity、maxCapacityの値をJSONで記述します。

{
  "minCapacity": 30,
  "maxCapacity": 70
}

以上で、状況に応じたACUの設定に変更を行うことができるようになります。

さいごに

今回の設定の主目的はコスト削減で、主に最小値の値を下げることで目的を達成しようという対応になります。

ですが、最小値と最大値の間で自動でスケーリングが行われるものの、利用状況に合わせてさらに細かくコントロールしたい場合もあると思います。
そのようなときにも、Lambdaの関数はそのまま利用できますので、別のアプローチで関数を実行させることで対応できます。

コラボスタイル Developers

Discussion