Trabajo con S3 y almacenamiento en la nube en Go (Golang)
Los almacenes de objetos en la nube compatibles con el protocolo Amazon S3 se han convertido en el estándar de facto para almacenar datos no estructurados: imágenes, videos, registros, copias de seguridad. En el ecosistema de Go (Golang) existen varias bibliotecas potentes para interactuar con S3, que permiten integrar fácilmente el almacenamiento en la nube en sus aplicaciones. En este artículo, analizaremos dos bibliotecas principales: minio-go y aws-sdk-go-v2, y proporcionaremos ejemplos prácticos de su uso.
1. Biblioteca minio-go
MinIO es un almacén de objetos de alto rendimiento y código abierto, totalmente compatible con la API de Amazon S3. Su biblioteca cliente minio-go es una de las más populares para trabajar con S3 en Go. Admite todas las operaciones básicas: creación y eliminación de buckets, carga, descarga y eliminación de objetos, así como la gestión de políticas de acceso.
Instalación de la biblioteca:
go get github.com/minio/minio-go/v7Ejemplo: conexión y carga de un archivo
package main
import ( "context" "log"
"github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials")
func main() { ctx := context.Background()
// Especifique el endpoint, access key y secret key de su almacenamiento compatible con S3 endpoint := "play.min.io" accessKeyID := "Q3AM3UQ867SPQQA43P2F" secretAccessKey := "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG" useSSL := true
// Inicializamos el cliente minioClient, err := minio.New(endpoint, &minio.Options{ Creds: credentials.NewStaticV4(accessKeyID, secretAccessKey, ""), Secure: useSSL, }) if err != nil { log.Fatalln(err) }
// Creamos un bucket (si no existe) bucketName := "my-bucket" err = minioClient.MakeBucket(ctx, bucketName, minio.MakeBucketOptions{}) if err != nil { // Verificamos si el bucket ya existe exists, errBucketExists := minioClient.BucketExists(ctx, bucketName) if errBucketExists == nil && exists { log.Printf("Bucket %s already exists", bucketName) } else { log.Fatalln(err) } }
// Cargamos un archivo 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", objectName, n)}2. Biblioteca AWS SDK for Go v2
El SDK oficial de Amazon (aws-sdk-go-v2) proporciona un conjunto completo de herramientas para trabajar con los servicios de AWS, incluido S3. Admite todas las funcionalidades de S3, incluyendo carga multiproceso, cifrado y gestión de versiones. El SDK utiliza generación de código basada en modelos, lo que garantiza un alto rendimiento y una tipificación estricta.
Instalación:
go get github.com/aws/aws-sdk-go-v2go get github.com/aws/aws-sdk-go-v2/configgo get github.com/aws/aws-sdk-go-v2/service/s3Ejemplo: carga de un archivo usando 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()
// Cargamos la configuración desde variables de entorno o el archivo ~/.aws/credentials cfg, err := config.LoadDefaultConfig(ctx) if err != nil { log.Fatalf("unable to load SDK config, %v", err) }
// Creamos un cliente S3 client := s3.NewFromConfig(cfg)
// Abrimos el archivo para cargarlo file, err := os.Ope También en la biblioteca
Aprendizaje automático en C# (.NET): revisión de las bibliotecas ML.NET, Accord.NET, TensorFlow.NET
Generación Swagger/OpenAPI para C++: mejores herramientas y bibliotecas
OpenCV C++: Guía completa con ejemplos prácticos
Trabajo con imágenes en Rust: revisión de las bibliotecas image, fast_image_resize y otras
ORM para Rust: comparación y ejemplos de uso de Diesel, SeaORM y SQLx