Работа с S3 и облачными хранилищами в Go (Golang): библиотеки и примеры

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

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

Начать курс

Работа с S3 и облачными хранилищами в Go (Golang)

Облачные объектные хранилища, совместимые с протоколом Amazon S3, стали стандартом де-факто для хранения неструктурированных данных: изображений, видео, логов, бэкапов. В экосистеме Go (Golang) существует несколько мощных библиотек для взаимодействия с S3, которые позволяют легко интегрировать облачное хранение в ваши приложения. В этой статье мы рассмотрим две основные библиотеки: minio-go и aws-sdk-go-v2, а также приведём практические примеры их использования.

1. Библиотека minio-go

MinIO — это высокопроизводительное объектное хранилище с открытым исходным кодом, полностью совместимое с Amazon S3 API. Его клиентская библиотека minio-go является одной из самых популярных для работы с S3 в Go. Она поддерживает все основные операции: создание и удаление бакетов, загрузку, скачивание и удаление объектов, а также работу с политиками доступа.

Установка библиотеки:

go get github.com/minio/minio-go/v7

Пример: подключение и загрузка файла

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, access key и secret key вашего S3-совместимого хранилища
    endpoint := "play.min.io"
    accessKeyID := "Q3AM3UQ867SPQQA43P2F"
    secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG"
    useSSL := true

    // Инициализируем клиент
    minioClient, err := minio.New(endpoint, &minio.Options{
        Creds:  credentials.NewStaticV4(accessKeyID, secretAccessKey, ""),
        Secure: useSSL,
    })
    if err != nil {
        log.Fatalln(err)
    }

    // Создаём бакет (если не существует)
    bucketName := "my-bucket"
    err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{})
    if err != nil {
        // Проверяем, что бакет уже существует
        exists, errBucketExists := minioClient.BucketExists(ctx, bucketName)
        if errBucketExists == nil && exists {
            log.Printf("Bucket %s already exists", bucketName)
        } else {
            log.Fatalln(err)
        }
    }

    // Загружаем файл
    objectName := "myfile.txt"
    filePath := "/tmp/myfile.txt"
    contentType := "text/plain"

    n, err := minioClient.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{
        ContentType: contentType,
    })
    if err != nil {
        log.Fatalln(err)
    }

    log.Printf("Successfully uploaded %s of size %d\n", objectName, n)
}

2. Библиотека AWS SDK for Go v2

Официальный SDK от Amazon (aws-sdk-go-v2) предоставляет полный набор инструментов для работы с сервисами AWS, включая S3. Он поддерживает все возможности S3, включая многопоточную загрузку, шифрование и управление версиями. SDK использует генерацию кода на основе моделей, что обеспечивает высокую производительность и строгую типизацию.

Установка:

go get github.com/aws/aws-sdk-go-v2
go get github.com/aws/aws-sdk-go-v2/config
go get github.com/aws/aws-sdk-go-v2/service/s3

Пример: загрузка файла с использованием AWS SDK v2

package main

import (
    "context"
    "log"
    "os"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/config"
    "github.com/aws/aws-sdk-go-v2/service/s3"
)

func main() {
    ctx := context.Background()

    // Загружаем конфигурацию из переменных окружения или файла ~/.aws/credentials
    cfg, err := config.LoadDefaultConfig(ctx)
    if err != nil {
        log.Fatalf("unable to load SDK config, %v", err)
    }

    // Создаём клиент S3
    client := s3.NewFromConfig(cfg)

    // Открываем файл для загрузки
    file, err := os.Open("/tmp/myfile.txt")
    if err != nil {
        log.Fatalf("failed to open file, %v", err)
    }
    defer file.Close()

    // Загружаем объект
    _, err = client.PutObject(ctx, &s3.PutObjectInput{
        Bucket: aws.String("my-bucket"),
        Key:    aws.String("myfile.txt"),
        Body:   file,
    })
    if err != nil {
        log.Fatalf("failed to upload file, %v", err)
    }

    log.Println("File uploaded successfully")
}

3. Сравнение библиотек

    <

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