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 を配置してくれます。
staging環境などではあまり複数台構成にしたりしないため、なかなか気づかないハマりポイントですので、本番稼働をする前に設定を確認しておいてください。
なお、この情報は2013年年末時点で検証した結果ですので、もしかするとすでに改善されているかもしれません。情報をお持ちの方はぜひコメントいただければと思います。