Работа с S3 и облачными хранилищами в Go: библиотека minio-go

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Библиотека 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' ска                    

Рекомендаций