Ejecutar pruebas unitarias para trabajos ETL de Python en AWS Glue con el marco pytest - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Ejecutar pruebas unitarias para trabajos ETL de Python en AWS Glue con el marco pytest

Repositorio de código: aws-glue-jobs-unit -testing

Entorno: producción

Tecnologías: macrodatos DevOps; DevelopmentAndTesting

Servicios de AWS: AWS CloudFormation CodeBuild; AWS CodeCommit; AWS CodePipeline; AWS Glue

Resumen

Puede ejecutar pruebas unitarias para trabajos de extracción, transformación y carga (ETL) de Python para AWS Glue en un entorno de desarrollo local, pero replicar esas pruebas en una DevOps canalización puede resultar difícil y llevar mucho tiempo. Las pruebas unitarias pueden resultar especialmente difíciles cuando se moderniza el proceso de ETL de unidad central en las pilas de tecnología de AWS. Este patrón le muestra cómo simplificar las pruebas unitarias y, al mismo tiempo, mantener intacta la funcionalidad existente, evitar interrupciones de funcionalidad de la aplicaciones clave cuando se lanzan nuevas características y mantener un software de alta calidad. Puede usar los pasos y los ejemplos de código de este patrón para ejecutar pruebas unitarias para trabajos ETL de Python en AWS Glue mediante el marco pytest de AWS CodePipeline. También puede usar este patrón para probar e implementar varios trabajos de AWS Glue.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa

  • URI de imagen de Amazon Elastic Container Registry (Amazon ECR) para su biblioteca de AWS Glue, descargada de la galería pública de Amazon ECR

  • Terminal Bash (en cualquier sistema operativo) con un perfil para la cuenta de AWS y la región de AWS de destino

  • Python 3.10 o posterior

  • Pytest

  • Biblioteca Moto Python para probar los servicios de AWS

Arquitectura

Pila de tecnología

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • AWS Glue

  • Pytest

  • Python

  • Biblioteca ETL de Python para AWS Glue

Arquitectura de destino

En el siguiente diagrama se describe cómo incorporar las pruebas unitarias para los procesos ETL de AWS Glue basados en Python en una canalización típica de AWS DevOps a escala empresarial.

Pruebas unitarias para los procesos AWS Glue ETL

En el diagrama, se muestra el siguiente flujo de trabajo:

  1. En la fase de código fuente, CodePipeline utiliza un CodeCommit repositorio para el código fuente, que incluye un ejemplo de trabajo ETL de Python (sample.py), un archivo de prueba unitaria (test_sample.py) y una CloudFormation plantilla de AWS. A continuación, CodePipeline transfiere el código más reciente de la rama principal al CodeBuild proyecto para su posterior procesamiento.

  2. En la etapa de creación y publicación, el código más reciente de la etapa de origen anterior se somete a pruebas unitarias con la ayuda de una imagen de Amazon ECR pública de AWS Glue. A continuación, el informe de la prueba se publica en los grupos de CodeBuild informes. La imagen del contenedor en el repositorio público de Amazon ECR para las bibliotecas de AWS Glue incluye todos los binarios necesarios para ejecutar tareas de ETL PySparkbasadas en pruebas unitarias en AWS Glue de forma local. El repositorio de contenedores público tiene tres etiquetas de imagen, una para cada versión compatible con AWS Glue. Con fines de demostración, este patrón usa la etiqueta de imagen glue_libs_4.0.0_image_01. Para usar esta imagen de contenedor como imagen en tiempo de ejecución CodeBuild, copie el URI de la imagen que corresponda a la etiqueta de imagen que pretende usar y, a continuación, actualice el pipeline.yml archivo en el GitHub repositorio del recurso. TestBuild

  3. En la fase de despliegue, el CodeBuild proyecto se lanza y publica el código en un bucket de Amazon Simple Storage Service (Amazon S3) si se aprueban todas las pruebas.

  4. El usuario implementa la tarea AWS Glue mediante la CloudFormation plantilla de la deploy carpeta.

Herramientas

Herramientas de AWS

  • Amazon Elastic Container Registry (Amazon ECR) es un servicio de registro de imágenes de contenedor administrado que es seguro, escalable y fiable.

  • AWS CodeBuild es un servicio de compilación totalmente gestionado que le ayuda a compilar código fuente, ejecutar pruebas unitarias y producir artefactos listos para su implementación.

  • AWS CodeCommit es un servicio de control de versiones que le ayuda a almacenar y gestionar repositorios de Git de forma privada, sin necesidad de gestionar su propio sistema de control de código fuente.

  • AWS le CodePipeline ayuda a modelar y configurar rápidamente las diferentes etapas de una versión de software y a automatizar los pasos necesarios para publicar cambios de software de forma continua.

  • AWS Glue es un servicio ETL completamente administrado. Ayuda a clasificar, limpiar, enriquecer y mover datos de forma fiable entre almacenes de datos y flujos de datos.

Otras herramientas

  • Python es un lenguaje de programación de uso general interpretado de alto nivel.

  • Moto es una biblioteca de Python para probar los servicios de AWS.

  • Pytest es un marco para escribir pruebas unitarias pequeñas que se escalan para permitir pruebas funcionales complejas para aplicaciones y bibliotecas.

  • La biblioteca ETL de Python para AWS Glue es un repositorio de bibliotecas de Python que se utilizan en el desarrollo local de trabajos PySpark por lotes para AWS Glue.

Código

El código de este patrón está disponible en el repositorio GitHub aws-glue-jobs-unit-testing. El repositorio incluye los siguientes recursos:

  • Un ejemplo de trabajo de AWS Glue basado en Python en la carpeta src

  • Los casos de pruebas unitarias asociados (creados con el marco pytest) están en la carpeta tests

  • Una CloudFormation plantilla (escrita en YAML) en la carpeta deploy

Prácticas recomendadas

Seguridad de los recursos CodePipeline

Se recomienda utilizar el cifrado y la autenticación en los repositorios de origen que se conectan a tus canalizaciones. CodePipeline Para obtener más información, consulta las prácticas recomendadas de seguridad en la CodePipeline documentación.

Supervisión y registro de los CodePipeline recursos

Se recomienda utilizar las funciones de registro de AWS para determinar qué acciones realizan los usuarios en su cuenta y qué recursos utilizan. Los archivos de registro muestran lo siguiente:

  • La fecha y la hora de las acciones

  • Dirección IP de origen de las acciones

  • Las acciones que han fallado debido a permisos inadecuados

Las funciones de registro están disponibles en AWS CloudTrail y Amazon CloudWatch Events. Puede utilizarlo CloudTrail para registrar las llamadas a las API de AWS y los eventos relacionados realizados por su cuenta de AWS o en su nombre. Para obtener más información, consulte Registrar llamadas a la CodePipeline API con AWS CloudTrail en la CodePipeline documentación.

Puede usar CloudWatch Events para monitorear los recursos y las aplicaciones de la nube de AWS que se ejecutan en AWS. También puede crear alertas en CloudWatch Events. Para obtener más información, consulte Supervisión de CodePipeline eventos en la CodePipeline documentación.

Epics

TareaDescripciónHabilidades requeridas

Prepare el archivo de códigos para su implementación.

  1. Descárguelo code.zip del repositorio GitHub aws-glue-jobs-unit-testing o cree el archivo.zip usted mismo mediante una herramienta de línea de comandos. Por ejemplo, puede crear el archivo .zip en Linux o Mac ejecutando los siguientes comandos en la terminal:

    git clone https://github.com/aws-samples/aws-glue-jobs-unit-testing.git cd aws-glue-jobs-unit-testing git checkout master zip -r code.zip src/ tests/ deploy/
  2. Inicie sesión en la consola de administración de AWS y elija la región de AWS que prefiera.

  3. Cree un bucket de S3 y, a continuación, cargue el paquete .zip y el archivo code.zip (descargados anteriormente) en el bucket de S3 creado.

DevOps ingeniero

Crea la CloudFormation pila.

  1. Inicie sesión en la consola de administración de AWS y, a continuación, abra la CloudFormation consola.

  2. Elija Create stack (Crear pila) y, a continuación, seleccione With existing resources (import resources) (Con recursos existentes (importar recursos)).

  3. En la sección Especificar la plantilla de la página Crear pila, elija Cargar un archivo de plantilla y, a continuación, elija la plantilla pipeline.yml (descargada del repositorio). GitHub A continuación, elija Siguiente.

  4. En Nombre de pila glue-unit-testing-pipeline, introduce o elige el nombre de pila que prefieras.

  5. Para ApplicationStackName, usa el glue-codepipeline-appnombre rellenado previamente. Este es el nombre de la CloudFormation pila que crea la canalización.

  6. Para BranchName, usa el nombre maestro rellenado previamente. Es el nombre de la rama creada en el CodeCommit repositorio para incluir el código del archivo.zip del bucket de S3.

  7. Para ello BucketName, utilice el nombre del bucket aws-glue-artifacts-us-east-1 rellenado previamente. Este es el nombre del bucket de S3 que contiene el archivo .zip y que la canalización utiliza para almacenar artefactos de código.

  8. Para CodeZipFile, utilice el valor code.zip rellenado previamente. Este es el nombre de la clave del objeto S3 de código de ejemplo. El objeto debe ser un archivo .zip.

  9. Para RepositoryName, utilice el nombre rellenado previamente aws-glue-unit-testing. Este es el nombre del CodeCommit repositorio que crea la pila.

  10. Para TestReportGroupName, usa el glue-unittest-reportnombre rellenado previamente. Es el nombre del grupo de informes de CodeBuild pruebas que se creó para almacenar los informes de las pruebas unitarias.

  11. Seleccione Next (Siguiente) y, a continuación, vuelva a seleccionar Next (Siguiente) en la página Configure stack options (Configurar opciones de pila).

  12. En la página de revisión, en Capacidades, elija la opción Reconozco que CloudFormation podría crear recursos de IAM con nombres personalizados.

  13. Elija Submit (Enviar). Una vez finalizada la creación de la pila, podrá ver los recursos creados en la pestaña Resources (Recursos). Las pilas tardan aproximadamente entre 5 y 7 minutos en crearse.

La pila crea automáticamente un CodeCommit repositorio con el código inicial que se registró en el archivo.zip y se cargó en el depósito de S3. Además, la pila crea una CodePipeline vista utilizando el CodeCommit repositorio como fuente. En los pasos anteriores, el CodeCommit repositorio es aws-glue-unit-testy la canalización es aws-glue-unit-test-pipeline.

AWS DevOps, DevOps ingeniero

Limpie los recursos del entorno.

Para evitar costos de infraestructura adicionales, asegúrese de eliminar la pila después de experimentar con los ejemplos que se proporcionan en este patrón.

  1. Abra la CloudFormation consola y, a continuación, seleccione la pila que ha creado.

  2. Elija Eliminar. Esto elimina todos los recursos que creó su pila, incluidos los CodeCommit repositorios, las funciones o políticas de AWS Identity and Access Management (IAM) y los proyectos. CodeBuild

AWS DevOps, DevOps ingeniero
TareaDescripciónHabilidades requeridas

Ejecute las pruebas unitarias en la canalización.

  1. Para probar la canalización implementada, inicie sesión en la consola de administración de AWS y, a continuación, abra la CodePipeline consola.

  2. Seleccione la canalización creada por la CloudFormation pila y, a continuación, elija Release change. La canalización comienza a ejecutarse (utilizando el código más reciente del CodeCommit repositorio).

  3. Una vez finalizada la etapa de Test_and_build, seleccione la pestaña Details (Detalles) y, a continuación, examine los registros.

  4. Seleccione la pestaña Reports (Informes) y, a continuación, elija el informe de prueba en el Report history (Historial de informes) para ver los resultados de las pruebas unitarias.

  5. Una vez finalizada la etapa de implementación, ejecute y supervise el trabajo de AWS Glue implementado en la consola de AWS Glue. Para obtener más información, consulte Monitoreo de AWS Glue en la documentación de AWS Glue.

AWS DevOps, DevOps ingeniero

Resolución de problemas

ProblemaSolución

Una canalización con Amazon S3, Amazon ECR o una CodeCommit fuente ya no se inicia automáticamente

Si cambia los ajustes de configuración de una acción que utiliza reglas de CloudWatch eventos en Amazon EventBridge o Events para la detección de cambios, es posible que la consola de administración de AWS no detecte ningún cambio en el que los identificadores de origen sean similares y tengan caracteres iniciales idénticos. Como la consola no crea la nueva regla de eventos, la canalización ya no se inicia automáticamente.

Por ejemplo, cambiar el nombre de una CodeCommit sucursal de MyTestBranch-1 a MyTestBranch-2 es un cambio menor. Como el cambio se produce al final del nombre de la rama, es posible que la regla de eventos de la acción de origen no actualice ni cree una regla para la nueva configuración del origen.

Esto se aplica a las siguientes acciones de origen que utilizan eventos de CloudWatch Events para la detección de cambios:

  • El nombre del bucket de S3 y los parámetros clave de objeto de S3 o los identificadores de consola cuando la acción de origen se encuentra en Amazon S3

  • El nombre del repositorio y los parámetros de etiqueta de imagen o los identificadores de consola cuando la acción de origen se encuentra en Amazon ECR

  • El nombre del repositorio y el nombre de la rama, los parámetros o los identificadores de la consola cuando la acción de origen está activa CodeCommit

Para resolver este problema, siga uno de estos pasos:

  • Cambie los ajustes de configuración en Amazon S3, Amazon ECR o CodeCommit, para que los cambios se realicen en la parte inicial del valor del parámetro. Por ejemplo, cambie el nombre de la ramificación de release-branch a 2nd-release-branch. Evite un cambio al final del nombre, por ejemplo release-branch-2.

  • Cambie los ajustes de configuración en Amazon S3, Amazon ECR o CodeCommit en cada canalización. Por ejemplo, cambie el nombre de la ramificación de myRepo/myBranch a myDeployRepo/myDeployBranch. Evite un cambio al final del nombre, por ejemplo myRepo/myBranch2.

  • En lugar de utilizar la consola de administración de AWS, utilice la interfaz de línea de comandos de AWS (AWS CLI) o CloudFormation AWS para crear y actualizar las reglas de los eventos de detección de cambios. Para obtener instrucciones sobre cómo crear reglas de eventos para una acción de origen de Amazon S3, consulte Acciones y CloudWatch eventos de origen de Amazon S3. Para obtener instrucciones sobre cómo crear reglas de eventos para una acción de Amazon ECR, consulte Amazon ECR source actions and CloudWatch Events. Para obtener instrucciones sobre cómo crear reglas de eventos para una CodeCommit acción, consulte la CodeCommit fuente de acciones y CloudWatch eventos. Tras editar la configuración de acción en la consola, acepte los recursos de detección de cambios actualizados creados por la consola.

Recursos relacionados

Información adicional

Además, puede implementar las CloudFormation plantillas de AWS mediante la CLI de AWS. Para obtener más información, consulte Implementación rápida de plantillas con transformaciones en la CloudFormation documentación.