AMIとバージョン管理とcapistrano

別にEC2じゃなくてもいいんだけど、AMIとかのイメージファイルはハードディスクをそのまんまコピーしておくようなものなので、バージョン管理は面倒くさい。通常既にあるイメージファイルからインスタンスを作って、それをバージョンアップして新たにイメージファイルを作る感じになる。でもそれだと急ぎのリリースの時にちゃちゃっとやったライブラリのインストールとかファイルの変更とか、ドキュメントにならない部分が発生する可能性がある。メンテする時間の長いプロジェクトほど発生すると思う。かと言ってAMIを作るたびに環境設定からやり直すのは面倒くさい。

というわけで、サーバーのセットアップは自動化した方がいいよね、って感じなんですが、実際やってみるとちょっと面倒。

コミットしたくないファイル、情報

例えばEC2ならpk-xxx.pem, cert-xxx.pemやaccess key, secret access keyなどがあるけど、これは例えば ~/.ec2 などに集めちゃうのが楽。複数のAWSのアカウントを使うなら.ec2はsymlinkにする。で、deploy.rbには以下のように書いておく。

set :account_id, `cat ~/.ec2/account_id` # 直接ここに書きたくないので、ファイルからロードしています
set :access_key_id, `cat ~/.ec2/access_key` # 直接ここに書きたくないので、ファイルからロードしています
set :secret_access_key, `cat ~/.ec2/secret_access_key` # 直接ここに書きたくないので、ファイルからロードしています
set :pk, "pk-CERDVFTPAM4K6PEDA7S2NQG5VVGUQZZK.pem"
set :cert, "cert-CERDVFTPAM4K6PEDA7S2NQG5VVGUQZZK.pem"

これで重要な情報はコミットせずに、別途配布できるようになります。

デプロイ対象の指定

お手軽なのは環境変数かなと。

ENV_EC2_TARGET = "EC2_INSTANCE_ADDRESS"
raise "You must set #{ENV_EC2_TARGET}" unless ENV[ENV_EC2_TARGET]

set :instance_address, ENV[ENV_EC2_TARGET]

role :app, instance_address
role :web, instance_address
role :db,  instance_address, :primary => true

インスタンスを起動するたびにデプロイ対象は変わるので、その作業ごとで環境変数を設定してやればいいかなど。

マイグレーション

書いてて思ったんだけど、こういうのってRailsマイグレーションみたいに管理できないかなーと思ってきました。gemのインストールはrake gems:installでもいいんだけど、OS、ライブラリによっては別途インストールが必要なものがあったりするし、出来る限り自動化して、そのままドキュメントになってほしいなー。そういうツールもうあったりして。あとで探してみよう。