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/v7Conexã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)Também na biblioteca
Biblioteca WebSocket Gorilla para Go (Golang) — guia completo
Cache em Java: Redis, Caffeine e outras ferramentas
Métricas Prometheus em Rust: bibliotecas prometheus e metrics-exporter-prometheus
ORM para Java: comparação entre Hibernate, MyBatis e Spring Data JPA
Pest para PHP: guia completo com exemplos
Recommendations