Đồng bộ asset lên s3 amazon - Gem AssetSync

Chắc sẽ có nhiều bạn gặp trường hợp như này: sau khi code xong, chuẩn bị deploy demo cho khách hàng thì được yêu cầu chuyển những file trong asset lưu trữ lên s3 amazon. Vậy bạn sẽ làm như thế nào, chẵng nhẽ lại upload thủ công lên s3. Vậy mình xin giới thiệu giải pháp Gem AssetSync

Asset Sync được xây dựng để chạy với tính năng Rails Asset Pipeline mới được giới thiệu trong Rails 3.1. Sau khi bạn chạy bundle exec rake assets:precompile assets của bạn sẽ được đồng bộ hóa với S3 bucket của bạn

Installation

Thêm vào gem file và chạy bundle

gem "asset_sync"
gem "fog-aws"

Configuration

Thiết lập trong config/environments/production.rb để có thể sử dụng Amazon S3 như asset host and chắc chắn precompiling được kích hoạt.

#config/environments/production.rb

  config.action_controller.asset_host = "//#{ENV['FOG_DIRECTORY']}.s3.amazonaws.com"

Hãy chắc chăn các thiết lập sau được cài đặt như bên dưới

#config/environments/production.rb

config.assets.digest = true
config.assets.enabled = true
config.assets.initialize_on_precompile = true

Bây giờ bạn cần tạo file trong initializers chạy lệnh

rails g asset_sync:install --provider=AWS

#config/initializers/asset_sync.rb

AssetSync.configure do |config|
  config.fog_provider = 'AWS'
  config.fog_directory = ENV['FOG_DIRECTORY']
  config.aws_access_key_id = ENV['AWS_ACCESS_KEY_ID']
  config.aws_secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']

  # Don't delete files from the store
  # config.existing_remote_files = 'keep'
  #
  # Increase upload performance by configuring your region
  # config.fog_region = 'eu-west-1'
  #
  # Automatically replace files with their equivalent gzip compressed version
  # config.gzip_compression = true
  #
  # Use the Rails generated 'manifest.yml' file to produce the list of files to
  # upload instead of searching the assets directory.
  # config.manifest = true
  #
  # Fail silently.  Useful for environments such as Heroku
  # config.fail_silently = true
  #
  # Log silently. Default is `true`. But you can set it to false if more logging message are preferred.
  # Logging messages are sent to `STDOUT` when `log_silently` is falsy
  # config.log_silently = true
  #
  # Allow custom assets to be cacheable. Note: The base filename will be matched
  # If you have an asset with name `app.0b1a4cd3.js`, only `app.0b1a4cd3` will need to be matched
  # only one of `cache_asset_regexp` or `cache_asset_regexps` is allowed.
  # config.cache_asset_regexp = /\.[a-f0-9]{8}$/i
  # config.cache_asset_regexps = [ /\.[a-f0-9]{8}$/i, /\.[a-f0-9]{20}$/i ]
end

-Amazon đã chuyển sang mô hình chính sách bảo mật người dùng IAM an toàn hơn. Khi tạo ra một user & policy cho asset_sync, bạn phải đảm bảo policy có các quyền sau đây hoặc bạn sẽ thấy lỗi:

Expected(200) <=> Actual(403 Forbidden)

thêm policy sau vào IAM

{
  "Statement": [
    {
      "Action": "s3:ListBucket",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket_name"
    },
    {
      "Action": "s3:PutObject*",
      "Effect": "Allow",
      "Resource": "arn:aws:s3:::bucket_name/*"
    }
  ]
}

Rake Task

Để có thể dùng console sync thủ công không qua lệnh precompile, bạn có thể dùng rake task sau

  namespace :assets do
    desc "Synchronize assets to S3"
    task :sync => :environment do
      AssetSync.sync
    end
  end

https://github.com/AssetSync/asset_sync