ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

Railsで静的ファイルをS3に置くならasset_syncがオススメ

RailsのアプリケーションでprecompileしたassetファイルをAmazon S3から読み込みたい、という時にはasset_syncというgemがオススメです。

asset_syncの設定後、precompileをすると対象のS3バケットにCSSや画像などの静的ファイルが自動でアップロードされ、特定の環境時(通常はproduction)でのみassetファイルをS3から読み込んでくれます。

インストールには関連ライブラリも併記して、Gemfileに以下のように追加します。(手順は公式サイトに書かれているものを要約したものです)

gem "fog", "~>1.20", require: "fog/aws/storage"
gem "asset_sync"

インストールしたら設定ファイルを作成します。
まずconfig/initializers/asset_sync.rbに以下の内容を追加します。

AssetSync.configure do |config|
  config.fog_provider = 'AWS'
  config.fog_directory = (バケット名)
  config.aws_access_key_id = (AWSのアクセスキー)
  config.aws_secret_access_key = (AWSのシークレットキー)
  config.manifest = true
  config.fog_region = (リージョン, 東京なら`ap-northeast-1`)
end

次にconfig/environments/production.rbに以下を追加します。(production以外の環境で導入したい場合はenvironments以下の対象のファイルに同様に記述します)

config.action_controller.asset_host = (S3のルートURL)

設定はこれで終了です。
precompileしてRailsをproductionモードで起動すると、アセットファイルの取得先がconfig.action_controller.asset_hostで指定したものに変更されているかと思います。

このようにproduction環境だけS3ファイルにして、developmentやstaging環境ではローカルのassetファイルを読み込みたい、といった状況に簡単に対応できて非常に助かります。