Trong bài viết này tôi chia sẻ 4 kinh nghiệm khi làm việc S3 bucket

1. Phân cấp folder để get và list object nhanh hơn

Chúng ta xây dựng một ứng dụng chia sẻ ảnh du lịch của một mạng xã hội du lịch. Có 2 cách:

  1. Lưu tất cả ảnh vào trong một S3 bucket
  2. Tạo thành các folder đặt tên theo quốc gia, trong mỗi folder quốc gia có các folder thành phố/khu vực, tiếp đến các folder điểm du lịch
    Europe/France/Nouvelle-Aquitaine/Bordeaux
    North America/Canada/Quebec/Montreal
    North America/USA/Washington/Bellevue
    North America/USA/Washington/Seattle
    Asia/SouthEast/Vietnam/North/Halong   
    

Về cảm quan các bạn cũng thấy ngay, cách số 2 sắp xếp sẽ khoá học hơn. Việc phân cấp thành các thư mục bản chất là chia để trị. Tên một object trong S3 được gọi là key sẽ bao gồm đường dẫn đầy đủ (prefix) và tên file (file name) kiểu như Asia/SouthEast/Vietnam/North/Halong/pic01.jpg. Ở đây:

  • prefix = Asia/SouthEast/Vietnam/North/Halong/
  • file name = pic01.jpg

Amazon khẳng định rằng

There is no max bucket size or limit to the number of objects that you can store in a bucket. You can store all of your objects in a single bucket, or you can organize them across several buckets. However, you can’t create a bucket from within another bucket.

Tuy nhiên để tối ưu tốc độ đọc ra, thì chúng ta không nên lưu quá nhiều object vào chung 1 folder mà nên chia ra nhiều folder theo tiêu chí của nghiệp vụ. Truy vấn object bằng key chứa prefix (phân cấp folder) sẽ nhanh hơn.

Hãy đọc tài liệu Boto3 về lệnh list_objects_v2. Bạn thấy cú pháp như sau

response = client.list_objects_v2(
    Bucket='string',
    Delimiter='string',
    EncodingType='url',
    MaxKeys=123,
    Prefix='string',
    ContinuationToken='string',
    FetchOwner=True|False,
    StartAfter='string',
    RequestPayer='requester',
    ExpectedBucketOwner='string'
)

Tham số Prefix chỉ đường dẫn folder phía trước. Khi sử dụng Prefix danh sách object trả về sẽ giới hạn hơn đúng những phần chúng ta mong muốn

2. Đặt tên file để tránh bị vô tình ghi đè

Giả sử tôi viết ứng dụng quản lý file văn bản cho tập đoàn. Nếu dùng trực tiếp tên file upload lên S3 làm key sẽ dẫn đến khả năng hai file khác nhau trùng tên. Ví dụ “hopdong2022.docx” có thể là tên của vài hợp đồng khác nhau.
Cách tốt nhất là sinh ra một mã unique ID gắn vào một bản ghi lưu vào DynamoDB hoặc RDS cùng các thông tin meta data của văn bản ví dụ: như người tạo, tiêu đề, nội dung tóm tắt, phân loại…
Tiếp đến đặt tên file theo định dạng:

  • uniqueID-filename: nếu một bản ghi có thể upload nhiều file. Ví dụ oxrtz13u-hopdong2022.docx
  • uniqueID: nếu một bản ghi chỉ chứa duy nhất một file. Ví dụ oxrtz13u.docx

3. Tận dụng chức năng versioning của S3 bucket

Các chức năng lưu trữ FTP, hay lưu file vào trong EBS đều không có chức năng phiên bản. Riêng S3 cho phép một object mỗi lần sửa đổi được lưu thành một version. Điều này rất hữu ích trong các ứng dụng cần lưu phiên bản trong mỗi lần sửa đổi. Ví du văn bản Office hoặc thiết kế CAD…
S3 Versioning

4. Sử dụng presigned-URL

Presigned URL là URL tạm thời mà S3 sinh ra có kèm token và thời gian hết hạn. Client sử dụng Presigned URL có thể upload file trực tiếp vào S3 mà không phải thông qua bên trung gian.
presigned url

Bạn có thể tìm được rất nhiều tip tricks sử dụng, lập trình ứng dụng AWS trong khoá học Learn AWS the Hard Way