- Rails 3.2 アプリを使用しています
- S3 オリジンで Cloudfront ディストリビューションを作成しました
- config.action_controller.asset_host を自分のクラウドフロント アセットに既に変更しています
- カピストラーノを使っています
デプロイするたびにプリコンパイル済みアセットを Cloudfront にアップロードする方法を知りたい
デプロイするたびにプリコンパイル済みアセットを Cloudfront にアップロードする方法を知りたい
Amazon Cloudfront が「カスタムオリジン」をサポートするようになったため、s3 バケットは必要ありません。以前は、s3 バケットをオリジンとして指定する必要がありましたが、今では、レール アプリでクラウドフロント ディストリビューションを指定できます。
http://aws.typepad.com/aws/2010/11/amazon-cloudfront-support-for-custom-origins.html
したがって、一般にアクセス可能なアプリを指すディストリビューションを作成した後、適切な構成ファイル (例: production.rb) でアセット ホストを設定すると、レースに参加できます。
config.action_controller.asset_host = "url of your cloudfront distribution"
これは、設定方法に関する半分まともな記事です。
http://ryantownsend.co.uk/post/13126016608/cloudfront-cdn-on-rails
起点サブドメインの CNAME recprds の設定について少し混乱しないでください。これは、Amazon の代わりに独自のサブドメインを使用する場合にのみ関係します。
aws-s3 gem をインストールした後、これを capistrano レシピの最後に追加できます。
set :cdn_user, "KEY ID" # This is called "CDN KEY API" for AWS
set :cdn_api_key, "YOUR KEY SECRET"
set :cdn_container, "bucket name"
namespace :assets do
task :to_cdn do
require 'aws/s3'
AWS::S3::Base.establish_connection!(:access_key_id => cdn_user, :secret_access_key => cdn_api_key )
assets_dir = "#{shared_path}/assets"
Dir.glob(assets_dir + "/**/*").each do |file|
if !File.directory?(file)
cdn_filename = file.gsub(assets_dir,"assets")
AWS::S3::S3Object.store(cdn_filename, open(file) , cdn_container)
end
end
end
end
次のようなトリガーを使用します。
after "deploy:assets:precompile", "assets:to_cdn"
また、レシピのある時点で次のコマンドを使用してコンパイルを開始する必要があります。
load 'deploy/assets'
結果: アセットのコンパイルの最後に、すべてのアセットが S3 にプッシュされ、クラウドフロントからそれらにアクセスできるようになります。
次に、CDN URL を指すように config/environment/production.rb を更新する必要があります。
config.action_controller.asset_host = "http://assets.example.com"
これを処理するAssetSyncという優れた Ruby gem があります。これをturbo-sprocketsと組み合わせると、新しいアセットまたは更新されたアセットのみがデプロイ時にコピーされるようにすることができます。