Exécutez des tests unitaires pour les tâches ETL Python dans AWS Glue à l'aide du framework pytest - Recommandations AWS

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Exécutez des tests unitaires pour les tâches ETL Python dans AWS Glue à l'aide du framework pytest

Dépôt de code : aws-glue-jobs-unit-testing

Environnement : Production

Technologies : DevOps mégadonnées, développement et tests de logiciels

Services AWS : AWS CloudFormation ; AWS CodeBuild ; AWS CodeCommit ; AWS CodePipeline ; AWS Glue

Récapitulatif

Vous pouvez exécuter des tests unitaires pour des tâches d'extraction, de transformation et de chargement (ETL) en Python pour AWS Glue dans un environnement de développement local, mais la réplication de ces tests dans un DevOps pipeline peut s'avérer difficile et fastidieuse. Les tests unitaires peuvent être particulièrement difficiles lorsque vous modernisez le processus ETL du mainframe sur les piles technologiques AWS. Ce modèle vous montre comment simplifier les tests unitaires, tout en préservant les fonctionnalités existantes, en évitant d'interrompre les fonctionnalités clés de l'application lorsque vous publiez de nouvelles fonctionnalités et en maintenant des logiciels de haute qualité. Vous pouvez utiliser les étapes et les exemples de code de ce modèle pour exécuter des tests unitaires pour les tâches ETL Python dans AWS Glue en utilisant le framework pytest dans AWS CodePipeline. Vous pouvez également utiliser ce modèle pour tester et déployer plusieurs tâches AWS Glue.

Conditions préalables et limitations

Prérequis

  • Un compte AWS actif

  • Une URI d'image Amazon Elastic Container Registry (Amazon ECR) pour votre bibliothèque AWS Glue, téléchargée depuis la galerie publique Amazon ECR

  • Terminal Bash (sur n'importe quel système d'exploitation) avec un profil pour le compte AWS cible et la région AWS

  • Python 3.10 ou version ultérieure

  • Pytest

  • Bibliothèque Moto Python pour tester les services AWS

Architecture

Pile technologique

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • AWS Glue

  • Pytest

  • Python

  • bibliothèque ETL Python pour AWS Glue

Architecture cible

Le schéma suivant décrit comment intégrer les tests unitaires pour les processus ETL AWS Glue basés sur Python dans un pipeline AWS DevOps classique à l'échelle d'une entreprise.

Tests unitaires pour les processus ETL d'AWS Glue

Le schéma suivant illustre le flux de travail suivant :

  1. Au stade source, CodePipeline utilise un CodeCommit référentiel pour le code source, y compris un exemple de tâche ETL Python (sample.py), un fichier de test unitaire (test_sample.py) et un CloudFormation modèle AWS. CodePipeline Transfère ensuite le code le plus récent de la branche principale vers le CodeBuild projet pour un traitement ultérieur.

  2. Au cours de la phase de création et de publication, le code le plus récent de l'étape source précédente est testé à l'unité à l'aide d'une image Amazon ECR publique d'AWS Glue. Le rapport de test est ensuite publié dans les groupes de CodeBuild rapports. L'image du conteneur dans le référentiel public Amazon ECR pour les bibliothèques AWS Glue inclut tous les fichiers binaires nécessaires pour exécuter des tâches ETL PySparkbasées sur des tests unitaires dans AWS Glue localement. Le référentiel de conteneurs public comporte trois balises d'image, une pour chaque version prise en charge par AWS Glue. À des fins de démonstration, ce modèle utilise la balise glue_libs_4.0.0_image_01 image. Pour utiliser cette image de conteneur comme image d'exécution CodeBuild, copiez l'URI de l'image qui correspond à la balise d'image que vous souhaitez utiliser, puis mettez à jour le pipeline.yml fichier dans le GitHub référentiel de la TestBuild ressource.

  3. Au cours de la phase de déploiement, le CodeBuild projet est lancé et le code est publié dans un bucket Amazon Simple Storage Service (Amazon S3) si tous les tests sont réussis.

  4. L'utilisateur déploie la tâche AWS Glue à l'aide du CloudFormation modèle figurant dans le deploy dossier.

Outils

Outils AWS

  • Amazon Elastic Container Registry (Amazon ECR) est un service géré de registre d'images de conteneurs sécurisé, évolutif et fiable.

  • AWS CodeBuild est un service de génération entièrement géré qui vous aide à compiler le code source, à exécuter des tests unitaires et à produire des artefacts prêts à être déployés.

  • AWS CodeCommit est un service de contrôle de version qui vous permet de stocker et de gérer de manière privée des référentiels Git, sans avoir à gérer votre propre système de contrôle de source.

  • AWS vous CodePipeline aide à modéliser et à configurer rapidement les différentes étapes d'une version logicielle et à automatiser les étapes nécessaires à la publication continue des modifications logicielles.

  • AWS Glue est un service ETL entièrement géré. Il vous aide à classer, nettoyer, enrichir et déplacer les données de manière fiable entre les magasins de données et les flux de données.

Autres outils

  • Python est un langage de programmation de haut niveau interprété à usage général.

  • Moto est une bibliothèque Python permettant de tester les services AWS.

  • Pytest est un framework permettant d'écrire de petits tests unitaires évolutifs pour prendre en charge des tests fonctionnels complexes pour les applications et les bibliothèques.

  • La bibliothèque Python ETL pour AWS Glue est un référentiel pour les bibliothèques Python utilisées dans le développement local de tâches PySpark par lots pour AWS Glue.

Code

Le code de ce modèle est disponible dans le dépôt GitHub aws-glue-jobs-unit-testing. Le référentiel inclut les ressources suivantes :

  • Exemple de tâche AWS Glue basée sur Python dans le dossier src

  • Cas de tests unitaires associés (créés à l'aide du framework pytest) dans le dossier tests

  • Un CloudFormation modèle (écrit en YAML) dans le dossier deploy

Bonnes pratiques

Sécurité des CodePipeline ressources

Il est recommandé d'utiliser le chiffrement et l'authentification pour les référentiels sources qui se connectent à vos pipelines. CodePipeline Pour plus d'informations, consultez la section Bonnes pratiques en matière de sécurité dans la CodePipeline documentation.

Surveillance et journalisation des CodePipeline ressources

Il est recommandé d'utiliser les fonctionnalités de journalisation d'AWS pour déterminer les actions que les utilisateurs effectuent sur votre compte et les ressources qu'ils utilisent. Les fichiers journaux contiennent les informations suivantes :

  • Heure et date des actions

  • Adresse IP source des actions

  • Quelles actions ont échoué en raison d'autorisations inadéquates

Les fonctionnalités de journalisation sont disponibles dans AWS CloudTrail et Amazon CloudWatch Events. Vous pouvez l'utiliser CloudTrail pour consigner les appels d'API AWS et les événements connexes effectués par ou pour le compte de votre compte AWS. Pour plus d'informations, consultez la section Journalisation des appels d' CodePipeline API avec AWS CloudTrail dans la CodePipeline documentation.

Vous pouvez utiliser CloudWatch les événements pour surveiller les ressources de votre cloud AWS et les applications exécutées sur AWS. Vous pouvez également créer des alertes dans CloudWatch Événements. Pour plus d'informations, consultez la section Surveillance CodePipeline des événements dans la CodePipeline documentation.

Épopées

TâcheDescriptionCompétences requises

Préparez l'archive de code pour le déploiement.

  1. code.zipTéléchargez-le depuis le dépôt GitHub aws-glue-jobs-unit-testing ou créez vous-même le fichier .zip à l'aide d'un outil de ligne de commande. Par exemple, vous pouvez créer le fichier .zip sous Linux ou Mac en exécutant les commandes suivantes dans le 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. Connectez-vous à l'AWS Management Console et choisissez la région AWS de votre choix.

  3. Créez un compartiment S3, puis chargez le package et le code.zip fichier .zip (téléchargés précédemment) dans le compartiment S3 que vous avez créé.

DevOps ingénieur

Créez la CloudFormation pile.

  1. Connectez-vous à l'AWS Management Console, puis ouvrez la CloudFormation console.

  2. Choisissez Créer une pile, puis sélectionnez Avec les ressources existantes (ressources d'importation).

  3. Dans la section Spécifier le modèle de la page Créer une pile, choisissez Télécharger un fichier modèle, puis choisissez le modèle pipeline.yml (téléchargé depuis le référentiel). GitHub Ensuite, choisissez Suivant.

  4. Dans Stack name, entrez glue-unit-testing-pipeline ou choisissez le nom de pile de votre choix.

  5. Pour ApplicationStackNom, utilisez le nom prérempli de l'application glue-codepipeline-app. Il s'agit du nom de la CloudFormation pile créée par le pipeline.

  6. Pour BranchName, utilisez le nom principal prérempli. Il s'agit du nom de la branche créée dans le CodeCommit référentiel pour archiver le code du fichier .zip pour le compartiment S3.

  7. Pour BucketName, utilisez le nom du bucket aws-glue-artifacts-us-east-1 prérempli. Il s'agit du nom du compartiment S3 qui contient le fichier .zip et qui est utilisé par le pipeline pour stocker les artefacts de code.

  8. Pour CodeZipFile, utilisez la valeur code.zip préremplie. Il s'agit du nom clé de l'objet S3 de code d'exemple. L'objet doit être un fichier .zip.

  9. Pour RepositoryName, utilisez le nom aws-glue-unit-testing prérempli. Il s'agit du nom du CodeCommit dépôt créé par la pile.

  10. Pour TestReportGroupName, utilisez le nom prérempli du rapport glue-unittest-report. Il s'agit du nom du groupe de rapports de CodeBuild test créé pour stocker les rapports de tests unitaires.

  11. Choisissez Next, puis de nouveau Next sur la page Configurer les options de pile.

  12. Sur la page de révision, sous Fonctionnalités, choisissez l'option Je reconnais que des ressources IAM CloudFormation pourraient être créées avec des noms personnalisés.

  13. Sélectionnez Envoyer. Une fois la création de la pile terminée, vous pouvez voir les ressources créées dans l'onglet Ressources. La création de la pile prend environ 5 à 7 minutes.

La pile crée automatiquement un CodeCommit référentiel avec le code initial qui a été enregistré à partir du fichier .zip et chargé dans le compartiment S3. En outre, la pile crée une CodePipeline vue en utilisant le CodeCommit référentiel comme source. Dans les étapes ci-dessus, le CodeCommit référentiel est aws-glue-unit-test et le pipeline est aws-glue-unit-test-pipeline.

AWS DevOps, DevOps ingénieur

Nettoyez les ressources de votre environnement.

Pour éviter des coûts d'infrastructure supplémentaires, assurez-vous de supprimer la pile après avoir testé les exemples fournis dans ce modèle.

  1. Ouvrez la CloudFormation console, puis sélectionnez la pile que vous avez créée.

  2. Sélectionnez Delete (Supprimer). Cela supprime toutes les ressources créées par votre stack, y compris les CodeCommit référentiels, les rôles ou politiques AWS Identity and Access Management (IAM) et les projets. CodeBuild

AWS DevOps, DevOps ingénieur
TâcheDescriptionCompétences requises

Exécutez les tests unitaires dans le pipeline.

  1. Pour tester le pipeline déployé, connectez-vous à l'AWS Management Console, puis ouvrez la CodePipeline console.

  2. Sélectionnez le pipeline créé par la CloudFormation pile, puis choisissez Release change. Le pipeline commence à s'exécuter (en utilisant le code le plus récent du CodeCommit référentiel).

  3. Une fois la phase Test_and_build terminée, choisissez l'onglet Détails, puis examinez les journaux.

  4. Choisissez l'onglet Rapports, puis sélectionnez le rapport de test dans l'historique des rapports pour afficher les résultats des tests unitaires.

  5. Une fois la phase de déploiement terminée, exécutez et surveillez la tâche AWS Glue déployée sur la console AWS Glue. Pour plus d'informations, consultez la section Surveillance d'AWS Glue dans la documentation d'AWS Glue.

AWS DevOps, DevOps ingénieur

Résolution des problèmes

ProblèmeSolution

Un pipeline avec un Amazon S3, Amazon ECR ou CodeCommit une source ne démarre plus automatiquement

Si vous modifiez les paramètres de configuration d'une action qui utilise des règles relatives aux événements dans Amazon EventBridge ou CloudWatch des événements pour la détection des modifications, il est possible que l'AWS Management Console ne détecte pas de modification lorsque les identifiants de source sont similaires et comportent des caractères initiaux identiques. Comme la nouvelle règle d'événement n'est pas créée par la console, le pipeline ne démarre plus automatiquement.

Par exemple, la modification du nom d'une CodeCommit branche de MyTestBranch-1 à MyTestBranch-2 est une modification mineure. Comme la modification se trouve à la fin du nom de la branche, il est possible que la règle d'événement pour l'action source ne soit pas mise à jour ou ne crée pas de règle pour les nouveaux paramètres de source.

Cela s'applique aux actions source suivantes qui utilisent des CloudWatch événements dans Events pour détecter les modifications :

  • Le nom du compartiment S3 et les paramètres clés ou identifiants de console de l'objet S3 lorsque l'action source est effectuée dans Amazon S3

  • Le nom du référentiel et les paramètres de balise d'image ou les identifiants de console lorsque l'action source est effectuée dans Amazon ECR

  • Le nom du référentiel et le nom de branche, les paramètres ou les identifiants de console lorsque l'action source est en cours CodeCommit

Pour résoudre le problème, effectuez l'une des opérations suivantes :

  • Modifiez les paramètres de configuration dans Amazon S3, Amazon ECR ou CodeCommit, afin que des modifications soient apportées à la partie initiale de la valeur du paramètre. Par exemple, remplacez le nom de release-branch votre succursale par2nd-release-branch. Évitez de modifier la fin du nom, par exemplerelease-branch-2.

  • Modifiez les paramètres de configuration dans Amazon S3, Amazon ECR ou CodeCommit pour chaque pipeline. Par exemple, remplacez le nom de myRepo/myBranch votre succursale parmyDeployRepo/myDeployBranch. Évitez de modifier la fin du nom, par exemplemyRepo/myBranch2.

  • Au lieu d'utiliser l'AWS Management Console, utilisez l'AWS Command Line Interface (AWS CLI) ou CloudFormation AWS pour créer et mettre à jour vos règles relatives aux événements de détection des modifications. Pour obtenir des instructions sur la création de règles d'événement pour une action source Amazon S3, consultez Actions et CloudWatch événements source Amazon S3. Pour obtenir des instructions sur la création de règles d'événement pour une action Amazon ECR, consultez la section Actions source Amazon ECR et CloudWatch Events. Pour obtenir des instructions sur la création de règles d'événement pour une CodeCommit action, consultez les sections Actions CodeCommit source et CloudWatch Événements. Après avoir modifié la configuration de vos actions dans la console, acceptez les ressources de détection des modifications mises à jour créées par la console.

Ressources connexes

Informations supplémentaires

En outre, vous pouvez déployer les CloudFormation modèles AWS à l'aide de l'interface de ligne de commande AWS. Pour plus d'informations, consultez la section Déploiement rapide de modèles avec transformations dans la CloudFormation documentation.