【小ネタ】 CloudFormationでRDSを作るときは LicenseModel を指定しよう。

【小ネタ】 CloudFormationでRDSを作るときは LicenseModel を指定しよう。

Clock Icon2025.05.24

はじめに

皆様こんにちは、あかいけです。

最近困ったことがあったので記事にしました。
これからCloudFormationでRDSを作成する方はお気をつけください。

困ったこと

まず以下は開発環境用のコードと仮定します、これは正常にスタックを作成できます。

test.yaml
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

次に以下は本番環境用のコードと仮定します、これでスタックを作成すると、

prod.yaml
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

https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBInstance.html

さいごに

以上、
CloudFormationでRDSを作るときはLicenseModelを指定しようという話でした。

初歩的な内容ではありますが、開発環境では問題なく動作したにもかかわらず、
本番環境構築の際にエラーが発生してロールバックが起きると、削除完了までかなり時間がかかり苦痛を感じます。

そのため皆さんが同じエラーに遭遇しないことを願っています…。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.