序文
みなさん、Aurora/Aurora Serverless使ってますか?
弊社ではほとんどの案件でDBにAurora(MySQL互換)ファミリーのいずれかを採用しています。
理由は簡単で、DBのスケールに関してほぼおまかせできる、という点に尽きます。
また、2022/04/21にGAとなったAurora Serverless V2も、2022/10/05よりCloudFormationにて構築できるようになりました。
そこで今回はAuroraファミリーそれぞれをCloudFormationで構築するサンプルをご紹介していこうと思います。
なお、記述は対象となるAuroraを最低限起動できるだけのものとしていますので、必要に応じてドキュメントを参照しつつ、追加していくことを想定しています。
あ、MySQLでしか試していませんのでご了承下さいませ
Aurora (provisioned) / Engine: aurora
はい、トップバッターの無印Auroraです。
Serverlessとの区別のためにあえて「provisioned(プロビジョンド)」と言ったりもします。
また、後述しますがエンジンをauroraと指定するとMySQL5.6互換のものとなります。
ここではあえて2台(Writer/Reader各1台ずつ)のインスタンスを持たせていますが、当然1台でも問題ありません。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora
MasterUsername: user
MasterUserPassword: password
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora
DBInstanceClass: db.t2.small
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora
DBInstanceClass: db.t2.small
DBクラスタ
エンジンに aurora
とだけ指定するとMySQL5.6互換のクラスタが作成されます。
今回は 5.6.mysql_aurora.1.22.5
が作成されましたが、実行時期により変動します。
事前にどのバージョンが作られるかを調べる際にはAWS CLIで以下のように実行すると分かります。
$ aws rds describe-db-engine-versions --engine aurora --default-only | jq -r '.DBEngineVersions[].EngineVersion'
5.6.mysql_aurora.1.22.5
DBインスタンス
インスタンスクラスに関してはエンジン・エンジンバージョンにより指定可能なもの・不可能なものがありますが、指定しないと起動できないという良く分からない縛りがあります。
指定可能なものについてはAWS CLIにて取得可能です。
$ aws rds describe-orderable-db-instance-options --engine aurora --engine-version 5.6.mysql_aurora.1.22.5 | jq -r '.OrderableDBInstanceOptions[].DBInstanceClass'
db.r3.2xlarge
db.r3.4xlarge
db.r3.8xlarge
db.r3.large
db.r3.xlarge
db.r4.16xlarge
db.r4.2xlarge
db.r4.4xlarge
db.r4.8xlarge
db.r4.large
db.r4.xlarge
db.r5.12xlarge
db.r5.16xlarge
db.r5.24xlarge
db.r5.2xlarge
db.r5.4xlarge
db.r5.8xlarge
db.r5.large
db.r5.xlarge
db.t2.medium
db.t2.small
db.t3.medium
db.t3.small
Aurora (provisioned) / Engine: aurora-mysql
続いて無印Auroraのエンジンを aurora-mysql
としたものです。
上のものと比較すると Engine: aurora-mysql
の部分しか違いがないことが確認できます。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
MasterUsername: user
MasterUserPassword: password
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.t2.small
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.t2.small
DBクラスタ
エンジンに aurora-mysql
と指定すると現在はMySQL5.7互換のクラスタが作成されますが、もしかするといずれはMySQL8.0互換となるかもしれません。
$ aws rds describe-db-engine-versions --engine aurora-mysql --default-only | jq -r '.DBEngineVersions[].EngineVersion'
5.7.mysql_aurora.2.10.2
DBインスタンス
こちらは特に違いがありませんね。
Aurora Serverless (v1) / Engine: aurora
ServerlessのV1です。
Serverless V1はインスタンスサイズが負荷状況に応じて自動的にスケールするのでインスタンスというものを指定する必要がありません。
そのためテンプレートもすごくシンプルです。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora
EngineMode: serverless
MasterUsername: user
MasterUserPassword: password
DBクラスタ
何故かServerlessだと設定変更画面に行かないとバージョンが表示されないのですが、provisionedのときと同様に、エンジンに aurora
だけを指定するとMySQL5.6互換となります。
AWS CLIでServerlessに限定して調べる際には以下のようなフィルタを指定します。
$ aws rds describe-db-engine-versions --engine aurora --filters Name=engine-mode,Values=serverless --default-only | jq -r '.DBEngineVersions[].EngineVersion'
5.6.mysql_aurora.1.22.3
設定項目
Serverlessで設定される項目は上記の通りとなります。
テンプレートで以下のようなものを書いたのと同じ・・・と言いたいところですが、「オートスケーリングのタイムアウト」時間を指定(SecondsBeforeTimeout
)することが(執筆時点では)できません。
Undefined
ではなく Not Permitted
として怒られる
Properties validation failed for resource DBCluster with message: #/ScalingConfiguration: extraneous key [SecondsBeforeTimeout] is not permitted
ScalingConfiguration:
MinCapacity: 2
MaxCapacity: 16
# SecondsBeforeTimeout: 300
TimeoutAction: RollbackCapacityChange
AutoPause: true
SecondsUntilAutoPause: 300
Aurora Serverless (v1) / Engine: aurora-mysql
Serverless V1のエンジン指定です。
変更点は Engine: aurora-mysql
部分だけですね。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineMode: serverless
MasterUsername: user
MasterUserPassword: password
DBクラスタ
完全に予想通りの結果かと思います。
aws rds describe-db-engine-versions --engine aurora-mysql --filters Name=engine-mode,Values=serverless --default-only | jq -r '.DBEngineVersions[].EngineVersion'
5.7.mysql_aurora.2.08.3
Aurora Serverless V2(失敗集)
さて、Aurora Serverless V2ですがいささか複雑です。以前の記事でも触れたように、ServerlessのV2というよりはProvisionedにServerlessを組み合わせた感じになっています。
そのためテンプレートのベースはServerlessではなく、Provisionedの方に近く、DBインスタンスのクラス DBInstanceClass
に db.serverless
を指定したものがServerless V2インスタンスとなります。
また、Serverless V1と違い、設定項目が必須となっている部分が多数存在します。
エンジンには aurora
ではなく aurora-mysql
を指定していますが理由は後述します。
まずはできそうでできないパターンをいくつか。
(失敗例)バージョン指定なし、スケール設定なし
Aurora (provisioned) / Engine: aurora-mysql
のテンプレートとほとんど一緒になります。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
MasterUsername: user
MasterUserPassword: password
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
(処理タイミングによるかもしれませんが)「スケール設定をしなさい」と怒られます。
(失敗例)バージョン指定なし
言われた通り、スケール設定だけをしてみたらこうなります。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
MasterUsername: user
MasterUserPassword: password
ServerlessV2ScalingConfiguration:
MinCapacity: 0.5
MaxCapacity: 1.0
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
ちょっと長いですが、 db.serverless
インスタンスは 5.7.mysql_aurora.2.10.2
では指定できません、的なことで怒られます。
ここで 5.7.mysql_aurora.2.10.2
が出てきたのはエンジンに aurora-mysql
だけを指定したので、デフォルトのバージョンが選択された、ということになります。
(失敗例)スケール設定なし
両方設定しないとならないんだろうな、とは思うものの、せっかくなのでバージョンは指定したけどスケール設定をしなかった場合。
※ バージョン指定部分については後述します
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 8.0.mysql_aurora.3.02.1
MasterUsername: user
MasterUserPassword: password
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
バージョン指定なし、スケール設定なしの時と同じように「スケール設定をしなさい」と怒られました。
Aurora Serverless V2
お待ちかね、V2のテンプレートです。
先に述べた通り、基本的にはProvisionedのAuroraをベースに、クラスタには(適切なバージョンと)スケール設定をし、DBインスタンスクラスとして db.serverless
を指定したものがServerless V2となります。
しかしながら、Provisionedの時と同様に「エンジン・エンジンバージョンにより指定可能なもの」が決められています。
「DBインスタンスクラスにコレを指定できるやつ」はAWS CLIで以下のようにすることで参照できます。
$ aws rds describe-orderable-db-instance-options --engine aurora --db-instance-class db.serverless | jq -r '.OrderableDBInstanceOptions[].EngineVersion'
※ 結果なし
$ aws rds describe-orderable-db-instance-options --engine aurora-mysql --db-instance-class db.serverless | jq -r '.OrderableDBInstanceOptions[].EngineVersion'
8.0.mysql_aurora.3.02.0
8.0.mysql_aurora.3.02.1
8.0.mysql_aurora.3.02.2
※ 執筆時にコマンド実行してみたら 8.0.mysql_aurora.3.02.2
が増えてましたが、実験時には 8.0.mysql_aurora.3.02.1
が最新だったのでテンプレート等もそれで通しています
ということで、Serverless V2に対応したクラスタを構築する際にはエンジンを aurora-mysql
にし、エンジンバージョンには 8.0.mysql_aurora.3.02.x
を指定する必要がる、ということになります。
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 8.0.mysql_aurora.3.02.1
MasterUsername: user
MasterUserPassword: password
ServerlessV2ScalingConfiguration:
MinCapacity: 0.5
MaxCapacity: 1.0
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBクラスタ
DBクラスタ自体はProvisionedと大差ありませんね。
DBインスタンス
インスタンスタイプが Serverless v2
となっています。
Aurora Serverless V2 (provisioned-mix)
テンプレート的にはProvisionedとServerless V2にほとんど差がないことがお分かりいただけたと思います。
これはインスタンスの片方をProvisionedなものにしても動作する、ということでもあります。
ちなみにインスタンスクラスに db.t4g.medium
を指定しているのは 8.0.mysql_aurora.3.02.1
で指定できるインスタンスで一番(安くて)小さいサイズだから、という理由です。
$ aws rds describe-orderable-db-instance-options --engine aurora-mysql --engine-version 8.0.mysql_aurora.3.02.1 | jq -r '.OrderableDBInstanceOptions[].DBInstanceClass'
db.r5.12xlarge
db.r5.16xlarge
db.r5.24xlarge
db.r5.2xlarge
db.r5.4xlarge
db.r5.8xlarge
db.r5.large
db.r5.xlarge
db.r6g.12xlarge
db.r6g.16xlarge
db.r6g.2xlarge
db.r6g.4xlarge
db.r6g.8xlarge
db.r6g.large
db.r6g.xlarge
db.r6i.12xlarge
db.r6i.16xlarge
db.r6i.24xlarge
db.r6i.2xlarge
db.r6i.32xlarge
db.r6i.4xlarge
db.r6i.8xlarge
db.r6i.large
db.r6i.xlarge
db.serverless
db.t3.large
db.t3.medium
db.t4g.large
db.t4g.medium
db.serverless
+ db.t4g.medium
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 8.0.mysql_aurora.3.02.1
MasterUsername: user
MasterUserPassword: password
ServerlessV2ScalingConfiguration:
MinCapacity: 0.5
MaxCapacity: 1.0
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.t4g.medium
からのフェイルオーバーもばっちり。
db.t4g.medium
+ db.serverless
AWSTemplateFormatVersion: 2010-09-09
Resources:
DBCluster:
Type: AWS::RDS::DBCluster
Properties:
Engine: aurora-mysql
EngineVersion: 8.0.mysql_aurora.3.02.1
MasterUsername: user
MasterUserPassword: password
ServerlessV2ScalingConfiguration:
MinCapacity: 0.5
MaxCapacity: 1.0
DBInstance1:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.t4g.medium
DBInstance2:
Type: AWS::RDS::DBInstance
Properties:
DBClusterIdentifier: !Ref DBCluster
Engine: aurora-mysql
DBInstanceClass: db.serverless
こちらも当然フェイルオーバー問題なしです。