Log in to leave a comment
No posts yet
Sé perfectamente esa sensación de escalofrío que recorre el cuerpo cada vez que llega la factura de Amazon S3. Para un ingeniero de datos, S3 es como el aire que respira, pero al realizar decenas de miles de llamadas a la API para pruebas y mover archivos de gran tamaño, puede acabar saliendo más caro el collar que el perro. A partir de 2025, el coste de almacenamiento de S3 Standard es de 0,023 USD por GB, pero el verdadero peligro son los costes de transferencia de datos (Egress). Superar los 100 GB ya supone pagar 0,09 USD por GB, lo cual es casi cuatro veces el coste de almacenamiento. Para ahorrar estos costes, muchos intentan levantar MinIO en local, pero suelen sufrir porque no termina de encajar con el código de producción. Por eso, aquí he resumido los métodos de configuración que utilizo en proyectos reales.
Escribir la dirección de S3 directamente en el código de la aplicación es un hábito peligroso. Si al desplegar dejas por error la dirección local, provocarás un fallo en el servicio. La librería Boto3 lee las variables de entorno del sistema antes que la configuración interna del código. Aprovechando esta prioridad, podemos hacer que en local apunte a MinIO y que en el entorno de producción utilice automáticamente AWS S3.
Método de configuración
AWS_S3_ENDPOINT_URL=http://localhost:9000 en el archivo .env de tu entorno local.os.getenv("AWS_S3_ENDPOINT_URL").boto3.client("s3", endpoint_url=endpoint).Con esta configuración, como el servidor de producción no tiene dicha variable de entorno, Boto3 buscará la dirección predeterminada de AWS. Es la forma más segura de reducir a 0 USD el coste de las miles de solicitudes PUT/GET que ocurren durante la fase de pruebas locales.
Si intentas usar tal cual el código de Terraform que define la infraestructura de producción en tu MinIO local, te encontrarás con errores. Esto sucede porque el proveedor de AWS de Terraform intenta validar por defecto el ID de la cuenta de AWS real. En el entorno local, debemos interceptar este proceso de validación y "engañarlo".
Ejemplo de configuración de Terraform
s3 = "http://localhost:9000" en la configuración de endpoints.true las propiedades s3_use_path_style, skip_credentials_validation y skip_requesting_account_id.access_key y secret_key, introduce cualquier cadena de texto como mock_key.Tras estos ajustes, Terraform creará políticas de bucket y reglas de ciclo de vida (Lifecycle Rules) en el MinIO local sin necesidad de conectar con una cuenta real de AWS. Esto permite detectar errores en la definición de la infraestructura antes del despliegue, reduciendo eficazmente la tasa de fallos.
Para analizar correctamente el rendimiento de las consultas, el volumen de los datos ficticios debe ser grande. Sin embargo, crear datos con bucles convencionales es tan lento que resulta agotador. Yo utilizo Polars o Apache Arrow. Polars usa operaciones vectorizadas, lo que lo hace hasta 10 veces más rápido que Pandas.
Proceso de generación de datos
Faker y crea chunks de 100.000 filas con Polars.write_to_dataset del motor pyarrow para guardar archivos Parquet particionados al estilo Hive (year=2026/month=04).Subir y bajar 100 GB de datos repetidamente en la nube puede suponer una factura de cientos de dólares. Es mucho más saludable para tu cartera realizar las pruebas llevando el hardware local al límite.
Para probar en local la lógica serverless que se activa automáticamente al subir un archivo, puedes usar la función de notificación de buckets de MinIO. MinIO soporta la función Webhook, que envía datos JSON a un endpoint HTTP especificado cuando se crea un objeto.
Pasos de implementación
MINIO_NOTIFY_WEBHOOK_ENDPOINT con la dirección de tu servidor local.s3:ObjectCreated:Put llega correctamente al servidor local.La fiabilidad cuando se acumulan los eventos se decide por el tamaño de la cola y la tasa de generación de eventos (
). En un entorno de pruebas local, es recomendable aumentar generosamente el ajuste queue_limit para mantener la paz mental.
A veces, los archivos creados dentro de un contenedor Docker no se pueden abrir en la máquina host por problemas de permisos. Especialmente si eres usuario de macOS, debes verificar si tienes activado 'VirtioFS' en la configuración de Docker Desktop. VirtioFS es hasta un 98% más rápido en el procesamiento del sistema de archivos que el método tradicional gRPC FUSE. Al manejar grandes volúmenes de datos, esta diferencia es muy notable.
Solución a problemas de permisos
docker run, utiliza la opción --user $(id -u):$(id -g) para sincronizar los permisos entre el host y el contenedor./data del contenedor.Contar con un entorno local bien estructurado es como tener un laboratorio perfecto donde desentrañar los principios de funcionamiento de la infraestructura sin preocuparse por los costes. Más allá de simplemente ahorrar dinero, te permite tener un ritmo de desarrollo independiente, sin estar a merced del entorno de la nube.