2008年6月11日水曜日

Amazon EC2とS3を使ってみる(その3 EC2onRailsセットアップ編)

EC2上でRailsを便利に扱うためのEC2onRailsというプラグインがあるみたい。

でも、日本語でのEC2onRailsの情報は少ないので、以下で解説しちゃいます。

まず、このプラグインはEC2のAMI+Capistranoの拡張プラグインとして配布されているもので、インスタンスへのデプロイや、インスタンス上のMySQLやログについて、S3にバックアップなどを自動的に行ってくれるみたい。

配布されているEC2onRailsのAMIはほとんどまっさら状態なので、このまっさらの状態のサーバから、必要なパッケージやgemをインストールし、必要なサービスを起動するところまでやってくれる。

その分、deploy.rbが複雑になっているので、日本からの初期設定として使いやすい(と思われる)設定とコメントの日本語化を行ったので、置いておきます。(暇があったらパッチを作者に送っておきます)

EC2onRails本家に習ったセットアップ手順(基本的にちょーショートカット意訳)

前準備

  • 動作可能なRailsアプリケーションが準備できている事。EC2onRailsではrails 1.2.6と2.0.2が準備されています。(もちろんgemを追加すれば好きなバージョンが利用できます)
  • capistranoがインストールされている事。これはgem install capistranoでインストールできます。
  • capistranoの設定に対して、ある程度の知識を有すること。capistranoの設定はちょっと特殊っぽいので、うまく動くまで何度かトライすることになると思います。各タスクの実行結果を見ながら、deploy.rbを微調整できる程度の知識が必要となります。ある程度のノウハウはこちらのwikiにまとめてあります。
  • capify .して置く事
  • deploy.rbの:server_config_files_rootに指定したディレクトリ(例えば "../server_config")に、インスタンスに配置したいファイルやディレクトリを入れておく事。これは/etc/hostsなど、サーバ上のファイルを置き換えるためにあるんだと思う。(この場合は"../server_config/etc/hosts"という風に配置する)

1.gemのインストール

EC2onRailsはgemとAMIがセットで動きます。バージョンも合わせておく必要があります。

sudo gem install ec2onrails

2.設定ファイルの配置

以下の3ファイルをダウンロードして配置し、s3.ymlとdeploy.rbについては、ある程度設定を埋めておく必要があります。(インスタンスを起動しないと設定をすべて埋める事は出来ません)

  • EC2onRailsはcapistranoの拡張として動くのですが、インクルードするファイルを切り替えているようなので、こちらのCapfile(本家と同じもの。ver0.9.8.1用)に差し替えておく必要があります。
  • S3へのアクセス用に、railsアプリケーションのconfigディレクトリ以下にs3.yml(本家と同じもの。ver0.9.8.1用)を配置しておく必要があります。
  • capistranoからのデプロイ用に、railsアプリケーションのconfigディレクトリ以下にdeploy.rb(本家と同じもの。コメントを日本語に意訳したものを下に貼っておきます。ver0.9.8.1用)を配置しておく必要があります。



# EC2 on Rails用Capistranoサンプルconfigファイル ver 0.9.8.1用

set :application, "yourapp" # 自分のアプリケーション名に変えておく

#set :deploy_via, :copy # オプション, 詳しくはCapistrano docsを見るべし

#set :copy_strategy, :export # オプション, 詳しくはCapistrano docsを見るべし

# ec2インスタンスからアクセス可能なsubversionリポジトリを指定する

# もしsubversionなどへのアクセスにユーザ名が必要であれば、以下のようにします

# set :repository, "--username your_user_name --password your_password http://svnservers.example.com/path/to/repos"

set :repository, "http://svn.foo.com/svn/#{application}/trunk"

# Capistranoでは公開鍵と秘密鍵を同じフォルダに格納しておく必要があります。

# 公開鍵の拡張子は".pub"である必要があります。

# この鍵は、前もってec2-add-keypairコマンドで作成しておいたもので、

# 通常であれば秘密鍵はあなたの手元にあるはずですが、公開鍵はamazon側で管理しており、

# 手元には無いはずです。これはインスタンス起動時にサーバにコピーされますので、

# インスタンスを先に起動して、サーバから公開鍵をコピーしてくることで取得できます。

# EC2 on Railsでは、/root/.ssh/authorized_keysから、あなたのPCにコピーしてくるための

# 専用タスク

# cap ec2onrails:get_public_key_from_server

# が用意されています。

# 下記では、ec2-add-keypairコマンドで作成しておいた秘密鍵へのパスを指定します。

# cap ec2onrails:get_public_key_from_serverタスク実行後に、秘密鍵名.pubという

# 名前で公開鍵が保存され、以後秘密鍵と共にcapistranoによって使われます。

ssh_options[:keys] = ["#{ENV['HOME']}/ec2-keys/id_#{application}"]

# EC2インスタンス情報

# インスタンス起動後にPublicDNS側をコピーして貼ってください

# 一括指定用

set :masterdomain, "ec2-12-xx-xx-xx.z-1.compute-1.amazonaws.com"

role :web, masterdomain

role :app, masterdomain

role :db, masterdomain, :primary => true

role :memcache, masterdomain

# もしくは、文字列で指定する

#role :db, "ec2-21-xx-xx-xx.z-1.compute-1.amazonaws.com", :primary => true

# 起動させる環境

set :rails_env, "production"

# EC2 on Rails config

set :ec2onrails_config, {

# ec2onrails:db:restoreタスク(バックアップからのリストア)用のS3ブラケット名とサブフォルダ名

# 通常サブフォルダ名は"database"でいいはずです

:restore_from_bucket => "your_app_bucket",

:restore_from_bucket_subdir => "database",

# ec2onrails:db:archiveタスク(バックアップ)用のS3ブラケット名

:archive_to_bucket => "your-other-bucket",

# MySQLユーザのrootのパスワード。

# デフォルトではパスワードは設定されていないため、そのまま公開するのは危険です。

# EC2 on Railsでは

# cap ec2onrails:db:set_root_password

# タスクにより、MySQLのrootユーザのパスワードを設定できます。

# database.ymlの設定と合わせてrootのパスワードを指定してください。

# (パスワードが空のままではうまくセットアップできないようです)

:mysql_root_password => "your-mysql-root-password",

# 必要であれば以下のUbuntuのパッケージをインストールすることができます

:packages => ["logwatch", "imagemagick", "libmagick9-dev"],

# 必要であれば以下のRubyGemsをインストールすることができます

# "gemname"または"gemname -v 1.0.1"と指定してください

:rubygems => ["gettext", "rmagick -v 1.15.13", "rfacebook -v 0.9.7"],

# サーバで使用するタイムゾーンを指定します

# "cap -e ec2onrails:server:set_timezone"を起動してください

:timezone => "Asia/Tokyo",

# 所有者rootとしてサーバに配備するファイル群。

# 下記ディレクトリ以下に配置されたサブディレクトリやファイルは

# ec2onrails:server:install_packages

# タスクなどによって、サーバの/(ルートディレクトリ)にroot:root 644として配置されます。

# なお、標準では/mnt/appにrailsアプリケーションが配置されます。

:server_config_files_root => "../server_config",

# もしconfigファイルが配置された時、サービスを再起動する必要があるかもしれないデーモン

:services_to_restart => %w(apache2 postfix sysklogd),

# adminユーザからの転送メールアドレスを指定します

:admin_mail_forward_address => "you@yourdomain.com",

# このサーバでSSLを有効化するときはtrueを指定します。

# SSLサーバ証明書は

# /etc/ssl/certs/default.pem

# 秘密鍵は

# /etc/ssl/private/default.key

# に保存されている必要があります

:enable_ssl => true

}



※Bloggerでテキストをアップロードする方法ってないんでしょうかね?

3.インスタンスの起動

起動すべき(railsプラグインと同じバージョンの)AMIのIDは

cap ec2onrails:ami_ids

で確認できます。

このあたりはまとめサイト参照。

4.公開鍵の取得

Amazon EC2とS3を使ってみる(その2)でも振れているが、

cap ec2onrails:get_public_key_from_server

でサーバから公開鍵をローカルPCにコピーしてきてくれる。コピーした公開鍵と、対になっている秘密鍵を使ってcapistranoが動いてくれるみたい。

5.デプロイ

いよいよデプロイ。なので、ここまでにs3.ymlとdeploy.rbを埋めておく事。

cap ec2onrails:setup

ec2onrails:setupタスクは色々してくれます。
  • インスタンスへの秘密鍵を使ったログイン
  • deploy.rbで指定されたubuntuのパッケージのインストール
  • deploy.rbで指定されたGemのインストール
  • deploy.rbのserver_config_files_rootで指定されたファイルをインスタンスに転送して/(ルートディレクトリ)に被せる。たぶん/etc/hostsとか/etc/aliasesなんかを変更したい人用なんだろうねぇ
  • /mntの中にmysqlとrailsアプリのためのディレクトリを作る(本来のcapistranoのタスク)

すばらすぃ

cap deploy:cold

deploy:coldタスクも色々してくれます

  • deploy.rbで指定されたsubversionなどのリポジトリから、最新のソース一式をインスタンスに配置する( 本来のcapnistranoタスク)
  • インスタンス上のapacheやMySQLなどを起動してくれる(このタスクが実行されるまでは起動していない)
  • インスタンス上のMySQLのrootユーザにパスワードを付けてくれる(デフォルトではパスワードは無い)
  • インスタンス上のMySQLにdeploy.rbで指定された(productionなどの)環境用のデータベース(hoge_productionなど)を作ってくれる
  • Railsアプリを起動するためのapacheのconfとか、リバースプロキシ絡みの設定ファイルを自動生成してくれる
これもすんばらすぃ

あーでも、Railsの実行はapache+mod_proxy_balancer+mongrel_clusterになっていて、1インスタンス1Railsアプリケーションという考えなので、1インスタンスで複数のRailsアプリケーションを動かしたい場合は、改造が必要みたい。

cap deploy

普通のcapistranoタスク。以後ソースのアップデートにはこちらのタスクを使います。

参考

Amazon EC2でRailsを使いたい方は「EC2 on Rails」

EC2 on Railsが採用しているubuntu-gustyのパッケージ一覧


なんか、リバースプロキシの設定ファイルを作るあたりを、passengerに置き換えると、複数ドメインの対応も楽になる気がするんだよなぁ、ってところで、自分が作っていたRailsアプリのgemが衝突して動かなくなってしまったので、検証できず…

rails ver 2.1.0で作り直して再チャレンジした結果をその4あたりにまとめます。


1 件のコメント:

まいむぞう さんのコメント...

EC2onRails作者のPaul Dowmanさんに、日本語版のdeploy.rb(このブログに貼ったものと同じもの)をリポジトリに加えてもらうように頼んでみたので、うまくいけば配布されるかもしれません。