AWS
ElasticBeanstalk
CloudFormation
CloudFormer

【トラブルシューティング】CloudFormationでElasticBeanstalkのRDSが生成されない

More than 3 years have passed since last update.

CloudFormationでElasticBeanstalk環境の中にRDSを構築しようとしたのですが、RDSが生成されない事象に見舞われましたので情報を共有します。

なお、 現状シューティングできていません のでただのトラブル調査ログです。

発生時の状況

CloudFormationのテンプレートは、オプションの値 - Elastic Beanstalk を見ながら以下のように設定しました。

(AWS::ElasticBeanstalk::ConfigurationTemplateのOptionSettingsのうち、RDSに関係する部分を抜粋)

        "OptionSettings": [          {
            "Namespace": "aws:ec2:vpc",
            "OptionName": "DBSubnets",
            "Value": "subnet-******"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBAllocatedStorage",
            "Value": "20"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBDeletionPolicy",
            "Value": "Delete"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBEngine",
            "Value": "mysql"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBEngineVersion",
            "Value": "5.5"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBInstanceClass",
            "Value": "db.t1.micro"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBUser",
            "Value": "******"
          },
          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "MultiAZDatabase",
            "Value": "true"
          }
        ]

この設定でCloudFormationでスタックを生成すると、特にエラーは発生しませんが、ElasticBeanstalk環境の中にRDSの設定がされませんでした。

CloudFormerを使ってテンプレートを出力

原因調査のため、手動でElasticBeanstalk環境の中にRDSを設定し、それをCloudFormer(AWSの設定をCloudFormationのテンプレート形式で出力するツール)を使ってテンプレートを出力し、最初に作ったテンプレートとの差分を確認することにしました。

CloudFormerの使い方は以下のページを参考にします。(細かい手順はリンク先にあるので省略します)

CloudFormer を使用して既存の AWS リソースから AWS CloudFormation のテンプレートを作成する - AWS CloudFormation

CloudFormerはそれ自体のCloudFormationテンプレートが提供されており、簡単にCloudFormerのインスタンスが作れました。また、使わない時には停止しておけば料金もかからないので、環境に一つ用意しておくといいですね。

CloudFormerへは、CloudFormation画面でCloudFormerのスタックを選択し、下ペインのOutputsタブにあるWebsiteURLからアクセスが出来るようになっています。

アクセスしたらあとは対話的な画面が続き、テンプレートに出力したい項目を選択していきます。出力できるAWSの機能は全てではないですが、基本的な機能は対応していました。ElasticBeanstalkも出力できました。

原因調査

テンプレートが出力できたので、最初に作ったテンプレートとの差分を比較します。

1つ目の差分はDBEngineVersionが5.5ではなく5.6でしたので、元のテンプレートを修正してCloudFormationのスタックをアップデートします。

          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBEngineVersion",
            "Value": "5.6"
          },

すると以下のエラーが発生しロールバックされました。

Configuration validation exception: Missing value for required parameter: AWSEBDBPassword

DBのパスワードが必須なのかと思い、2つ目の差分であるDBPasswordの設定を追加し、再びCloudFormationのスタックをアップデートします。

          {
            "Namespace": "aws:rds:dbinstance",
            "OptionName": "DBPassword",
            "Value": "******"
          },

やはり同じエラーが発生しロールバックされました。

項目名が間違っているのかと思い、DBPasswordをAWSEBDBPasswordに修正して再びCloudFormationのスタックをアップデートすると、今度はそのような名前の項目は無いというエラーが発生しロールバックされました。

Configuration validation exception: Invalid option specification (Namespace: 'aws:rds:dbinstance', OptionName: 'AWSEBDBPassword'): Unknown configuration setting.

また、その他の差異として、CloudFormerから出力したテンプレートのAWS::RDS::DBInstanceの設定には、TagsにElasticBeanstalkとの紐付けの設定がありました。

        "Tags": [
          {
            "Key": "Name",
            "Value": "******-application-01"
          },
          {
            "Key": "elasticbeanstalk:environment-name",
            "Value": "******-application-01"
          },
          {
            "Key": "elasticbeanstalk:environment-id",
            "Value": "******"
          }
        ]

これを定義したテンプレートでCloudFormationのスタックを生成してみましたが、RDSは生成されますがElasticBeanstalkの環境には紐付いていませんでした。

サンプルテンプレートを使ってみる

その後別の方法を調べていくと、CloudFormationの各種サービスのテンプレートを見つけました。

サービス - AWS CloudFormation

この中に、「データベースを持つ Elastic Beanstalk サンプルアプリケーション」というテンプレートがあったので、これでスタックを生成してみます。

No Solution Stack named '64bit Amazon Linux 2014.03 v1.0.9 running Tomcat 7 Java 7' found.

エラーが出ました。どうやらSolutionStackNameが古いようなので1現在使える64bit Amazon Linux 2014.03 v1.1.0 running Tomcat 7 Java 7に変更してもう一度スタックを生成してみます。

エラーはなくなりましたが、やはりElasticBeanstalk環境にはRDBは設定されていませんでした。

現状ここまで

何か心当たりがあればコメントいただけると幸いです。


  1. 現在使えるSolutionStackNameの一覧は、CLIからaws elasticbeanstalk list-available-solution-stacksで確認します。