よかろうもん!

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

OpsWorksでRailsアプリからAmazon RDSなどの外部DBを利用する方法

前回は、『OpsWorksでRailsをデプロイする際にasset:precompileを実施する方法』というタイトルで、デプロイフックの仕組みについて紹介しました。

今回は、Amazon RDSのようなデータベース・サーバが別インスタンスで稼働している場合を想定して、どのようにしてdatabase.ymlの値を変更すればよいかを紹介します。

まずはOpsworksでRailsアプリケーションを稼働させるためには、アプリケーション全体の設定を定義するStackの設定をしたり、Appサーバ/DBサーバなどのようなインスタンスの役割を定義するLayerの設定をしないといけないのですが、こちらについての解説は割愛します。詳細は細かいところまで丁寧に解説してくれている下記URLを参考にしてください。
http://recipe.kc-cloud.jp/archives/tag/opsworks


では、Layerにて"Rails App Server"を作成し、Appsにてソースコードリポジトリ設定まで作成できたものとして話を進めます。

Appsにてアプリケーション情報を登録して、デプロイを実行するとOpsWorksが適切な場所にアプリケーションを配備してくれます。
しかし、デプロイに成功したとしても、HTTPでアクセスしてみるとアプリケーションエラーの画面が表示されると思います。
これは、OpsWorksがバックエンドで ${RAILS_ROOT}/config/database.yml をOpsWorksが準備しているテンプレートファイルに置き換えているためです。

ちなみにテンプレートファイルはこちらになります。
f:id:interu:20130805204756p:plain
参照:https://github.com/aws/opsworks-cookbooks/blob/master-chef-11.4/rails/templates/default/database.yml.erb

見たらわかると思いますが、上記のソースコード内の @database[:設定値] の部分の値を指定してやればよいです。

具体的な設定方法としては、OpsWorksのDeploymentsにて、Run CommandのCustom Chef JSONに設定をすればよいです。

設定画面はこちらのCustom Chef JSONです。
f:id:interu:20130805204430p:plain


設定する文字列はJSON形式で、以下のようなコードになります。

{
  "deploy": {
    "アプリケーション名": {
      "database": {
        "username": "ユーザ名",
        "password": "パスワード",
        "host": "データベースサーバのIPもしくはURL",
        "adapter": "アダプタ名(mysql2 or postgres)",
        "database": "データベース名",
        "reconnect": true
      }
    }
  }
}

※アプリケーション名については前回の記事を参照してください。また、DBがMysqlでない場合はadapterを設定してください。


上記の設定でdeployを実行すると、前回のブログのデプロイフックと似たような仕組みでデプロイ処理時に database.yml を書き換えてくれるようになります。

これでアプリケーションが正常に動作するようになったはずです。
もし、設定をしてもうまく動作しないという場合は、デプロイ失敗のログを確認するか、Rails App ServerのインスタンスSSHでログインして、rootかdeployユーザにスイッチした後に、/srv/www/アプリケーション名/current/config/database.yml を確認し、適切な設定が適用されているか確認してみてください。
※RDS等のセキュリティグループで通信を許可することも忘れないでくださいね。

ちなみに、アプリケーションの改修をして再デプロイが必要になった場合は、repeatボタンを活用して上げれば、毎回Custom Chef JSONの値を設定しなくて済むので、こちらも是非利用してみてください。

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

今回、その解説をしようとするとブログが長くなってしまうので、次回のブログで本番運用を想定した設定について紹介しようと思います。

        • 2014/06 追記

OpsWorksがRDS連携対応したことで、連携していないRDSを指定している場合にadapterの指定が必須になりました。adapterを指定しないとDeploy時にconfig.ymlが生成できない旨のエラーが表示されますので慌てず設定するようにしましょう。