Sử dụng Active Storage để lưu file trên Amazon với Rails 6
Bài đăng này đã không được cập nhật trong 4 năm
Hiện nay việc lưu trữ ảnh, video, hay các loại file khác lên cloud rất phổ biến đối với tất cả các ứng dụng. Việc lưu file lên cloud có rất nhiều lợi ích, có thể kể đến như các file lưu trữ trên cloud sẽ khó bị mất, có thể sử dụng trên nhiều nền tảng, tối ưu hóa dung lượng app, dễ dàng quản lí,... Trong bài viết này sẽ giới thiệu về cách lưu trữ file lên Amazon S3 trong Rails 6 sử dụng Active Storage.
Tạo tài khoản Amazon và S3 bucket
Tạo tài khoản Amazon
Tạo tài khoản Amazon tại trang chủ Amazon, lưu ý bạn phải nhập thông tin creadit card thì mới sử dụng được các dịch vụ của Amazon.
Sau khi đăng kí thành công bạn đăng nhập với tài khoản root user chính là tài khoản với email bạn vừa tạo.
Tạo bucket
Sau khi đăng nhập thì bạn sẽ thấy một màn hình như sau:
Tìm kiếm S3 trên thanh tìm kiếm Dịch vụ AWS nếu bạn không thể nhìn thấy nó ngay từ đầu:
Nhấn vào dịch vụ S3, bạn sẽ được chuyển tới một màn hình như sau:
Click vào Create bucket để đi tới trang tạo bucket
Chuyển đến màn hình tiếp theo:
Trên màn hình thuộc tính, bạn có thể đặt các cài đặt cho bucket. Đối với hướng dẫn này, chúng ta sẽ không đi sâu vào những điều này nhưng bạn có thể thử với nó. Sẽ để nó với các giá trị mặc định.
Tiếp theo, trên màn hình Permissions, chúng ta có thể đặt người dùng để có quyền truy cập vào bucket này nhưng chúng tôi sẽ thực hiện điều đó sau trong cài đặt IAM của Amazon service, vì vậy, trong thời điểm này, hãy giữ nguyên trạng thái và nhấp vào Next.
Đây là màn hình xác nhận bạn có thể tiếp tục và nhấp vào Create Bucket
Thêm chính sách người dùng để cấp quyền truy cập vào tệp
Bây giờ chúng ta sẽ tạo một người dùng và cấp các quyền cần thiết để có quyền truy cập đọc / ghi vào S3 Bucket.
Hãy nhấn vào Services và tìm kiếm IAM
Trên trang IAM service nhấn vào User và nhấn Add User
Trong màn hình Add User nhập vào user name và check vào Programmatic access trong mục Access type.
Sau đó chúng ta phải chỉ định quyền truy cập S3 Policy Access trong màn hình tiếp theo:
Click vào Attach Existing và tìm kiếm chính sách S3 và chọn AmazonS3FullAccess, sau đó nhấn Next: Review
Trong màn hình Review nhấn vào Show trong cột Secret access key và xem giá trị. Hãy lưu cả 2 giá trị: Access key ID và Secret access key vào một nơi an toàn bởi vì chúng ra sẽ cần nó để cài đặt Active Storage trong Rails.
Rails setup
Config storage.yml
Bước đầu tiên để thiết lập Active Storage trên Rails là thiết lập config/storage.yml
. Các cài đặt giống như sau:
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
amazon:
service: S3
access_key_id: <%= ENV["AWS_ACCESS_KEY_ID"] %>
secret_access_key: <%= ENV["AWS_SECRET_ACCESS_KEY"] %>
region: <%= ENV["AWS_REGION"] %>
bucket: <%= ENV["S3_BUCKET_NAME"] %>
Các giá trị AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET_NAME bạn sẽ lấy từ cài đặt ở phần trước để lưu ở biến môi trường.
Config production.rb / staging.rb / development.rb environment
config.active_storage.service = :amazon
Install active_storage
Bạn chạy lệnh sau để cài đặt active_storage vào project
rails active_storage:install
Bây giờ trong thư mục project bạnn sẽ thấy file migrate của active storage như sau:
Sau đó chạy lệnh rails db:migrate
để tạo ra 2 bảng: active_storage_attachments và active_storage_blobs
Lưu ảnh
Để lưu ảnh ta cần tạo một Model và thêm quan hệ với Active Storage
has_one_attached :image (nếu chỉ lưu 1 ảnh)
# Or
has_many_attached :image (nếu lưu nhiều ảnh)
Sau đó, chúng ta cần permit params trong controller để nhận file ảnh từ client và lưu: Đối với 1 ảnh:
def product_params
params.require(:product).permit(:title, :description, :image)
end
Đối với nhiều ảnh:
def product_params
params.require(:product).permit(:title, :description, image: [])
end
Lấy link ảnh
Cuối cùng để lấy được link ảnh và xem lại ảnh ta có thể dùng cú pháp sau:
object.image.attachment.service_url
Tổng kết
Như vậy qua bài viết này mình đã giới thiệu tới các bạn các bước cơ bản để có thể lưu ảnh lên môi trường Amazon S3 service thông qua active_storage trong Rails. Chúc các bạn thành công.
All rights reserved