(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa

Cómo automatizar la limpieza de archivos en el Data Lake con Azure Synapse Analytics

João Barros 13 de September de 2026 5 min de lectura

Automatizar la eliminación de archivos obsoletos en el Data Lake ayuda a controlar costes, mejorar el rendimiento de las operaciones de ingestión e indexación, y mantener la organización. En este tutorial explico por qué seguir un patrón con Azure Synapse Analytics (Synapse Pipelines) para orquestar y una Azure Function para ejecutar la lógica de limpieza es un enfoque práctico y escalable. Daré ejemplos concretos, parámetros típicos y buenas prácticas para evitar eliminar datos por error.

Requisitos previos

  • Cuenta Azure con permisos para crear recursos (Synapse workspace, Storage, Function).
  • Azure Synapse Analytics workspace con Synapse Pipelines habilitado.
  • ADLS Gen2 (Storage account) con un contenedor de datos y algunos prefijos (por ejemplo logs/ o staging/).
  • Azure Function App (Consumption o Premium) con identity o clave para eliminar archivos.
  • Familiaridad básica con JSON y PowerShell/Python para probar localmente.

Paso 1: Concepto y porqué de la arquitectura

En lugar de realizar operaciones masivas directamente en Synapse (que puede aumentar costes y complejidad), el patrón separa orquestación y ejecución: Synapse Pipelines actúa como scheduler y orquestador; la Azure Function contiene la lógica de listado y eliminación en ADLS Gen2. Ventajas: escalabilidad (la Function puede escalar con la carga), logging y telemetría centralizados, reutilización de la Function por otros pipelines y menor superficie de riesgo en la eliminación de archivos.

Ejemplo concreto: en una empresa que acumula 100k archivos pequeños por mes, eliminar archivos con más de 90 días puede reducir una sobrecarga de lectura/listado y costes operativos. Adicionalmente, un pipeline diario que compruebe un prefijo con 10k archivos suele completarse en menos de 5 minutos con la Function, dependiendo del tamaño y de la latencia de la cuenta de almacenamiento.

Paso 2: Crear la Azure Function para eliminar archivos antiguos

La Function recibe parámetros (container, prefix, edad en días, modo_preview) y elimina archivos con lastModified anterior a la fecha límite. Aquí hay un ejemplo robusto en Python (usa azure-storage-blob), que incluye logging, un modo preview para no eliminar nada durante pruebas y retorno con un recuento limitado para evitar payloads muy grandes.

import os
import logging
from datetime import datetime, timezone, timedelta
from azure.storage.blob import ContainerClient

conn_str = os.environ.get('AZURE_STORAGE_CONNECTION_STRING')

def main(req):
    data = req.get_json()
    container = data.get('container')
    prefix = data.get('prefix','')
    days = int(data.get('days',30))
    preview = bool(data.get('preview',True))

    client = ContainerClient.from_connection_string(conn_str, container)
    cutoff = datetime.now(timezone.utc) - timedelta(days=days)
    deleted = []

    for blob in client.list_blobs(name_starts_with=prefix):
        try:
            if blob.last_modified and blob.last_modified < cutoff:
                logging.info(f"Candidate: {blob.name} last_modified={blob.last_modified}")
                if not preview:
                    client.get_blob_client(blob).delete_blob()
                    deleted.append(blob.name)
                else:
                    # preview mode: apenas registar
                    deleted.append(f"PREVIEW:{blob.name}")
        except Exception as e:
            logging.error(f"Erro a processar {blob.name}: {e}")

    return {
        'status': 200,
        'deleted_count': len([d for d in deleted if not str(d).startswith('PREVIEW')]),
        'preview': preview,
        'sample': deleted[:50]
    }

Paso 3: Habilitar autenticación y acceso a ADLS Gen2

Tienes dos opciones principales: usar AZURE_STORAGE_CONNECTION_STRING en los Application Settings de la Function (rápido para dev) o asignar una Managed Identity y usar RBAC (recomendado para producción). Para entornos críticos, crea una Managed Identity para la Function y asigna la role "Storage Blob Data Contributor" a nivel del contenedor o de la cuenta de storage. Esto evita exponer claves y facilita la rotación de credenciales.

Ejemplo: en una política de seguridad, concede la role solo al contenedor de destino; en alternativa, usa políticas más restrictivas como Azure AD + ACLs POSIX si necesitas control por archivo.

Paso 4: Crear un Synapse Pipeline que llame a la Function

En Synapse Studio crea un Pipeline con un Web Activity que hace POST a la URL de la Function. Pasa los parámetros JSON (container, prefix, days, preview). Esto permite programar, monitorizar ejecuciones e integrar condiciones antes y después de la limpieza.

{
  "method": "POST",
  "url": "https://.azurewebsites.net/api/",
  "headers": {
    "Content-Type": "application/json"
  },
  "body": {
    "container": "dados",
    "prefix": "logs/",
    "days": 90,
    "preview": true
  }
}

Paso 5: Añadir lógica de reintento y notificación

Configura en el Web Activity propiedades de retry (ej.: 3 intentos con 30 s entre cada uno) y timeout (por ejemplo 5 m). Usa una Activity "If Condition" para evaluar el campo deleted_count en el output y, en caso de valores superiores a un umbral (ej.: >1000), encamina a una Logic App que notifique al equipo vía e-mail o Teams. En errores, registra la ejecución y envía alertas automáticas.

Paso 6: Programar y probar el Pipeline

Usa un Trigger de schedule en el Synapse Pipeline (ej.: diario a las 02:00). Ejecuta pruebas con preview=true y days=1 en un prefijo de desarrollo para confirmar el comportamiento. Después, haz una prueba controlada con preview=false en un prefijo de staging y límite de días (por ejemplo 180) antes de aplicar en producción. Verifica siempre los logs de la Azure Function y los detalles del run en Synapse para confirmar deleted_count y sample.

Verificar el resultado

Confirma en Storage Explorer o en el portal de la Storage account que los archivos con lastModified anteriores al cutoff fueron eliminados. En el Synapse Pipeline revisa los run details del Web Activity: debe devolver deleted_count, flag preview y una lista de muestra. Consulta también Application Insights (si está configurado) para métricas de latencia y errores.

Conclusión

Este patrón con Synapse Pipelines orquestando una Azure Function es sencillo, reutilizable y permite automatizar la limpieza del Data Lake con seguridad. En producción, se recomienda usar Managed Identity, instrumentar con Application Insights y empezar con modo preview y límites progresivos. Consejo final: mantén siempre un prefijo de dev y un proceso de validación antes de aplicar reglas a datos críticos para no correr el riesgo de pérdida accidental.