Führen Sie Komponententests für Python-ETL-Jobs in AWS Glue mithilfe des Pytest-Frameworks aus - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Führen Sie Komponententests für Python-ETL-Jobs in AWS Glue mithilfe des Pytest-Frameworks aus

Quellcode-Repository: aws-glue-jobs-unit-testing

Umgebung: Produktion

Technologien: DevOps; Große Datenmengen; Softwareentwicklung und Testen

AWS-Dienste: AWS CloudFormation CodeBuild; AWS CodeCommit; AWS CodePipeline; AWS Glue

Übersicht

Sie können Komponententests für Python-Jobs zum Extrahieren, Transformieren und Laden (ETL) für AWS Glue in einer lokalen Entwicklungsumgebung ausführen, aber die Replikation dieser Tests in einer DevOps Pipeline kann schwierig und zeitaufwändig sein. Unit-Tests können besonders schwierig sein, wenn Sie den Mainframe-ETL-Prozess auf AWS-Technologie-Stacks modernisieren. Dieses Muster zeigt Ihnen, wie Sie Komponententests vereinfachen und gleichzeitig die bestehende Funktionalität beibehalten, Unterbrechungen wichtiger Anwendungsfunktionen bei der Veröffentlichung neuer Funktionen vermeiden und hochwertige Software beibehalten können. Sie können die Schritte und Codebeispiele in diesem Muster verwenden, um Komponententests für Python-ETL-Jobs in AWS Glue auszuführen, indem Sie das Pytest-Framework in AWS CodePipeline verwenden. Sie können dieses Muster auch verwenden, um mehrere AWS Glue Glue-Jobs zu testen und bereitzustellen.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto

  • Eine Amazon Elastic Container Registry (Amazon ECR) -Image-URI für Ihre AWS Glue Glue-Bibliothek, heruntergeladen von der Amazon ECR Public Gallery

  • Bash-Terminal (auf einem beliebigen Betriebssystem) mit einem Profil für das AWS-Zielkonto und die AWS-Region

  • Python 3.10 oder höher

  • Pytest

  • Moto-Python-Bibliothek zum Testen von AWS-Services

Architektur

Technologie-Stack

  • Amazon Elastic Container Registry (Amazon ECR)

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • AWS Glue

  • Pytest

  • Python

  • Python-ETL-Bibliothek für AWS Glue

Zielarchitektur

Das folgende Diagramm beschreibt, wie Unit-Tests für AWS Glue ETL-Prozesse, die auf Python basieren, in eine typische DevOps AWS-Pipeline für Unternehmen integriert werden können.

Komponententests für AWS Glue ETL-Prozesse

Das Diagramm zeigt den folgenden Workflow:

  1. CodePipeline Verwendet in der Quellphase ein CodeCommit Repository für Quellcode, einschließlich eines Python-ETL-Beispieljobs (sample.py), einer Unit-Test-Datei (test_sample.py) und einer CloudFormation AWS-Vorlage. CodePipeline Überträgt dann den neuesten Code aus dem Hauptzweig zur weiteren Verarbeitung in das CodeBuild Projekt.

  2. In der Erstellungs- und Veröffentlichungsphase wird der neueste Code aus der vorherigen Quellphase mithilfe eines öffentlichen Amazon ECR-Images von AWS Glue auf Einheiten getestet. Anschließend wird der Testbericht für CodeBuild Berichtsgruppen veröffentlicht. Das Container-Image im öffentlichen Amazon ECR-Repository für AWS Glue-Bibliotheken enthält alle Binärdateien, die für die lokale Ausführung und auf Unit-Tests PySparkbasierende ETL-Aufgaben in AWS Glue erforderlich sind. Das öffentliche Container-Repository hat drei Image-Tags, einen für jede von AWS Glue unterstützte Version. Zu Demonstrationszwecken verwendet dieses Muster das glue_libs_4.0.0_image_01 Image-Tag. Um dieses Container-Image als Runtime-Image zu verwenden CodeBuild, kopieren Sie den Image-URI, der dem Image-Tag entspricht, den Sie verwenden möchten, und aktualisieren Sie dann die pipeline.yml Datei im GitHub Repository für die TestBuild Ressource.

  3. In der Bereitstellungsphase wird das CodeBuild Projekt gestartet und der Code wird in einem Amazon Simple Storage Service (Amazon S3) -Bucket veröffentlicht, wenn alle Tests erfolgreich sind.

  4. Der Benutzer stellt die AWS Glue Glue-Aufgabe mithilfe der CloudFormation Vorlage im deploy Ordner bereit.

Tools

AWS-Tools

  • Amazon Elastic Container Registry (Amazon ECR) ist ein verwalteter Container-Image-Registry-Service, der sicher, skalierbar und zuverlässig ist.

  • AWS CodeBuild ist ein vollständig verwalteter Build-Service, mit dem Sie Quellcode kompilieren, Komponententests ausführen und bereitstellungsbereite Artefakte erstellen können.

  • AWS CodeCommit ist ein Versionskontrollservice, mit dem Sie Git-Repositorys privat speichern und verwalten können, ohne Ihr eigenes Quellcodeverwaltungssystem verwalten zu müssen.

  • AWS CodePipeline hilft Ihnen dabei, die verschiedenen Phasen einer Softwareversion schnell zu modellieren und zu konfigurieren und die Schritte zu automatisieren, die für die kontinuierliche Veröffentlichung von Softwareänderungen erforderlich sind.

  • AWS Glue ist ein vollständig verwalteter ETL-Service. Er hilft Ihnen dabei, Daten zuverlässig zu kategorisieren, zu bereinigen, anzureichern und zwischen Datenspeichern und Datenströmen zu verschieben.

Andere Tools

  • Python ist eine interpretierte Mehrzweck-Programmiersprache auf hohem Niveau.

  • Moto ist eine Python-Bibliothek zum Testen von AWS-Services.

  • Pytest ist ein Framework zum Schreiben kleiner Komponententests, die skaliert werden können, um komplexe Funktionstests für Anwendungen und Bibliotheken zu unterstützen.

  • Die Python-ETL-Bibliothek für AWS Glue ist ein Repository für Python-Bibliotheken, die bei der lokalen Entwicklung von PySpark Batch-Jobs für AWS Glue verwendet werden.

Code

Der Code für dieses Muster ist im Repository GitHub aws-glue-jobs-unit-testing verfügbar. Das Repository umfasst die folgenden Ressourcen:

  • Ein Beispiel für einen Python-basierten AWS Glue Glue-Job im Ordner src

  • Zugeordnete Unit-Testfälle (erstellt mit dem Pytest-Framework) im Ordner tests

  • Eine CloudFormation Vorlage (in YAML geschrieben) im Ordner deploy

Bewährte Methoden

Sicherheit für Ressourcen CodePipeline

Es hat sich bewährt, Verschlüsselung und Authentifizierung für die Quell-Repositorys zu verwenden, die eine Verbindung zu Ihren Pipelines herstellen. CodePipeline Weitere Informationen finden Sie in der Dokumentation unter Bewährte Sicherheitsmethoden. CodePipeline

CodePipeline Ressourcen überwachen und protokollieren

Es hat sich bewährt, mithilfe der AWS-Protokollierungsfunktionen zu ermitteln, welche Aktionen Benutzer in Ihrem Konto ausführen und welche Ressourcen sie verwenden. Die Protokolldateien zeigen Folgendes:

  • Uhrzeit und Datum der Aktionen

  • Quell-IP-Adresse der Aktionen

  • Welche Aktionen sind aufgrund unzureichender Berechtigungen fehlgeschlagen

Protokollierungsfunktionen sind in AWS CloudTrail und Amazon CloudWatch Events verfügbar. Sie können CloudTrail damit AWS-API-Aufrufe und zugehörige Ereignisse protokollieren, die von oder im Namen Ihres AWS-Kontos getätigt wurden. Weitere Informationen finden Sie CloudTrail in der CodePipeline Dokumentation unter Protokollieren von CodePipeline API-Aufrufen mit AWS.

Sie können CloudWatch Events verwenden, um Ihre AWS-Cloud-Ressourcen und -Anwendungen zu überwachen, die auf AWS ausgeführt werden. Sie können auch Benachrichtigungen in CloudWatch Events erstellen. Weitere Informationen finden Sie in der CodePipeline Dokumentation unter CodePipeline Ereignisse überwachen.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Bereiten Sie das Codearchiv für die Bereitstellung vor.

  1. Laden Sie es code.zip aus dem GitHub aws-glue-jobs-unit-testing Repository herunter, oder erstellen Sie die .zip-Datei selbst mit einem Befehlszeilentool. Sie können die ZIP-Datei beispielsweise unter Linux oder Mac erstellen, indem Sie die folgenden Befehle im Terminal ausführen:

    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. Melden Sie sich bei der AWS-Managementkonsole an und wählen Sie die AWS-Region Ihrer Wahl aus.

  3. Erstellen Sie einen S3-Bucket und laden Sie dann das .zip-Paket und die code.zip Datei (zuvor heruntergeladen) in den von Ihnen erstellten S3-Bucket hoch.

DevOps Ingenieur

Erstellen Sie den CloudFormation Stapel.

  1. Melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie dann die CloudFormation Konsole.

  2. Wählen Sie Stack erstellen und anschließend Mit vorhandenen Ressourcen (Ressourcen importieren).

  3. Wählen Sie auf der Seite „Stack erstellen“ im Abschnitt „Vorlage angeben“ die Option „Eine Vorlagendatei hochladen“ und dann die Vorlage „pipeline.yml“ (aus dem Repository heruntergeladen) aus. GitHub Wählen Sie anschließend Weiter.

  4. Geben Sie als Stack-Name glue-unit-testing-pipeline ein, oder wählen Sie einen Stack-Namen Ihrer Wahl.

  5. Verwenden Sie als ApplicationStackName den vorausgefüllten Namen glue-codepipeline-app. Dies ist der Name des CloudFormation Stacks, der von der Pipeline erstellt wird.

  6. Verwenden Sie für BranchNameden vorab ausgefüllten Masternamen. Dies ist der Name des Branches, der im CodeCommit Repository erstellt wurde, um den Code aus der .zip-Datei für den S3-Bucket einzuchecken.

  7. Verwenden Sie für den BucketNamebereits ausgefüllten Bucket-Namen aws-glue-artifacts-us-east-1. Dies ist der Name des S3-Buckets, der die ZIP-Datei enthält und von der Pipeline zum Speichern von Codeartefakten verwendet wird.

  8. Verwenden Sie für CodeZipFile den vorab ausgefüllten Wert code.zip. Dies ist der Schlüsselname des S3-Beispielcodeobjekts. Das Objekt sollte eine ZIP-Datei sein.

  9. Verwenden Sie für den RepositoryNamebereits ausgefüllten Namen aws-glue-unit-testing. Dies ist der Name des CodeCommit Repositorys, das vom Stack erstellt wurde.

  10. Verwenden Sie für TestReportGroupNameden vorausgefüllten Namen glue-unittest-report. Dies ist der Name der CodeBuild Testberichtsgruppe, die zum Speichern der Unit-Testberichte erstellt wurde.

  11. Wählen Sie Weiter und klicken Sie dann auf der Seite Stack-Optionen konfigurieren erneut auf Weiter.

  12. Wählen Sie auf der Seite Überprüfen unter Funktionen die Option Ich bestätige, dass CloudFormation möglicherweise IAM-Ressourcen mit benutzerdefinierten Namen erstellt werden.

  13. Wählen Sie Absenden aus. Nachdem die Erstellung des Stacks abgeschlossen ist, können Sie die erstellten Ressourcen auf der Registerkarte Ressourcen sehen. Die Erstellung des Stacks dauert ungefähr 5-7 Minuten.

Der Stack erstellt automatisch ein CodeCommit Repository mit dem ursprünglichen Code, der aus der ZIP-Datei eingecheckt und in den S3-Bucket hochgeladen wurde. Darüber hinaus erstellt der Stack eine CodePipeline Ansicht, die das CodeCommit Repository als Quelle verwendet. In den obigen Schritten heißt das CodeCommit Repository aws-glue-unit-test und die Pipeline aws-glue-unit-test-pipeline.

AWS DevOps, DevOps Ingenieur

Bereinigen Sie die Ressourcen in Ihrer Umgebung.

Um zusätzliche Infrastrukturkosten zu vermeiden, stellen Sie sicher, dass Sie den Stack löschen, nachdem Sie mit den Beispielen in diesem Muster experimentiert haben.

  1. Öffnen Sie die CloudFormation Konsole und wählen Sie dann den Stack aus, den Sie erstellt haben.

  2. Wählen Sie Löschen aus. Dadurch werden alle Ressourcen gelöscht, die Ihr Stack erstellt hat, einschließlich CodeCommit Repositorys, AWS Identity and Access Management (IAM) -Rollen oder -Richtlinien und Projekte. CodeBuild

AWS DevOps, DevOps Ingenieur
AufgabeBeschreibungErforderliche Fähigkeiten

Führen Sie die in der Pipeline befindlichen Komponententests aus.

  1. Um die bereitgestellte Pipeline zu testen, melden Sie sich bei der AWS-Managementkonsole an und öffnen Sie dann die CodePipeline Konsole.

  2. Wählen Sie die Pipeline aus, die durch den CloudFormation Stack erstellt wurde, und wählen Sie dann Release change aus. Die Pipeline wird gestartet (unter Verwendung des neuesten Codes im CodeCommit Repository).

  3. Nachdem die Test_and_Build-Phase abgeschlossen ist, wählen Sie die Registerkarte Details und überprüfen Sie dann die Protokolle.

  4. Wählen Sie die Registerkarte Berichte und dann unter Berichtsverlauf den Testbericht aus, um die Ergebnisse der Komponententests anzuzeigen.

  5. Führen Sie nach Abschluss der Bereitstellungsphase den bereitgestellten AWS Glue-Job auf der AWS Glue-Konsole aus und überwachen Sie ihn. Weitere Informationen finden Sie unter Überwachung von AWS Glue in der AWS Glue Glue-Dokumentation.

AWS DevOps, DevOps Ingenieur

Fehlerbehebung

ProblemLösung

Eine Pipeline mit Amazon S3, Amazon ECR oder CodeCommit Quelle wird nicht mehr automatisch gestartet

Wenn Sie Konfigurationseinstellungen für eine Aktion ändern, die Ereignisregeln in Amazon EventBridge oder CloudWatch Ereignisse zur Änderungserkennung verwendet, erkennt die AWS-Managementkonsole möglicherweise keine Änderung, wenn Quellkennungen ähnlich sind und identische Anfangszeichen haben. Da die neue Ereignisregel nicht von der Konsole erstellt wird, wird die Pipeline nicht mehr automatisch gestartet.

Das Ändern eines CodeCommit Zweignamens von MyTestBranch-1 zu MyTestBranch-2 ist beispielsweise eine geringfügige Änderung. Da sich die Änderung am Ende des Zweignamens befindet, aktualisiert oder erstellt die Ereignisregel für die Quellaktion möglicherweise keine Regel für die neuen Quelleinstellungen.

Dies gilt für die folgenden Quellaktionen, bei denen Ereignisse in CloudWatch Ereignissen zur Erkennung von Änderungen verwendet werden:

  • Der S3-Bucket-Name und das S3-Objekt, die Schlüsselparameter oder Konsolen-IDs, wenn sich die Quellaktion in Amazon S3 befindet

  • Der Repository-Name und die Image-Tag-Parameter oder Konsolen-IDs, wenn sich die Quellaktion in Amazon ECR befindet

  • Der Repository-Name und der Branch-Name oder die Konsolen-Identifikatoren, wenn die Quell-Aktion aktiviert ist CodeCommit

Gehen Sie wie folgt vor, um das Problem zu beheben:

  • Ändern Sie die Konfigurationseinstellungen in Amazon S3, Amazon ECR oder CodeCommit, sodass Änderungen am Startteil des Parameterwerts vorgenommen werden. Ändern Sie beispielsweise Ihren Filialnamen von release-branch zu2nd-release-branch. Vermeiden Sie eine Änderung am Ende des Namens, z. release-branch-2 B.

  • Ändern Sie die Konfigurationseinstellungen in Amazon S3, Amazon ECR oder CodeCommit für jede Pipeline. Ändern Sie beispielsweise Ihren Filialnamen von myRepo/myBranch zumyDeployRepo/myDeployBranch. Vermeiden Sie eine Änderung am Ende des Namens, z. myRepo/myBranch2 B.

  • Anstatt die AWS-Managementkonsole zu verwenden, verwenden Sie die AWS-Befehlszeilenschnittstelle (AWS CLI) oder AWS, CloudFormation um Ihre Regeln für Ereignisse zur Änderungserkennung zu erstellen und zu aktualisieren. Anweisungen zum Erstellen von Ereignisregeln für eine Amazon S3 S3-Quellaktion finden Sie unter Amazon S3 S3-Quellaktionen und CloudWatch Ereignisse. Anweisungen zum Erstellen von Ereignisregeln für eine Amazon ECR-Aktion finden Sie unter Amazon ECR-Quellaktionen und CloudWatch Ereignisse. Anweisungen zum Erstellen von Ereignisregeln für eine CodeCommit Aktion finden Sie unter CodeCommit Quellaktionen und CloudWatch Ereignisse. Nachdem Sie Ihre Aktionskonfiguration in der Konsole bearbeitet haben, akzeptieren Sie die aktualisierten Ressourcen zur Änderungserkennung, die von der Konsole erstellt wurden.

Zugehörige Ressourcen

Zusätzliche Informationen

Darüber hinaus können Sie die CloudFormation AWS-Vorlagen mithilfe der AWS-CLI bereitstellen. Weitere Informationen finden Sie in der CloudFormation Dokumentation unter Schnelles Bereitstellen von Vorlagen mit Transformationen.