0

Sử dụng Active Storage để lưu file trên Amazon với Rails 6

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_attachmentsactive_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

Viblo
Let's register a Viblo Account to get more interesting posts.