[アップデート] Amazon RDS マルチ AZ DB クラスターが CloudFormation でサポートされました

Aurora の DB クラスターではなく Amazon RDS のマルチ AZ DB クラスターです。一般提供が開始されてから CloudFormation でサポートされるまで 8 ヶ月ほどかかりましたね。

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

コンバンハ、千葉(幸)です。

Amazon RDS のマルチ AZ DB クラスターを CloudFormation で作成できるようになりました。

従来からあるマルチ AZ DB インスタンス構成ではなく、 2 つの読み込み可能なリーダーインスタンスを備えたマルチ AZ DB クラスターのほうです。2022年 3 月に一般提供されましたね。

そして時を同じくしてマルチ AZ DB クラスターがサポートされたリージョンも増えました。大阪リージョンも含まれています。

盛り上がってきましたね!

CloudFormation でマルチ AZ DB クラスターを作成してみた

さっそく CloudFormation でマルチ AZ DB クラスターを作成します。

以下のリファレンスを参考にします。

ちなみに上記のリファレンスのリソースタイプは、RDS のマルチ AZ DB クラスターだけでなく Aurora の DB クラスターにも対応しています。プロパティの中にはどちらか一方にしか対応していないものもあるので、取り違えないようにしましょう。

RDS_AWS_RDS_DBCluster_-_AWS_CloudFormation

ありがたいことにマルチ AZ DB クラスター用のテンプレート例が載っていますので、これをそのまま使います。

AWSTemplateFormatVersion: 2010-09-09
Description: AWS CloudFormation Sample Template for creating a Multi-AZ DB cluster.
Parameters:
  DBUsername:
    NoEcho: 'true'
    Description: Username for database access
    Type: String
    MinLength: '1'
    MaxLength: '16'
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: Must begin with a letter and contain only alphanumeric characters.
  DBPassword:
    NoEcho: 'true'
    Description: Password for database access
    Type: String
    MinLength: '8'
    MaxLength: '41'
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: Must contain only alphanumeric characters.
  DBClusterIdentifier:
    Type: String
  Engine:
    Type: String
  EngineVersion:
    Type: String
  AllocatedStorage:
    Type: Number
  Iops:
    Type: Number
Resources:
  MultiAZDBCluster:
    Type: 'AWS::RDS::DBCluster'
    Properties:
      MasterUsername: !Ref DBUsername
      MasterUserPassword: !Ref DBPassword
      DBClusterIdentifier: !Ref DBClusterIdentifier
      Engine: !Ref Engine
      EngineVersion: !Ref EngineVersion
      AllocatedStorage: !Ref AllocatedStorage
      Iops: !Ref Iops
      DBClusterInstanceClass: db.r6gd.xlarge
      BackupRetentionPeriod: 1
      StorageType: io1

事前準備:デフォルト VPC の作成

今回使用するテンプレートではサブネットグループの指定がないため、デフォルトのサブネットグループが使用されます。

デフォルトのサブネットグループはデフォルト VPC を指定して作成されますので、もしデフォルト VPC を削除していた場合は作成し直しておきましょう。

RDS_default_VPC_VPC_Management_Console

CloudFormation スタックの作成

CloudFormation のコンソールよりスタックの作成を行います。今回はローカルで作成したテンプレートファイルをコンソールからアップロードしました。

続いてのステップでスタック名、各種パラメータを入力します。

パラメータは以下が存在します。

パラメータ 説明
AllocatedStorage 割り当てストレージ(GiB)。最小 100
DBClusterIdentifier クラスター識別子
DBPassword DBパスワード。8~41文字。大文字小文字数字のみ
DBUsername DBユーザー名。1~16文字。大文字小文字数字のみ
Engine エンジン
EngineVersion エンジンバージョン
Iops プロビジョンドIOPS。最小 1,000

今回は以下のように入力しました。

RDS_multi_CloudFormation_paramater


Engine に mysql って入れて大丈夫だった……

パラメータのEngineで指定した値が CloudFormation テンプレートのプロパティEngineに使用されるのですが、リファレンスを見ると aurora 関連のみが許可されているように見えます。

RDS_Multi_AWS_RDS_DBCluster_-_AWS_CloudFormation

さすがにマルチ AZ DB クラスターを作成したいのに aurora と名前がつくものを指定するのは違うだろう、と思いmysqlを指定してみたところ問題ありませんでした。(後続の手順で最後まで作成が完了した。)

リファレンスの更新が間に合ってないこともある、ということですね。

なお、エンジンごとのマルチ AZ DB クラスターの対応状況は以下から確認できます。


続いてのステップでは特に何もいじらず次に進みます。

RDS_Multi_cluster_cloudformation

ステップ 4 で最終確認をし、問題なければ作成を実行します。

開始からおよそ 15 分ほどでマルチ AZ DB クラスターの作成が完了しました。

RDS_multi_CloudFormation_-_stack_multi-az-db-cluster

作成されたマルチ AZ DB クラスターを確認してみる

今回のテンプレートにより作成されたマルチ AZ DB クラスターは以下の通りです。ライターが 1 台、リーダーが 2 台からなるクラスターになっていますね。

RDS_multi_RDS_Management_Console

クラスターの設定を覗くとこのような感じ。パラメータで指定したものはその通りに、それ以外の部分はよしなにやってくれています。

RDS_multi_RDS_Management_Console-7642342

↑ちなみにクラスターでもインスタンスでも DB オプショングループの項目はありませんでした。クラスター構成でない DB インスタンスと考え方が違う部分はそこそこありそうです。

AWS CLI でも確認しておきます。たくさんのパラメータがあるなぁ、という気になりますね。

% aws rds describe-db-clusters --db-cluster-identifier test-cluster
{
    "DBClusters": [
        {
            "AllocatedStorage": 100,
            "AvailabilityZones": [
                "ap-northeast-1a",
                "ap-northeast-1c",
                "ap-northeast-1d"
            ],
            "BackupRetentionPeriod": 1,
            "DBClusterIdentifier": "test-cluster",
            "DBClusterParameterGroup": "default.mysql8.0",
            "DBSubnetGroup": "default",
            "Status": "available",
            "EarliestRestorableTime": "2022-11-05T09:47:06.251000+00:00",
            "Endpoint": "test-cluster.cluster-cluh7scr0und.ap-northeast-1.rds.amazonaws.com",
            "ReaderEndpoint": "test-cluster.cluster-ro-cluh7scr0und.ap-northeast-1.rds.amazonaws.com",
            "MultiAZ": true,
            "Engine": "mysql",
            "EngineVersion": "8.0.30",
            "LatestRestorableTime": "2022-11-05T09:55:00+00:00",
            "Port": 3306,
            "MasterUsername": "testuser",
            "PreferredBackupWindow": "19:03-19:33",
            "PreferredMaintenanceWindow": "fri:17:35-fri:18:05",
            "ReadReplicaIdentifiers": [],
            "DBClusterMembers": [
                {
                    "DBInstanceIdentifier": "test-cluster-instance-3",
                    "IsClusterWriter": false,
                    "DBClusterParameterGroupStatus": "in-sync",
                    "PromotionTier": 1
                },
                {
                    "DBInstanceIdentifier": "test-cluster-instance-2",
                    "IsClusterWriter": false,
                    "DBClusterParameterGroupStatus": "in-sync",
                    "PromotionTier": 1
                },
                {
                    "DBInstanceIdentifier": "test-cluster-instance-1",
                    "IsClusterWriter": true,
                    "DBClusterParameterGroupStatus": "in-sync",
                    "PromotionTier": 1
                }
            ],
            "VpcSecurityGroups": [
                {
                    "VpcSecurityGroupId": "sg-0b5575f7c0c8057bc",
                    "Status": "active"
                }
            ],
            "HostedZoneId": "Z24O6O9L7SGTNB",
            "StorageEncrypted": true,
            "KmsKeyId": "arn:aws:kms:ap-northeast-1:012345678910:key/38d7c968-7aac-4393-a3c5-b92349094249",
            "DbClusterResourceId": "cluster-QMFDFNRASQFYVDM2X4BE7DBDNI",
            "DBClusterArn": "arn:aws:rds:ap-northeast-1:012345678910:cluster:test-cluster",
            "AssociatedRoles": [],
            "IAMDatabaseAuthenticationEnabled": false,
            "ClusterCreateTime": "2022-11-05T09:38:18.780000+00:00",
            "EngineMode": "provisioned",
            "DeletionProtection": false,
            "HttpEndpointEnabled": false,
            "ActivityStreamStatus": "stopped",
            "CopyTagsToSnapshot": false,
            "CrossAccountClone": false,
            "DomainMemberships": [],
            "TagList": [
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:ap-northeast-1:012345678910:stack/multi-az-db-cluster/6bb45ba0-5ced-
11ed-9e75-06e89c8f4bd3"
                },
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "multi-az-db-cluster"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "MultiAZDBCluster"
                }
            ],
            "DBClusterInstanceClass": "db.r6gd.xlarge",
            "StorageType": "io1",
            "Iops": 1000,
            "PubliclyAccessible": true,
            "AutoMinorVersionUpgrade": true,
            "MonitoringInterval": 0,
            "PerformanceInsightsEnabled": false,
            "NetworkType": "IPV4"
        }
    ]
}

忘れずにお片付けを

確認が終わったので、今回作成したリソースを忘れずに削除しましょう。db.r6gd.xlargeのインスタンスが 3 台動いているので、消し忘れるとなかなかのお値段になりそうです。

CloudFormation スタックの削除を行うと、10分ほどで削除が完了しました。

RDS_multi_CloudFormation_-_stack_multi-az-db-cluster-7643260

CloudFormation スタック削除後も手動スナップショットが残っているので、必要なければ削除しましょう。

RDS_Multi_RDS__manual_snapshot_Management_Console

RDS_multi_manual_snapshot_delete_RDS_Management_Console

終わりに

CloudFormation が Amazon RDS のマルチ AZ DB クラスターをサポートした、というアップデートでした。

テンプレートのサンプルもドキュメントに載せてくれているのでサクッと試すことができ助かりました。

リソースタイプAWS::RDS::DBClusterはマルチ AZ DB クラスター専用というわけではなく Aurora DB クラスターも同じものを用いるため、対応しているプロパティの違いなどに注意してご活用ください。

以上、 チバユキ (@batchicchi) がお送りしました。

参考