Amazon Aurora Serverless v2 のスケールアップ・スケールダウンを Amazon EventBridge Scheduler だけで実装する

AWS

2023.8.23

Topics

はじめに

Aurora Serverless は使用している ACU 単位でコストが発生します。
アクセスが無い時間帯だと ACU は最小値を維持します。

そのため、日中帯しかデータベースが利用されない場合は深夜帯で、最小 ACU を下げることによりコスト最適化が行なえます。
今回は、EventBridge Scheduler を使って自動的に ACU をスケールアップ・スケールダウンする方法についてご説明いたします。

以前は、EventBridge + Lambda が必要でしたが、EventBridge Scheduler がリリースされて API をそのまま実行出るようになったため EventBridge だけで実装することができるようになりました。

自動スケールアップ・スケールダウンをスケジューリングする

前提

  • Aurora Serverless v2 MySQL を構築済み

自動スケールアップ・スケールダウンの流れ

  1. EventBridge Scheduler で任意のタイミングでイベント起動
  2. ModifyDBCluster イベントでスケーリングの設定を変更

スケジューリング設定を追加する

まずは、EventBridge Scheduler を作成していきます。

スケジュールのパターンについてはお好みで設定して下さい。

以下例は、毎日 18 時にスケールダウンさせるスケジュールのパターンになります。

EventBridge Schedulerのスケジュール設定画面

次はターゲットを選択しますが設定する値は以下の通りです。

  • API:ModifyDBCluster
  • ペイロード:{"DbClusterIdentifier":"cold-airflow-aurora-scheduler","ServerlessV2ScalingConfiguration":{"MaxCapacity":2,"MinCapacity":1}}

ModifyDBCluster – Amazon Relational Database Service

コンソールからだと、API 名でしらべても出てこないのでまずはサービス名(RDS)で検索します。
[Amazon RDS] を選択したら、API 名(ModifyDBCluster)で再度検索します。

ターゲット検索画面

そうすると、パラメータ入力画面が出てくるので設定する値を入力します。

パラメータ入力画面

なお、ペイロードのクラスター名(DbClusterIdentifier)は対象とする Aurora クラスター名にして下さい。
「MaxCapacity」と「MinCapacity」はスケールさせたい値を入力して下さい。
その際の注意点として、「MaxCapacity」のほうが「MinCapacity」より大きい値になるようにしてください。
(ぱっと見文字列が同じなので間違えてエラーなりました)

個人的には、再試行ポリシーは不要だと思うので無効にしておきます。
大体は、一回失敗するとその後も失敗すると思うので不要な試行をさせたくない意図です。

再試行ポリシーの設定を無効にする

自動スケールアップ・スケールダウンさせる

今回は、検証のため 「定期的なスケジュール」ではなく「一回限りのスケジュール」で設定していきます。

スケジュールが実行される前の、最小 ACU と最大 ACU は以下の通りです。

  • 最小 ACU:0.5
  • 最大 ACU:1

スケール前のACU

それを以下容量にスケールアップさせます。

  • 最小 ACU:1
  • 最大 ACU:2

最小ACUを1,最大ACUを2にする

上記で設定をして、時間が経つまで暫く待つと ACU 値が変わります。

変更されたACU

CloudTrail のイベントでも以下のように記録されてます。

{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAVPARCPUZY47FPCSTO:54c2bc601452306d9db796c0adb0ca27",
        "arn": "arn:aws:sts::375845453107:assumed-role/EventBridgeRole/54c2bc601452306d9db796c0adb0ca27",
        "accountId": "375845453107",
        "accessKeyId": "xxxxxxxxxxxxxx",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAVPARCPUZY47FPCSTO",
                "arn": "arn:aws:iam::375845453107:role/EventBridgeRole",
                "accountId": "375845453107",
                "userName": "EventBridgeRole"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2023-06-02T00:38:02Z",
                "mfaAuthenticated": "false"
            }
        }
    },
    "eventTime": "2023-06-02T00:38:02Z",
    "eventSource": "rds.amazonaws.com",
    "eventName": "ModifyDBCluster",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "54.198.180.126",
    "userAgent": "AmazonEventBridgeScheduler, aws-sdk-java/2.20.67 Linux/5.10.179-166.674.amzn2.x86_64 OpenJDK_64-Bit_Server_VM/11.0.19+8-LTS Java/11.0.19 kotlin/1.6.21-release-334(1.6.21) vendor/Amazon.com_Inc. md/internal exec-env/AWS_ECS_FARGATE io/async http/NettyNio cfg/retry-mode/legacy",
    "requestParameters": {
        "dBClusterIdentifier": "cold-airflow-aurora-scheduler",
        "applyImmediately": false,
        "allowMajorVersionUpgrade": false,
        "serverlessV2ScalingConfiguration": {
            "minCapacity": 1,
            "maxCapacity": 2
        },
        "allowEngineModeChange": false
    },
    "responseElements": {
        "allocatedStorage": 1,
        "availabilityZones": [
            "us-east-1c",
            "us-east-1b",
            "us-east-1f"
        ],
        "backupRetentionPeriod": 1,
        "databaseName": "test",
        "dBClusterIdentifier": "cold-airflow-aurora-scheduler",
        "dBClusterParameterGroup": "default.aurora-mysql8.0",
        "dBSubnetGroup": "cold-airflow-aurora-scheduler",
        "status": "available",
        "earliestRestorableTime": "Jun 2, 2023 12:20:09 AM",
        "endpoint": "cold-airflow-aurora-scheduler.cluster-co4nqylz6jpl.us-east-1.rds.amazonaws.com",
        "readerEndpoint": "cold-airflow-aurora-scheduler.cluster-ro-co4nqylz6jpl.us-east-1.rds.amazonaws.com",
        "multiAZ": false,
        "engine": "aurora-mysql",
        "engineVersion": "8.0.mysql_aurora.3.02.0",
        "latestRestorableTime": "Jun 2, 2023 12:36:18 AM",
        "port": 3306,
        "masterUsername": "root",
        "preferredBackupWindow": "03:22-03:52",
        "preferredMaintenanceWindow": "wed:04:11-wed:04:41",
        "readReplicaIdentifiers": [],
        "dBClusterMembers": [
            {
                "dBInstanceIdentifier": "cold-airflow-aurora-scheduler-serverless-instance",
                "isClusterWriter": true,
                "dBClusterParameterGroupStatus": "in-sync",
                "promotionTier": 0
            }
        ],
        "vpcSecurityGroups": [
            {
                "vpcSecurityGroupId": "sg-0dd842e1e9de50671",
                "status": "active"
            }
        ],
        "hostedZoneId": "Z2R2ITUGPM61AM",
        "storageEncrypted": false,
        "dbClusterResourceId": "cluster-Y75DPZ4VKN4TLKZOOB4YNH7PTY",
        "dBClusterArn": "arn:aws:rds:us-east-1:375845453107:cluster:cold-airflow-aurora-scheduler",
        "associatedRoles": [],
        "iAMDatabaseAuthenticationEnabled": false,
        "clusterCreateTime": "Jun 2, 2023 12:18:31 AM",
        "engineMode": "provisioned",
        "autoMinorVersionUpgrade": true,
        "deletionProtection": false,
        "httpEndpointEnabled": false,
        "copyTagsToSnapshot": false,
        "crossAccountClone": false,
        "domainMemberships": [],
        "tagList": [
            {
                "key": "Name",
                "value": "cold-airflow-test-tf"
            }
        ],
        "networkType": "IPV4",
        "serverlessV2ScalingConfiguration": {
            "minCapacity": 1,
            "maxCapacity": 2
        }
    },
    "requestID": "d0647939-e8ff-452e-81f2-1d7af8606f06",
    "eventID": "507710c1-7879-475a-aeb9-d821fc80634b",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "375845453107",
    "eventCategory": "Management",
    "tlsDetails": {
        "tlsVersion": "TLSv1.2",
        "cipherSuite": "ECDHE-RSA-AES128-GCM-SHA256",
        "clientProvidedHostHeader": "rds.us-east-1.amazonaws.com"
    }
}

参考資料

ModifyDBCluster – Amazon Relational Database Service
ServerlessV2ScalingConfiguration – Amazon Relational Database Service
Aurora Serverless v2 の仕組み – Amazon Aurora
Amazon Aurora Serverless v2 の一般提供開始 | Amazon Web Services ブログ
Aurora Serverless v2 でのパフォーマンスとスケーリング – Amazon Aurora

Cold-Airflow

2021年新卒入社。インフラエンジニアです。RDBが三度の飯より好きです。 主にデータベースやAWSのサーバレスについて書く予定です。あと寒いのは苦手です。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら