Работа с 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. Сравнение библиотек
-
<