
Ở 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:9000hoặcs3.amazonaws.com), không bao gồmhttp://. - 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: "..."}.
- Tạo một bucket mới. Thường đi kèm
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.
- Trả về một luồng dữ liệu (
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.
