CloudFormationでRDS for MySQLの自動スケーリングを有効にしてみる

2024.02.02

はじめに

CloudFormationを使ってRDSの自動スケーリングを無効から有効に変更する際、どのパラメータを追加すればいいのか迷ったので設定変更前の確認方法も含めて記録として残します。

今回はRDS for MySQLで確認を行いました。
RDSの自動スケーリングについてはこちらを参考にしてください。

いきなりまとめ

CloudFormationでRDSの自動スケーリングを有効にするには
MaxAllocatedStorage: 最大容量(GiB)
を追加することで有効になります。

AutoScaling~というようなパラメータで有効にする訳ではないので注意が必要です。
また、変更によるDBインスタンスの置換は発生しません。

自動スケーリングがサポートされているか確認

まずは変更したいRDSが自動スケーリングに対応しているか確認します。
インスタンスタイプやデプロイオプションによっては自動スケーリングに対応していない場合があります。

まずはDBインスタンスのDBInstanceIdentifierの一覧を取得します。

$ aws rds describe-db-instances --query 'DBInstances[*].DBInstanceIdentifier'
[
    "database-1"
]

対象のDBインスタンスが確認できたら次のコマンドで自動スケーリングをサポートしているか確認します。
<DBInstanceIdentifier>の部分には上記で取得した値(今回はdatabase-1)を入れてください。

$ aws rds describe-valid-db-instance-modifications --db-instance-identifier <DBInstanceIdentifier> --query 'ValidDBInstanceModificationsMessage.Storage[*].{StorageType:StorageType, SupportsStorageAutoscaling:SupportsStorageAutoscaling}'
[
    {
        "StorageType": "gp2",
        "SupportsStorageAutoscaling": true
    },
    {
        "StorageType": "gp3",
        "SupportsStorageAutoscaling": true
    },
    {
        "StorageType": "io1",
        "SupportsStorageAutoscaling": true
    },
    {
        "StorageType": "magnetic",
        "SupportsStorageAutoscaling": false
    }
]

ストレージタイプごとに自動スケーリングに対応しているか確認することができます。
SupportsStorageAutoscalingの値がtrueの場合は自動スケーリングに対応しています。
一番下のmagneticはストレージタイプ自体が自動スケーリングに対応していないので常にfalseになります。

DBインスタンス作成前に確認する方法

DBインスタンス作成前に自動スケーリングに対応しているか確認することもできます。
以下のコマンドから確認します。
<engine>、<version>、<instance-class>にはそれぞれDBエンジン、バージョン、インスタンスクラスを入力して下さい。

$ aws rds describe-orderable-db-instance-options --engine <engine> --engine-version <version> --db-instance-class <instance-class> --query 'OrderableDBInstanceOptions[*].[StorageType, SupportsStorageAutoscaling]' --output text

例えば、mysqlの8.0.35のdb.t3.microが自動スケーリングに対応しているか確認するには以下のコマンドを実行します。

$ aws rds describe-orderable-db-instance-options --engine mysql --engine-version 8.0.35 --db-instance-class db.t3.micro --query 'OrderableDBInstanceOptions[*].[StorageType, SupportsStorageAutoscaling]' --output text
gp2     True
gp3     True
io1     True
standard        False

先ほどと同じようにストレージタイプと自動スケーリングに対応しているか確認できます。
上記の場合はstandard(magnetic)以外は自動スケーリングに対応していますね。

自動スケーリング設定を有効にする

少し前置きが長くなりましたが、CloudFormationを使って自動スケーリングを有効にしてみます。
まずは自動スケーリングが無効のRDSがあります。

RDS for MySQLのCloudFormationパラメータにはAutoSaclingというような項目はありません。
そこでMaxAllocatedStorage(最大割り当てストレージ)を設定することで自動スケーリングが有効になります。

では実際に設定してみましょう。
CloudFormationテンプレートに次の1行を追加します。
MaxAllocatedStorage: 1000

  DBInstance:
    Type: AWS::RDS::DBInstance
    Properties:
      MaxAllocatedStorage: 1000
      DBInstanceClass: db.t3.micro
      ...

ちなみに1000というのは、コンソールからRDSの自動スケーリングを有効にする際のデフォルトの最大ストレージ容量です。

これで変更セットを作成します。

変更セットのアクションはModifyですが、置換がfalseになっています。
JSONの変更も確認しておきます。

[
  {
    "type": "Resource",
    "resourceChange": {
      "action": "Modify",
      "logicalResourceId": "MyDBInstance",
      "physicalResourceId": "test-rds-mydbinstance-vgppkhaafoji",
      "resourceType": "AWS::RDS::DBInstance",
      "replacement": "False",
      "scope": [
        "Properties"
      ],
      "details": [
        {
          "target": {
            "attribute": "Properties",
            "name": "MaxAllocatedStorage",
            "requiresRecreation": "Never"
          },
          "evaluation": "Static",
          "changeSource": "DirectModification"
        }
      ]
    }
  }
]

こちらもreplacementがFalseになっていますね。
つまり、変更は発生するけど置換は発生しないということがわかりました。
では変更セットを実行します。

RDSの設定画面からストレージの自動スケーリングが有効になっていることが確認できます。
MaxAllocatedStorageを追加することで自動スケーリングが有効になることが確認できました。

まとめ

  • 自動スケーリングを有効にしたい場合はインスタンス作成前に確認しておいた方がいい
  • 既存DBの場合は自動スケーリングに対応しているか確認してから変更を行う
  • MaxAllocatedStorageを設定すると、自動スケーリングが有効になる