Railsアプリケーションを公開するならAssets on Cloudパターンを使おう

Assets on Cloudパターンとは

「Assets on Cloudパターン」*1Railsデザインパターン*2の一つ。Railsアプリケーションの静的なコンテンツ(Assets)をクラウドに配置するパターンである。ファイルサイズの大きい画像などをクラウドに配置することでウェブサーバへのリクエストを減らし、ネットワークリソースを節約する。
Assetsの配置先はAmazon S3を推奨する。

asset_syncの使い方

「Assets on Cloudパターン」はasset_syncというgemを利用する。

Amazon S3の設定方法

asset_syncを設定する前にAmazon S3バケットを作っておく。バケット名を自分が持ってるドメインサブドメインと同じにしておくと少しだけ幸せになれる。ドメインを持っていない場合、適当なバケット名でもいいが、全世界で一意にする必要がある。(他の人と同じバケット名でバケットを作成することができないので注意)
また、国内ならRegionをTokyoにしておかないと、ネットワークの速度が遅くなってしまうので注意。
以降はTokyoリージョンに作成したassets.example.comというバケットで説明を進める。

asset_syncの設定方法

Gemfileに以下の記述を追加する。

gem 'asset_sync'

以下の内容でconfig/asset_sync.ymlを用意する。

defaults: &defaults
  fog_provider: 'AWS'
  fog_directory: 'assets.example.com'
  fog_region: 'ap-northeast-1'
  aws_access_key_id: '<AWSのACCESS KEY>'
  aws_secret_access_key: '<AWSのSECRET ACCESS KEY>'
  existing_remote_files: delete
  manifest: true
  gzip_compression: true

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

config/environments/production.rbに以下の記述を追加する。

  config.action_controller.asset_host = '//s3-ap-northeast-1.amazonaws.com/assets.example.com'

以上で設定は完了。Assetsのprecompile時に自動的に配置されるようになる。

$ bundle exec rake assets:precompile

capistranoとの連携


capistranoの設定方法

Railsの汎用デプロイツールであるcapistranoと組み合わせることで、アプリケーションのデプロイと同時にAssetsをクラウドに配置することができる。
config/deploy.rbに以下の記述を追加する。

namespace :assets do
  task :precompile, :roles => :web do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake assets:precompile"
  end

  task :cleanup, :roles => :web do
    run "cd #{current_path} && RAILS_ENV=#{rails_env} bundle exec rake assets:clean"
  end
end
after :deploy, 'assets:precompile'

Amazon S3ならCDNの導入もスムーズ

Amazon S3Amazon CloudFront(CDNサービス)との相性がいいため、CDNの導入がスムーズにできる。公開したアプリケーションへのアクセスが増えてきたら導入を検討してもいいだろう。
また、Amazon S3は1GBまでなら月額10円程度で使うことができる。しかもAWSに新規で登録したユーザなら12ヶ月間無料で使うことができる。まだAWSのアカウントを持っていないユーザはこの「Assets on Cloudパターン」を今すぐ無料で試そう。

*1:僕が勝手に名付けました

*2:僕が勝手に作ったデザインパターンです