背景
- Beanstalkで作成したEC2インスタンスとRDSのDBインスタンスを接続したい
- RDSまで全部Beanstalkで作ると環境を終了(削除と同じです)したときに一緒に全部消えてしまう
- RDSは消したくない
- Beanstalkの裏で動いているのはCloudFormationなので頑張れば何でもできる
- できるだけ簡易的な方法で実現したい
下準備
- Beanstalkで作成したものは環境終了時に一緒に消えてしまうので、消えてほしくないものをこちらで先に作っておきます。
RDS
- DBインスタンスをいい感じに作って起動しておきます。
- ここではMySQLとしておきます。
SecurityGroup
- あらかじめEC2とRDSをつなぐためのセキュリティグループを作成しておきます。
- 名前はたとえば
web-db-connect
としておきます。 - このセキュリティグループにはインバウンドもアウトバウンドも何も定義しなくて大丈夫です。
- これを先ほど作成したDBインスタンスのセキュリティグループのインバウンドに、3306ポートで通信を許可するソースとして追加しておきます。
- ※ ソースに指定する場合はセキュリティグループの名前ではなくIDを指定する必要があります。
設定ファイル
- Elastic Beanstalkは
.ebextentions
ディレクトリを作成し、そこにconfigファイルを置くことで、詳細な設定ができるようになります。 - ここでDBインスタンスへの接続の設定ファイルなども作成しますが、使用する言語によっていろいろあるのでここでは省略します。
- 拡張子が
.config
であればファイル名自体は何でもよく、一つにまとめる必要もないので、いい感じにファイルを分けると保守がしやすいです。 - セキュリティグループについての設定ファイルを作成します。例えば
securitygroup.config
とでもしておいて、そこに以下の内容を記述します。
option_settings:
- namespace: aws:autoscaling:launchconfiguration
option_name: SecurityGroups
value: web-db-connect
- ここで指定した
web-db-connect
はもちろん先ほど作成したセキュリティグループの名前です。
環境の作成
- あとはEB CLIにしたがって環境を作成します。
- 自動作成されるセキュリティグループとこちらで作成したセキュリティグループの両方がEC2インスタンスにアタッチされ、いい感じにRDSに接続できるようになっています。
- 裏で動いているのがCloudFormationであることからもわかるように、環境作成後に後から手で設定をいじると環境を終了するときに失敗してしまうのですが、あらかじめ外で作った置いたものを参照して環境を作成した場合だと問題なく終了できますし、外で作ったものが削除されてしまうこともありません。