Библиотека minio-go для работы с S3 и облачными хранилищами в Go
В современной разработке все чаще возникает необходимость интеграции с облачными хранилищами, совместимыми с протоколом Amazon S3 (Simple Storage Service). Будь то AWS S3, Яндекс.Облако, DigitalOcean Spaces, MinIO или любой другой S3-совместимый сервис, язык Go предлагает элегантное и производительное решение — библиотеку minio-go.
Minio-go — это официальный Go-клиент для Amazon S3 API, разработанный компанией MinIO. Он предоставляет полный набор функций для управления бакетами и объектами, поддерживает потоковую загрузку/скачивание, шифрование, версионирование и многие другие возможности S3. Библиотека полностью совместима с AWS S3 и любыми другими S3-совместимыми хранилищами.
Установка
Установка библиотеки осуществляется стандартным способом через go get:
go get github.com/minio/minio-go/v7
Подключение и настройка клиента
Для начала работы необходимо создать клиент, указав endpoint, access key и secret key. Пример подключения к MinIO (локальному или облачному):
package main
import (
"context"
"log"
"github.com/minio/minio-go/v7"
"github.com/minio/minio-go/v7/pkg/credentials"
)
func main() {
ctx := context.Background()
// Параметры подключения
endpoint := "play.min.io" // или ваш endpoint
accessKeyID := "Q3AM3UQ867SPQQA43P2F"
secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
useSSL := true
// Создание клиента
client, err := minio.New(endpoint, &minio.Options{
Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
Secure: useSSL,
})
if err != nil {
log.Fatalf("Ошибка создания клиента: %v", err)
}
log.Println("Подключение к S3-хранилищу установлено")
}
Работа с бакетами
Бакет (bucket) — это корневая директория в S3-хранилище. Рассмотрим основные операции:
Создание бакета
bucketName := "my-go-bucket"
location := "us-east-1"
err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{
Region: location,
})
if err != nil {
log.Printf("Не удалось создать бакет: %v", err)
} else {
log.Printf("Бакет '%s' успешно создан", bucketName)
}
Проверка существования бакета
exists, err := client.BucketExists(ctx, bucketName)
if err != nil {
log.Fatalf("Ошибка проверки бакета: %v", err)
}
if exists {
log.Printf("Бакет '%s' существует", bucketName)
}
Список всех бакетов
buckets, err := client.ListBuckets(ctx)
if err != nil {
log.Fatalf("Ошибка получения списка бакетов: %v", err)
}
for _, bucket := range buckets {
log.Printf("Бакет: %s, создан: %s", bucket.Name, bucket.CreationDate)
}
Загрузка файлов (upload)
Minio-go поддерживает загрузку файлов из локальной файловой системы, из io.Reader и из буфера в памяти. Пример загрузки файла:
objectName := "example.txt"
filePath := "/path/to/local/file.txt"
contentType := "text/plain"
// Загрузка файла
n, err := client.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{
ContentType: contentType,
})
if err != nil {
log.Fatalf("Ошибка загрузки файла: %v", err)
}
log.Printf("Файл '%s' загружен, размер: %d байт", objectName, n.Size)
Загрузка из памяти (bytes/reader)
import "strings"
data := strings.NewReader("Привет, S3 хранилище!")
objectName := "hello.txt"
n, err := client.PutObject(ctx, bucketName, objectName, data, int64(data.Len()), minio.PutObjectOptions{
ContentType: "text/plain",
})
if err != nil {
log.Fatalf("Ошибка загрузки данных: %v", err)
}
log.Printf("Загружено %d байт", n.Size)
Скачивание файлов (download)
Скачивание в файл
downloadPath := "/path/to/download/example.txt"
err = client.FGetObject(ctx, bucketName, objectName, downloadPath, minio.GetObjectOptions{})
if err != nil {
log.Fatalf("Ошибка скачивания файла: %v", err)
}
log.Printf("Файл '%s' ска