S3 là object storage, không phải filesystem từ xa. Ta lưu object bằng bucket + key và truy cập qua API/URL theo policy.
Credential
Ứng dụng cần region, bucket và quyền AWS phù hợp. Không hard-code access key trong source:
1 | Rails.application.credentials.dig(:aws, :region) |
Trên AWS, ưu tiên IAM role cho EC2/ECS/Lambda thay vì long-lived access key. SDK tự lấy temporary credentials từ runtime.
Policy chỉ cấp action/bucket prefix cần thiết. s3:* trên * rất tiện, giống đưa chìa khóa cả tòa nhà vì shipper cần vào sảnh.
Public hay private?
Bucket nên private mặc định. Với file private, tạo presigned URL có thời hạn:
1 | s3 = Aws::S3::Resource.new(region: ENV.fetch("AWS_REGION")) |
Public asset có thể phân phối qua CloudFront, dùng origin access control thay vì mở toàn bucket.
Upload qua Rails hay direct upload?
Upload đi qua Rails đơn giản nhưng web process phải nhận toàn bộ file. Với file lớn/nhiều:
- Rails xác thực user và tạo presigned POST/URL.
- Browser upload trực tiếp S3.
- Client/server xác nhận object.
- Background job scan/process metadata/thumbnail.
Server vẫn phải kiểm tra authorization, key prefix, size/content-type và trạng thái upload. Presigned URL là delegated permission, không phải giấy miễn security review.
Checklist
- Bucket private mặc định.
- IAM least privilege.
- Không commit credential.
- Validate size/type nhưng không tin MIME từ client tuyệt đối.
- Tạo random key, không dùng nguyên filename làm identity.
- Bật encryption, lifecycle và versioning theo nhu cầu.
- Scan file không tin cậy trước khi public.
- Cấu hình CORS chỉ cho origin/method cần thiết.
- Monitor storage, request và egress cost.
Source demo cũ có thể hữu ích để đọc lịch sử Rails 5.2, nhưng với Rails hiện đại nên cân nhắc Active Storage và direct upload trước khi tự ghép nhiều gem.