Avatar
0
minhvd Beginner
minhvd Beginner
Hỏi về good practice khi thiết kế hệ thống upload và đọc ảnh lưu trữ trên Amazon S3
Em đang xây dựng tính năng cho phép người dùng úp ảnh sản phẩm lên, và những ảnh này sẽ được lưu trên Amazon S3. Hiện em đang làm như sau: mỗi lần upload thì generate ra presigned url có thời hạn valid 5 phút, và lưu đường dẫn file url vào trong database. Tuy vậy, các lần sau khi user vào lại trang (ví dụ trang danh sách sản phẩm), thì phía server lại cần chạy for loop để generate lại các presigned url từ file url đã lưu trong db để trả về cho người dùng. Vậy em muốn hỏi việc xử lý như này có tốt không? hay cách thiết kế nào là tốt với việc up ảnh và đọc ảnh từ s3 ạ? ở đây em không muốn set bucket trên S3 là public
  • Answer
Remain: 5
3 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
  1. Việc lưu ảnh trên s3 là một phương pháp hợp lý vì em có thể có nhiều server, s3 giống như 1 cdn quản lý tài nguyên tập trung sẽ dễ dàng hơn rất nhiều.
  2. Tuy nhiên, nếu anh là em anh sẽ không làm như vậy, anh sẽ lưu ảnh rồi lấy đường dẫn vĩnh viễn là được, vì rõ ràng là cách ảnh liên quan đến sản phẩm chẳng có gì là bí mật và cũng chẳng để bán nên rốt cuộc làm phức tạp ra để làm gì nhỉ?

Vậy nên anh nghĩ là em nên lưu ảnh lên s3, lấy đường dẫn cố định, như vậy là ổn rồi em ạ.

  • 0
  • Reply
anh có thể chỉ em cách lưu ảnh vĩnh viễn mà không cần public cái bucket s3 được k ạ? em hỏi ví dụ là ảnh sản phẩm thôi tuy nhiên sau này có những ảnh khác như ảnh cmnd chả hạn thì sao ạ  –  minhvd 1692717927000
Avatar
tvd12 Beginner
tvd12 Beginner
The Best Answer
Việc public đường dẫn s3 ra bên ngoài rõ ràng là không được vì liên quan đến bảo mật, vậy nên em sẽ có thể làm 1 cách sau:
  1. Tạo một API trên server của em, khi người dùng gọi lấy media thì em sẽ gọi lên s3 để lấy ảnh, mã nguồn minh hoạ sẽ như sau:
s3InputStream =. ..
webOutputStream =. ..
byte[] bytes = new byte[1024];
while(true) {
   int readBytes = s3InputStream.read(bytes);
  if (readBytes <= 0) {
    break;
  }
  webOutputStream.write(bytes, readBytes);
}
  1. Em có thể dụng 1 load balancer đóng vai trò là proxy server để gọi đến s3, em có thể tham khảo sử dụng nginx hoặc các dịch vụ LB của amazon xem sao.
  • 0
  • Reply
Avatar
Kiet Thanh Vo Beginner
Ngoài cách @tvd12 đã nêu, còn vài phương án sau:
  • Dùng CloudFront trỏ vào S3, như vậy không cần public S3 mà vẫn access được, chưa kẻ giá bandwidth CloudFront rẻ hơn S3 khá nhiều, content sẽ còn dc cache nơi gần nhất nữa
  • Dùng CloudFront trỏ vào server của mình, rồi từ server vào S3, cách này cũng gần như tương tự ở trên, nhưng thêm vài thứ hay như có thể resize hình ảnh theo nhu cầu từ frontend, vì hình ảnh không nhất thiết phải load full size mọi nơi. Ví dụ trong detail thì hiện full size, còn bên ngoài list chỉ cần 200x200 là đủ. Do dc cache tại CloudFront rồi, nên số lượng request vào server cũng không còn nhiều, đỡ tải hơn rất nhiều so với dùng server trực tiếp
  • 0
  • Reply