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


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

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

## 発生時の状況

CloudFormationのテンプレートは、[オプションの値 - Elastic Beanstalk](http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/command-options.html) を見ながら以下のように設定しました。

（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](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-using-cloudformer.html)

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](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/sample-templates-services-ap-northeast-1.html#d0e52856)

この中に、「データベースを持つ 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`で確認します。