Amazon Aurora Auto Scaling で追加されたレプリカの Performance Insights 自動で有効させてみた

2023.12.02

こんにちは、森田です。

みなさん、Aurora Auto Scaling を使っていますか?

Aurora Auto Scaling を使うと、平均CPU使用率・接続数に応じて、レプリカをオートスケールさせてくれる便利なサービスです。

オートスケールされたインスタンスでは、Aurora DB クラスターのライター DB インスタンスの Performance Insights を有効にしても、 リーダー DB インスタンスの Performance Insights は自動的にオンにはならず、手動で Performance Insights をオンにする必要があります。

Aurora DB クラスターのライター DB インスタンスの Performance Insights を有効にしても、リーダー DB インスタンスの Performance Insights は自動的にオンにはなりません。既存のリーダー DB インスタンスと Aurora Auto Scaling によって追加された新しいレプリカについては、Performance Insights を手動でオンにする必要があります。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Integrating.AutoScaling.html#aurora-auto-scaling-pi

本記事では、Performance Insights のオンを自動で行う方法を考えてみます。

どうするか?

Performance Insights のオンは RDS: ModifyDBInstance API でできそうですが、Auto Scaling イベントのトリガーをどうするかに悩みました。

Auto Scaling で追加されるDBインスタンスの名前は、先頭が application-autoscaling- となるようですので、名前のプレフィックスを使ってイベントパターンを記載します。

Aurora Auto Scaling によってレプリカが追加されると、application-autoscaling- によってその DB インスタンス ID に application-autoscaling-61aabbcc-4e2f-4c65-b620-ab7421abc123 などのプレフィックスが付けられます。 https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Integrating.AutoScaling.html#Aurora.Integrating.AutoScaling.Concepts.Tagging

構成

EventBridge Rule で Step Functions をトリガーします。

やってみた

Step Functions ステートマシンの作成

Step Functions ステートマシン の作成を行います。

以下のようにDBインスタンスのステータスが、availableになるまで待機を行い

available になったら、ModifyDBInstance API で Performance Insightsを有効化します。

StateMachine

{
  "Comment": "A description of my state machine",
  "StartAt": "DescribeDB1",
  "States": {
    "DescribeDB1": {
      "Type": "Task",
      "Parameters": {
        "DbInstanceIdentifier.$": "$.detail.SourceArn"
      },
      "Resource": "arn:aws:states:::aws-sdk:rds:describeDBInstances",
      "Next": "availableCheck",
      "ResultPath": "$.DescribeDBInstances"
    },
    "availableCheck": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.DescribeDBInstances.DbInstances[0].DbInstanceStatus",
          "StringEquals": "available",
          "Next": "EnablePerformanceInsights"
        }
      ],
      "Default": "Wait"
    },
    "Wait": {
      "Type": "Wait",
      "Seconds": 10,
      "Next": "DescribeDB Retry"
    },
    "EnablePerformanceInsights": {
      "Type": "Task",
      "End": true,
      "Parameters": {
        "DbInstanceIdentifier.$": "$.detail.SourceIdentifier",
        "EnablePerformanceInsights": true,
        "PerformanceInsightsRetentionPeriod": 7
      },
      "Resource": "arn:aws:states:::aws-sdk:rds:modifyDBInstance"
    },
    "DescribeDB Retry": {
      "Type": "Task",
      "Parameters": {
        "DbInstanceIdentifier.$": "$.detail.SourceArn"
      },
      "Resource": "arn:aws:states:::aws-sdk:rds:describeDBInstances",
      "ResultPath": "$.DescribeDBInstances",
      "Next": "availableCheck"
    }
  }
}

EventBridge の作成

続いて EventBridge の作成を行います。

イベントパターンは以下のように記載します。

{
  "source": ["aws.rds"],
  "detail": {
    "EventCategories": ["creation"],
    "SourceIdentifier": [{
      "prefix": "application-autoscaling-"
    }]
  }
}

また、ターゲットは、先ほど作成した Step Functions ステートマシンを指定して、作成を行います。

動作検証

では、最後に、実際に正常に動作するか検証を行います。

データベースの作成を行い、以下のように Auto Scaling ポリシーを追加します。

今回はスケーリングしやすいように、ターゲット値20%に設定し、最大容量 2 Aurora レプリカとします。

負荷をかけて、オートスケールさせる

DB インスタンスが利用可能になったら、sysbench を使って、負荷をかけます。

DBHOST='xxx.ap-northeast-1.rds.amazonaws.com'
DBPASS='xxxxxxx'

sysbench --db-driver=mysql \
      --mysql-host=${DBHOST}  \
      --mysql-user=admin \
      --mysql-password=${DBPASS} \
      --mysql-db=sample \
      oltp_read_write \
      prepare

sysbench --db-driver=mysql \
      --mysql-host=${DBHOST}  \
      --mysql-user=admin \
      --mysql-password=${DBPASS} \
      --mysql-db=sample \
      --time=600 \
      --threads=32 \
      oltp_read_write \
      run

しばらく待つと、Auto Scaling が実行されて、リーダーインスタンスが追加されます。

追記されたインスタンスを確認すると、この時点では、Performance Insights はまだ有効化されていません。

さらにもう少し待つと、Step Functions で Performance Insights が有効化されるため、ステータスも作成中から変更中、そして、利用可能に切り替わります。

Step Functions の実行からも、正常に処理されていること確認できます。

最後に

当初は、Step Functions の処理は、Lambda で行うように考えていましたが、できるだけメンテナンスなしで利用できるように Step Functions に書き換えました。

今回のように、簡単な処理の組み合わせであれば、 Step Functions で実現できるので、今後も色々活用していきたいです。