Programación, IaC, CI/CD

Resuma herramientas IaC (CloudFormation, CDK, SAM), configuración Lambda, CI/CD y conceptos de computación distribuida.

Un pipeline de datos es en última instancia código. La función Lambda que recopila datos, el trabajo Glue que los transforma, el bucket S3 que los almacena — todo debe definirse y gestionarse como código. Al igual que los desarrolladores de software usan control de versiones y despliegue automatizado para el código de aplicaciones, los ingenieros de datos gestionan su infraestructura y pipelines como código. Esto es posible gracias a IaC (Infrastructure as Code) y los pipelines CI/CD. El examen AWS DEA-C01 evalúa tu comprensión de estas herramientas y cuándo usar cada una correctamente.

 

Comparación de Herramientas IaC — Formas de Definir Infraestructura como Código

IaC significa "definir la infraestructura como código para que pueda crearse, gestionarse y eliminarse automáticamente." En lugar de crear manualmente un bucket S3 en la consola de AWS, configurar RDS y desplegar Lambda a mano, un único archivo de código hace todo eso en un solo paso.

| Herramienta | Lenguaje | Características | |------------|---------|----------------| | AWS CloudFormation | YAML o JSON | IaC nativa de AWS. Plantillas declarativas. Compatible con todos los recursos AWS. | | AWS CDK | Python, TypeScript, Java, etc. | Define infraestructura con lenguajes de programación. Compila a CloudFormation internamente. | | AWS SAM | YAML (extensión de CloudFormation) | Especializado para aplicaciones serverless. Definición simplificada para Lambda, API Gateway, DynamoDB. |

CloudFormation — Plantillas Declarativas

La idea es "declarar el estado final que quieres y AWS lo crea por ti." Como planos arquitectónicos, una plantilla CloudFormation dice "construye esta infraestructura," y AWS crea automáticamente los recursos necesarios.

Un Stack es la unidad central de CloudFormation. Los recursos AWS relacionados se agrupan en un stack y pueden crearse, actualizarse y eliminarse juntos.

AWS CDK — Define Infraestructura con Lenguajes de Programación

CDK te permite definir infraestructura usando Python, TypeScript u otros lenguajes de programación. Es mucho más flexible que YAML. Puedes usar bucles, condicionales, funciones y clases para definir infraestructura dinámicamente.

Por ejemplo, si necesitas crear el mismo bucket S3 en 10 regiones, CloudFormation requeriría 10 plantillas separadas. CDK lo resuelve con un solo bucle. El código CDK finalmente se sintetiza (compila) en plantillas CloudFormation antes del despliegue.

AWS SAM — IaC Especializado para Serverless

SAM (Serverless Application Model) es una extensión de CloudFormation. Define recursos serverless como Lambda, API Gateway y DynamoDB con mucho menos código repetitivo. La CLI de SAM también admite pruebas locales y despliegue simplificado.

 

Lambda — Entendiendo desde la Perspectiva de la Ingeniería de Datos

AWS Lambda ejecuta código sin ningún servidor. El código solo se ejecuta cuando un evento lo activa, y solo pagas por la duración de la ejecución. En la ingeniería de datos, Lambda actúa como "pequeños componentes de automatización" a lo largo de un pipeline.

Restricciones clave de Lambda que debes conocer

Concurrencia: El número de instancias Lambda ejecutándose simultáneamente. El límite predeterminado a nivel de cuenta es 1,000.

Concurrencia Reservada (Reserved Concurrency): Reserva un número específico de ejecuciones concurrentes para una Lambda particular. Evita que otras Lambdas consuman todo el límite. Concurrencia Aprovisionada (Provisioned Concurrency): Pre-calienta instancias para que estén listas para responder instantáneamente — eliminando los arranques en frío (el retraso que ocurre cuando una función se ejecuta por primera vez después de un período de inactividad).

Tiempo de espera (Timeout): Máximo 15 minutos. Cualquier trabajo ETL que necesite más de 15 minutos debe moverse a Glue ETL o EMR. Lambda es más adecuado para tareas cortas y rápidas en la ingeniería de datos.

Memoria: Configurable de 128 MB a 10 GB. En Lambda, aumentar la memoria también aumenta proporcionalmente el rendimiento de la CPU. Si el procesamiento de datos es lento, aumentar la memoria es la primera optimización a intentar.

Montaje de EFS: Lambda puede montar Amazon EFS (Elastic File System) para acceder a archivos grandes. Aunque el almacenamiento temporal de Lambda (/tmp) tiene un máximo de 10 GB, EFS es la opción correcta para archivos compartidos entre múltiples funciones o conjuntos de datos más grandes.

Runtime: Python es con diferencia el runtime Lambda más común para la ingeniería de datos. Librerías como pandas, numpy y boto3 se pueden agregar como Lambda Layers.

 

Pipeline CI/CD — Despliegue Automatizado para Pipelines de Datos También

CI/CD (Integración Continua / Entrega Continua) es un sistema donde los cambios de código se prueban y despliegan automáticamente. Como los pipelines de datos son código, los mismos principios CI/CD que se aplican al desarrollo de software se aplican aquí también.

Un flujo típico de pipeline CI/CD en AWS:

CodeCommit: Repositorio Git gestionado por AWS, similar a GitHub. CodeBuild: Automatización de construcción y pruebas, se ejecuta en contenedores. CodeDeploy: Automatiza el despliegue de código de aplicaciones a EC2, Lambda y ECS. CodePipeline: Conecta todas las etapas anteriores en un único pipeline.

Consideraciones para CI/CD en pipelines de datos: Cambio en script Glue ETL → pruebas automatizadas → despliegue a S3 Cambio en plantilla CloudFormation/CDK → actualización automática del stack Cambio en código Lambda → despliegue automatizado + despliegue blue/green para reversión segura

 

Conceptos Fundamentales de Computación Distribuida

Para trabajar con sistemas de procesamiento distribuido como Spark y EMR, necesitas entender algunos conceptos fundamentales. Estos aparecen frecuentemente en preguntas del examen DEA-C01 sobre problemas de rendimiento y diseño de sistemas.

Shuffling (Barajado)

El proceso de redistribuir datos entre nodos. Por ejemplo, una operación GROUP BY país requiere que todos los registros del mismo país estén en el mismo nodo. Mover datos por la red para lograr esto es el shuffling.

El shuffling es costoso porque los datos viajan por la red entre nodos. Es una de las principales causas de problemas de rendimiento en Spark. Minimizar el shuffling es un tema central en la optimización de Spark.

Particionado (Partitioning)

Dividir datos en unidades lógicas para el procesamiento paralelo. Si divides 100 millones de registros en 100 particiones, 100 núcleos pueden procesar cada uno una partición simultáneamente. Muy pocas particiones significa baja paralelización; demasiadas aumenta la sobrecarga de coordinación.

Sesgo de Datos (Data Skew)

Cuando los datos están distribuidos de forma extremadamente desigual entre particiones. Por ejemplo, si una partición de 100 contiene el 80% de los datos totales, el nodo que procesa esa partición se convierte en un cuello de botella — todos los demás nodos terminan y esperan al único nodo sobrecargado. Todo el trabajo se ejecuta a la velocidad de la partición más lenta.

Cómo solucionar el sesgo: Cambiar la clave de partición a una columna con distribución más uniforme Dividir artificialmente la partición sesgada en partes más pequeñas (técnica llamada salting)

Serialización (Serialization)

Para enviar datos entre nodos, los objetos en memoria deben convertirse a un flujo de bytes (serialización), y el nodo receptor los convierte de vuelta a objetos (deserialización). La serialización Kryo es más rápida y compacta que la serialización predeterminada de Java y es la opción recomendada para trabajos Spark.

 

Resumen de Puntos Clave para el Examen

| Palabra clave | Herramienta/Concepto | |--------------|---------------------| | Definición declarativa de infraestructura YAML/JSON | AWS CloudFormation | | Define infraestructura con lenguaje de programación (Python/TypeScript) | AWS CDK | | IaC especializado en serverless (Lambda, API Gateway) | AWS SAM | | Acceder a archivos compartidos grandes desde Lambda | Montaje EFS | | Trabajo Lambda supera los 15 minutos | Cambiar a Glue ETL o EMR | | Eliminar arranques en frío de Lambda | Concurrencia Aprovisionada | | Construcción y despliegue automatizados al cambiar código | CodePipeline (CodeBuild + CodeDeploy) | | Redistribución de datos entre nodos (operación Spark costosa) | Shuffling | | Datos concentrados en particiones específicas | Data Skew (sesgo de datos) | | Corregir distribución desigual de particiones | Cambiar clave de partición o usar Salting |

CDK no reemplaza a CloudFormation — es una capa de abstracción construida sobre CloudFormation. El código CDK siempre se compila a una plantilla CloudFormation antes del despliegue.

Volver a la lista del blog