Trabalhando com S3 e armazenamentos em nuvem em Go: biblioteca minio-go

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Biblioteca minio-go para trabalhar com S3 e armazenamentos em nuvem em Go



No desenvolvimento moderno, surge cada vez mais a necessidade de integração com armazenamentos em nuvem compatíveis com o protocolo Amazon S3 (Simple Storage Service). Seja AWS S3, Yandex.Cloud, DigitalOcean Spaces, MinIO ou qualquer outro serviço compatível com S3, a linguagem Go oferece uma solução elegante e eficiente — a biblioteca minio-go.



Minio-go é o cliente Go oficial para a API Amazon S3, desenvolvido pela empresa MinIO. Ele fornece um conjunto completo de funções para gerenciar buckets e objetos, suporta upload/download em streaming, criptografia, versionamento e muitos outros recursos do S3. A biblioteca é totalmente compatível com AWS S3 e qualquer outro armazenamento compatível com S3.



Instalação



A instalação da biblioteca é feita da forma padrão através do go get:



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


Conexão e configuração do cliente



Para começar, é necessário criar um cliente, informando o endpoint, access key e secret key. Exemplo de conexão ao MinIO (local ou em nuvem):



package main

import ( "context" "log" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials")

func main() { ctx := context.Background() // Parâmetros de conexão endpoint := "play.min.io" // ou seu endpoint accessKeyID := "Q3AM3UQ867SPQQA43P2F" secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" useSSL := true

// Criação do cliente client, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { log.Fatalf("Erro ao criar cliente: %v", err) }

log.Println("Conexão com o armazenamento S3 estabelecida")}


Trabalhando com buckets



Bucket é o diretório raiz no armazenamento S3. Vamos ver as operações principais:



Criação de bucket



bucketName := "my-go-bucket"location := "us-east-1"

err = client.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{ Region: location,})if err != nil { log.Printf("Não foi possível criar o bucket: %v", err)} else { log.Printf("Bucket '%s' criado com sucesso", bucketName)}


Verificação de existência do bucket



exists, err := client.BucketExists(ctx, bucketName)if err != nil {    log.Fatalf("Erro ao verificar bucket: %v", err)}if exists {    log.Printf("Bucket '%s' existe", bucketName)}


Lista de todos os buckets



buckets, err := client.ListBuckets(ctx)if err != nil {    log.Fatalf("Erro ao obter lista de buckets: %v", err)}for _, bucket := range buckets {    log.Printf("Bucket: %s, criado em: %s", bucket.Name, bucket.CreationDate)}


Upload de arquivos



Minio-go suporta upload de arquivos do sistema de arquivos local, de io.Reader e de buffer em memória. Exemplo de upload de arquivo:



objectName := "example.txt"filePath := "/path/to/local/file.txt"contentType := "text/plain"

// Upload do arquivon, err := client.FPutObject(ctx, bucketName, objectName, filePath, minio.PutObjectOptions{ ContentType: contentType,})if err != nil { log.Fatalf("Erro ao fazer upload do arquivo: %v", err)}log.Printf("Arquivo '%s' enviado, tamanho: %d bytes", objectName, n.Size)


Upload da memória (bytes/reader)



import "strings"

data := strings.NewReader("Olá, armazenamento 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("Erro ao fazer upload dos dados: %v", err)}log.Printf("Enviados %d bytes", n.Size)

Recommendations