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