Làm chủ Object Storage với MinIO (Phần 2): Tích hợp MinIO với minio-go

3 min read

Ở phần 1, chúng ta đã cài đặt thành công MinIO Server. Trong phần này, chúng ta sẽ tìm hiểu về một công cụ mạnh mẽ để giao tiếp với nó cho các dự án Go: MinIO Go Client SDK (minio-go). Đây là thư viện chính thức do MinIO phát triển, cho phép lập trình viên tương tác với MinIO một cách đơn giản, hiệu quả và an toàn.

Bài viết này sẽ giới thiệu chi tiết về cấu trúc thư viện, module credentials, và các hàm quan trọng được sử dụng phổ biến.

1. Cài đặt

MinIO SDK v7 là phiên bản ổn định và được khuyến nghị sử dụng hiện nay. Nó hỗ trợ Context (để quản lý timeout/cancellation) và xử lý lỗi tốt hơn các bản cũ.

# 1. Package chính: Chứa logic Client và các hàm thao tác (Upload, Download...)
go get github.com/minio/minio-go/v7

# 2. Package xác thực: Chứa các phương thức tạo thông tin đăng nhập (Auth)
go get github.com/minio/minio-go/v7/pkg/credentials

2. Tìm hiểu về minio-go/v7/pkg/credentials

Trước khi kết nối được, bạn cần xác thực. MinIO tách riêng phần xử lý thông tin đăng nhập ra module credentials để hỗ trợ đa dạng các kiểu xác thực khác nhau (từ đơn giản đến phức tạp).

Dưới đây là một số provider phổ biến nhất:

  • NewStaticV4: Dùng cho môi trường Dev hoặc khi có sẵn Access Key và Secret Key cố định.
creds := credentials.NewStaticV4("ACCESS_KEY", "SECRET_KEY", "")
  • NewIAM (Dùng cho AWS EC2/ECS): Nếu bạn chạy ứng dụng trên AWS, bạn không nên hardcode key. Hàm này sẽ tự động lấy quyền từ IAM Role được gán cho server.
creds := credentials.NewIAM("")

3. Khởi tạo Client: minio.New

Hàm quan trọng nhất để bắt đầu. Nó tạo ra một kết nối đến server.

client, err := minio.New(endpoint, &minio.Options{
    Creds:  creds,     // Đối tượng credentials vừa tạo ở trên
    Secure: useSSL,    // true (HTTPS) hoặc false (HTTP)
    Region: "us-east-1",
})
  • Endpoint: Lưu ý chỉ điền domain/IP (ví dụ localhost:9000 hoặc s3.amazonaws.com), không bao gồm http://.
  • Secure: Nếu bạn chạy localhost, hãy để false. Trên production có HTTPS, hãy để true.

4. Các hàm thao tác phổ biến

Dưới đây là danh sách các hàm phổ biến nhất bạn cần nắm vững. Tất cả các hàm này đều nhận tham số đầu tiên là context.Context.

Nhóm 1: Quản lý Bucket

  • MakeBucket(ctx, bucketName, options)
    • Tạo một bucket mới. Thường đi kèm MakeBucketOptions{Region: "..."}.
  • BucketExists(ctx, bucketName)
    • Kiểm tra bucket đã có hay chưa.
    • Best Practice: Luôn gọi hàm này trước khi tạo bucket hoặc upload file để tránh lỗi crash ứng dụng.

Nhóm 2: Upload Object (Ghi dữ liệu)

MinIO cung cấp 2 cách chính để upload:

  • FPutObject(ctx, bucket, objectName, filePath, opts)
    • Dùng khi: Bạn có sẵn file nằm trên ổ cứng server.
    • Ưu điểm: Tự động tối ưu hóa, chia nhỏ file (multipart upload) và resume nếu mất mạng.
  • PutObject(ctx, bucket, objectName, reader, size, opts)
    • Dùng khi: Dữ liệu nằm trong RAM (ví dụ: người dùng upload qua form HTML, dữ liệu tạo ra từ code, hoặc stream từ URL khác).
    • Tham số: Nhận vào io.Reader. Đây là hàm mạnh mẽ nhất vì nó hỗ trợ Streaming dữ liệu mà không cần lưu tạm xuống ổ cứng.

Nhóm 3: Download & Chia sẻ

  • GetObject(ctx, bucket, objectName, opts)
    • Trả về một luồng dữ liệu (io.Reader). Bạn có thể đọc luồng này để lưu xuống file hoặc trả trực tiếp về cho trình duyệt người dùng.
  • PresignedGetObject(ctx, bucket, objectName, expiry, reqParams)
    • Tính năng: Tạo ra một đường link tạm thời (có chữ ký điện tử) để truy cập file Private.
    • Ứng dụng: Dùng để hiển thị ảnh avatar, link download tài liệu bảo mật. Link sẽ tự hủy sau thời gian expiry.
Avatar photo

Thế giới Công nghệ: Giải thích dễ hiểu cho…

Thế giới Công nghệ: Giải thích dễ hiểu cho người mới bắt đầu Nếu bạn từng nghe ai đó nói “mình làm bên IT”,...
Avatar photo dvgiang2603
4 min read

Leave a Reply

Your email address will not be published. Required fields are marked *