7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Aurora/AuroraServerless(V1/V2)をCloudFormationで構築するサンプルとTips

Last updated at Posted at 2022-12-04

序文

みなさん、Aurora/Aurora Serverless使ってますか?
弊社ではほとんどの案件でDBにAurora(MySQL互換)ファミリーのいずれかを採用しています。
理由は簡単で、DBのスケールに関してほぼおまかせできる、という点に尽きます。

また、2022/04/21にGAとなったAurora Serverless V2も、2022/10/05よりCloudFormationにて構築できるようになりました。
そこで今回はAuroraファミリーそれぞれをCloudFormationで構築するサンプルをご紹介していこうと思います。
なお、記述は対象となるAuroraを最低限起動できるだけのものとしていますので、必要に応じてドキュメントを参照しつつ、追加していくことを想定しています。

あ、MySQLでしか試していませんのでご了承下さいませ :bow:

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クラスタ

image.png

エンジンに 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インスタンス

image.png

インスタンスクラスに関してはエンジン・エンジンバージョンにより指定可能なもの・不可能なものがありますが、指定しないと起動できないという良く分からない縛りがあります。
指定可能なものについては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クラスタ

image.png

エンジンに 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インスタンス

image.png

こちらは特に違いがありませんね。

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クラスタ

image.png

何故か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

設定項目

image.png

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クラスタ

image.png

完全に予想通りの結果かと思います。

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インスタンスのクラス DBInstanceClassdb.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

image.png

(処理タイミングによるかもしれませんが)「スケール設定をしなさい」と怒られます。

(失敗例)バージョン指定なし

言われた通り、スケール設定だけをしてみたらこうなります。

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

image.png

ちょっと長いですが、 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

image.png

バージョン指定なし、スケール設定なしの時と同じように「スケール設定をしなさい」と怒られました。

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クラスタ

image.png

DBクラスタ自体はProvisionedと大差ありませんね。

DBインスタンス

image.png

インスタンスタイプが 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

image.png

からのフェイルオーバーもばっちり。

image.png

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

image.png

こちらも当然フェイルオーバー問題なしです。

image.png

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?