Đồng bộ asset lên s3 amazon - Gem AssetSync
Bài đăng này đã không được cập nhật trong 7 năm
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
All rights reserved