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の各種サービスのテンプレートを見つけました。
この中に、「データベースを持つ 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は設定されていませんでした。
現状ここまで
何か心当たりがあればコメントいただけると幸いです。
-
現在使えるSolutionStackNameの一覧は、CLIから
aws elasticbeanstalk list-available-solution-stacks
で確認します。 ↩