よかろうもん!

アプリからインフラまで幅広くこなすいまどきのクラウドエンジニアが記す技術ブログ

OpsWorksでRailsアプリを動かす際に注意しておきたいデータベース接続の設定

半年くらい前に『OpsWorksでRailsアプリからAmazon RDSなどの外部DBを利用する方法』というブログを書きましたが、その記事の後半で

今回紹介した方法(deploy時にCustom Chef JSONを指定)を本番環境に適用して運用しようとすると、いつの日かサービスダウンを招いてしまうことになってしまうため、注意が必要です

と記載していました。あとで書くと言っておきながら全然書いていなかったので、そろそろその理由と対策方法について紹介します。

こちらの記事では、DeploymentsのCustom Chef JSONにてデータベース接続設定を記載していました。そのため、アプリケーションのデプロイの度に database.yml がアップデートされます。これは想定内の動きですよね。

ですが、ここで同じレイヤのインスタンスを新しく追加して、それを起動してみてください。
新しく立ち上げたインスタンスが起動する頃には、今まで正常にアクセスできていたアプリケーションにアクセスできなくなっているはずです。

これは、スタックの状態変化(新規インスタンスの起動)をトリガーとして、Configureイベントが発動したことで、Railsサーバ全てのシステム設定が整合性のとれた状態に変更され database.yml が削除されてしまったためです。ちなみにこのConfigureイベントは、インスタンスの起動だけでなく停止した場合にも発動します。

詳細はOpsWorksのドキュメントに詳しく書いてあるため是非読んでみてください。


では、database.yml が削除されないようにするにはどうしたらよいでしょうか。

Deployイベント発動時に設定するCustom JSONにデータベース接続情報を入れるのではなく、スタック自体に設定すれば大丈夫です。
スタックに設定すればConfigureイベントが発動した時も、スタックのCustom JSONの情報を参照し、適切な database.yml を配置してくれます。


f:id:interu:20140310205546p:plain


staging環境などではあまり複数台構成にしたりしないため、なかなか気づかないハマりポイントですので、本番稼働をする前に設定を確認しておいてください。

なお、この情報は2013年年末時点で検証した結果ですので、もしかするとすでに改善されているかもしれません。情報をお持ちの方はぜひコメントいただければと思います。