【小ネタ】 CloudFormationでRDSを作るときは LicenseModel を指定しよう。
はじめに
皆様こんにちは、あかいけです。
最近困ったことがあったので記事にしました。
これからCloudFormationでRDSを作成する方はお気をつけください。
困ったこと
まず以下は開発環境用のコードと仮定します、これは正常にスタックを作成できます。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
SQLServerDB:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceClass: db.t3.large
Engine: sqlserver-ex
EngineVersion: 16.00.4175.1.v1
AllocatedStorage: 20
MasterUsername: admin
ManageMasterUserPassword: true
次に以下は本番環境用のコードと仮定します、これでスタックを作成すると、
AWSTemplateFormatVersion: '2010-09-09'
Resources:
SQLServerDB:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceClass: db.m5.large
Engine: sqlserver-se
EngineVersion: 16.00.4175.1.v1
AllocatedStorage: 20
MasterUsername: admin
ManageMasterUserPassword: true
以下のエラーが発生してスタックの作成が失敗します。
なぜ開発環境は大丈夫だったんだろう…。
Resource handler returned message: "The LicenseModel parameter is required for configurations with multiple options.
原因と解消方法
まず解消方法ですがエラーにも出ている通り、
LicenseModel の指定を追加してあげると正常にスタックが作成できます。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
SQLServerDB:
Type: AWS::RDS::DBInstance
Properties:
DBInstanceClass: db.m5.large
Engine: sqlserver-se
EngineVersion: 16.00.4175.1.v1
AllocatedStorage: 20
MasterUsername: admin
ManageMasterUserPassword: true
LicenseModel: license-included
次に具体的な原因ですが、エディション (CloudFormation上ではEngine) が関係しています。
例えば今回は Microsoft SQL Server でしたが、以下のようにLicenseModelを指定しなくても作成できるエディション、指定が必須のエディションがありました。
- SQL Server Express Edition
- 指定なしでもOK
- SQL Server Web Edition
- 指定なしでもOK
- SQL Server Standard Edition
- 指定必須
- SQL Server Enterprise Edition
- 指定必須
ただLicenseModelはドキュメント上でもオプション設定となっており、
初見だとスルーしてしまうこともあるのではないでしょうか。 (1敗)
またOracleの場合は以下の通りでした。
- Oracle Enterprise Edition
- 指定なしでもOK
- Oracle Standard Edition Two
- 指定必須
以上の結果からエディションが複数あるエンジンは、LicenseModelは必ず指定した方がいいでしょう。
ただ個人的には、コード差分をなくすためにも他のエンジンでも一律でLicenseModelを指定するのがいいかなと思いました。
なお各エンジンごとに指定できるLicenseModelは以下の通りです。
- Aurora MySQL - general-public-license
- Aurora PostgreSQL - postgresql-license
- RDS for Db2 - bring-your-own-license. For more information about RDS for Db2 licensing, see https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/db2-licensing.html in the Amazon RDS User Guide.
- RDS for MariaDB - general-public-license
- RDS for Microsoft SQL Server - license-included
- RDS for MySQL - general-public-license
- RDS for Oracle - bring-your-own-license or license-included
- RDS for PostgreSQL - postgresql-license
さいごに
以上、
CloudFormationでRDSを作るときはLicenseModelを指定しようという話でした。
初歩的な内容ではありますが、開発環境では問題なく動作したにもかかわらず、
本番環境構築の際にエラーが発生してロールバックが起きると、削除完了までかなり時間がかかり苦痛を感じます。
そのため皆さんが同じエラーに遭遇しないことを願っています…。