Konvertieren Sie Mainframe-Dateien vom EBCDIC-Format in das durch Zeichen getrennte ASCII-Format in Amazon S3 mit AWS Lambda - 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.

Konvertieren Sie Mainframe-Dateien vom EBCDIC-Format in das durch Zeichen getrennte ASCII-Format in Amazon S3 mit AWS Lambda

Luis Gustavo Dantas, Amazon Web Services

Übersicht

Dieses Muster zeigt Ihnen, wie Sie eine AWS Lambda Funktion starten, die EBCDIC-Dateien (Extended Binary Coded Decimal Interchange Code) für Mainframes automatisch in durch Zeichen getrennte ASCII-Dateien (American Standard Code for Information Interchange) konvertiert. Die Lambda-Funktion wird ausgeführt, nachdem die ASCII-Dateien in einen Amazon Simple Storage Service (Amazon S3) -Bucket hochgeladen wurden. Nach der Dateikonvertierung können Sie die ASCII-Dateien auf x86-basierten Workloads lesen oder die Dateien in moderne Datenbanken laden.

Der in diesem Muster vorgestellte Ansatz zur Dateikonvertierung kann Ihnen helfen, die Herausforderungen bei der Arbeit mit EBCDIC-Dateien in modernen Umgebungen zu bewältigen. In EBCDIC kodierte Dateien enthalten häufig Daten, die in einem binären oder komprimierten Dezimalformat dargestellt werden, und Felder haben eine feste Länge. Diese Eigenschaften stellen Hindernisse dar, da moderne x86-basierte Workloads oder verteilte Umgebungen im Allgemeinen mit ASCII-kodierten Daten arbeiten und EBCDIC-Dateien nicht verarbeiten können.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktiver AWS-Konto

  • Ein Amazon-S3-Bucket

  • Ein AWS Identity and Access Management (IAM-) Benutzer mit Administratorrechten

  • AWS CloudShell

  • Python 3.8.0 oder höher

  • Eine in EBCDIC kodierte Flatfile und die dazugehörige Datenstruktur in einem COBOL-Copybook (Common Business Oriented Language)

Anmerkung

Dieses Muster verwendet eine EBCDIC-Beispieldatei (Client.EBCDIC.txt) und das entsprechende COBOL-Copybook (COBKS05.cpy). Beide GitHub mainframe-data-utilitiesDateien sind im Repository verfügbar.

Einschränkungen

  • COBOL-Copybooks enthalten normalerweise mehrere Layoutdefinitionen. Das mainframe-data-utilitiesProjekt kann diese Art von Copybook analysieren, kann aber nicht ableiten, welches Layout bei der Datenkonvertierung berücksichtigt werden soll. Das liegt daran, dass Copybooks diese Logik nicht verwenden (die stattdessen bei COBOL-Programmen verbleibt). Folglich müssen Sie die Regeln für die Auswahl von Layouts manuell konfigurieren, nachdem Sie das Copybook analysiert haben.

  • Dieses Muster unterliegt Lambda-Quoten.

Architektur

Quelltechnologie-Stack

  • IBM z/OS, IBM i und andere EBCDIC-Systeme

  • Sequentielle Dateien mit in EBCDIC codierten Daten (z. B. IBM Db2-Entladungen)

  • COBOL-Copybook

Zieltechnologie-Stack

  • Amazon S3

  • Amazon S3 S3-Ereignisbenachrichtigung

  • IAM

  • Lambda-Funktion

  • Python 3.8 oder höher

  • Mainframe-Datendienstprogramme

  • JSON-Metadaten

  • ASCII-Dateien, die durch Zeichen getrennt sind

Zielarchitektur

Das folgende Diagramm zeigt eine Architektur für die Konvertierung von Mainframe-EBCDIC-Dateien in ASCII-Dateien.

Architektur für die Konvertierung von Mainframe-EBCDIC-Dateien in ASCII-Dateien

Das Diagramm zeigt den folgenden Workflow:

  1. Der Benutzer führt das Copybook-Parser-Skript aus, das das COBOL-Copybook in eine JSON-Datei konvertiert.

  2. Der Benutzer lädt die JSON-Metadaten in einen Amazon S3 S3-Bucket hoch. Dadurch werden die Metadaten von der Lambda-Funktion zur Datenkonvertierung lesbar.

  3. Der Benutzer oder ein automatisierter Prozess lädt die EBCDIC-Datei in den Amazon S3 S3-Bucket hoch.

  4. Das Amazon S3 S3-Benachrichtigungsereignis löst die Lambda-Funktion zur Datenkonvertierung aus.

  5. AWS überprüft die Lese- und Schreibberechtigungen des Amazon S3 S3-Buckets für die Lambda-Funktion.

  6. Lambda liest die Datei aus dem Amazon S3 S3-Bucket und konvertiert die Datei lokal von EBCDIC nach ASCII.

  7. Lambda protokolliert den Prozessstatus in Amazon CloudWatch.

  8. Lambda schreibt die ASCII-Datei zurück nach Amazon S3.

Anmerkung

Das Copybook-Parser-Skript wird einmal ausgeführt, um die Konvertierung der Metadaten in das JSON-Format durchzuführen, das anschließend in einem Amazon S3 S3-Bucket gespeichert wird. Nach der ersten Konvertierung verwenden alle nachfolgenden EBCDIC-Dateien, die auf dieselbe JSON-Datei im Amazon S3 S3-Bucket verweisen, die bestehende Metadatenkonfiguration.

Tools

AWS-Services

  • Amazon CloudWatch hilft Ihnen dabei, die Kennzahlen Ihrer AWS Ressourcen und der Anwendungen, auf denen Sie laufen, AWS in Echtzeit zu überwachen.

  • Amazon Simple Storage Service (Amazon S3) ist ein cloudbasierter Objektspeicherservice, der Sie beim Speichern, Schützen und Abrufen beliebiger Datenmengen unterstützt.

  • AWS CloudShellist eine browserbasierte Shell, die Sie zur Verwaltung mithilfe AWS-Services von AWS Command Line Interface (AWS CLI) und einer Reihe vorinstallierter Entwicklungstools verwenden können.

  • AWS Identity and Access Management (IAM) hilft Ihnen dabei, den Zugriff auf Ihre AWS Ressourcen sicher zu verwalten, indem kontrolliert wird, wer authentifiziert und autorisiert ist, diese zu verwenden.

  • AWS Lambda ist ein Datenverarbeitungsservice, mit dem Sie Code ausführen können, ohne dass Sie Server bereitstellen oder verwalten müssen. Lambda führt Ihren Code nur bei Bedarf aus und skaliert automatisch, sodass Sie nur für die tatsächlich genutzte Rechenzeit zahlen.

Andere Tools

  • GitHubist ein Code-Hosting-Dienst, der Tools für die Zusammenarbeit und Versionskontrolle bereitstellt.

  • Python ist eine Programmiersprache auf hohem Niveau.

Code

Der Code für dieses Muster ist im GitHub mainframe-data-utilitiesRepository verfügbar.

Bewährte Methoden

Beachten Sie die folgenden bewährten Methoden:

  • Legen Sie die erforderlichen Berechtigungen auf der Ebene des Amazon-Ressourcennamens (ARN) fest.

  • Gewähren Sie immer Berechtigungen mit den geringsten Rechten für IAM-Richtlinien. Weitere Informationen finden Sie in der IAM-Dokumentation unter Bewährte Sicherheitsmethoden in IAM.

Epen

AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie die Umgebungsvariablen.

Kopieren Sie die folgenden Umgebungsvariablen in einen Texteditor und ersetzen Sie dann die <placeholder> Werte im folgenden Beispiel durch Ihre Ressourcenwerte:

bucket=<your_bucket_name> account=<your_account_number> region=<your_region_code>
Anmerkung

Sie erstellen Verweise auf Ihren Amazon S3 S3-Bucket und AWS-Region später. AWS-Konto

Um Umgebungsvariablen zu definieren, öffnen Sie die CloudShell Konsole und kopieren Sie dann Ihre aktualisierten Umgebungsvariablen und fügen Sie sie in die Befehlszeile ein.

Anmerkung

Sie müssen diesen Schritt bei jedem Neustart der CloudShell Sitzung wiederholen.

Allgemeines AWS

Erstellen Sie einen Arbeitsordner.

Um die spätere Bereinigung von Ressourcen zu vereinfachen, erstellen Sie einen Arbeitsordner in, CloudShell indem Sie den folgenden Befehl ausführen:

mkdir workdir; cd workdir
Anmerkung

Sie müssen jedes Mal, wenn Sie die Verbindung zu Ihrer CloudShell Sitzung verlieren, das Verzeichnis in das Arbeitsverzeichnis (workdir) ändern.

Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie eine Vertrauensrichtlinie für die Lambda-Funktion.

Der EBCDIC-Konverter läuft in einer Lambda-Funktion. Die Funktion muss eine IAM-Rolle haben. Bevor Sie die IAM-Rolle erstellen, müssen Sie ein Dokument mit einer Vertrauensrichtlinie definieren, das es Ressourcen ermöglicht, diese Richtlinie zu übernehmen.

Erstellen Sie im CloudShell Arbeitsordner ein Richtliniendokument, indem Sie den folgenden Befehl ausführen:

E2ATrustPol=$(cat <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF ) printf "$E2ATrustPol" > E2ATrustPol.json
Allgemeines AWS

Erstellen Sie die IAM-Rolle für die Lambda-Konvertierung.

Um eine IAM-Rolle zu erstellen, führen Sie den folgenden AWS CLI Befehl im CloudShell Arbeitsordner aus:

aws iam create-role --role-name E2AConvLambdaRole --assume-role-policy-document file://E2ATrustPol.json
Allgemeines AWS

Erstellen Sie das IAM-Richtliniendokument für die Lambda-Funktion.

Die Lambda-Funktion muss Lese- und Schreibzugriff auf den Amazon S3 S3-Bucket und Schreibberechtigungen für Amazon Logs haben. CloudWatch

Um eine IAM-Richtlinie zu erstellen, führen Sie den folgenden Befehl im Arbeitsordner aus: CloudShell

E2APolicy=$(cat <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "Logs", "Effect": "Allow", "Action": [ "logs:PutLogEvents", "logs:CreateLogStream", "logs:CreateLogGroup" ], "Resource": [ "arn:aws:logs:*:*:log-group:*", "arn:aws:logs:*:*:log-group:*:log-stream:*" ] }, { "Sid": "S3", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:GetObjectVersion" ], "Resource": [ "arn:aws:s3:::%s/*", "arn:aws:s3:::%s" ] } ] } EOF ) printf "$E2APolicy" "$bucket" "$bucket" > E2AConvLambdaPolicy.json
Allgemeines AWS

Hängen Sie das IAM-Richtliniendokument an die IAM-Rolle an.

Um die IAM-Richtlinie an die IAM-Rolle anzuhängen, geben Sie den folgenden Befehl aus Ihrem Arbeitsordner ein: CloudShell

aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json
Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

Laden Sie den Quellcode für die EBCDIC-Konvertierung herunter.

Führen Sie im CloudShell Arbeitsordner den folgenden Befehl aus, um den mainframe-data-utilities Quellcode herunterzuladen: GitHub

git clone https://github.com/aws-samples/mainframe-data-utilities.git mdu
Allgemeines AWS

Erstellen Sie das ZIP-Paket.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um das ZIP-Paket zu erstellen, das die Lambda-Funktion für die EBCDIC-Konvertierung erstellt:

cd mdu; zip ../mdu.zip *.py; cd ..
Allgemeines AWS

So erstellen Sie die Lambda-Funktion:

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die Lambda-Funktion für die EBCDIC-Konvertierung zu erstellen:

aws lambda create-function \ --function-name E2A \ --runtime python3.9 \ --zip-file fileb://mdu.zip \ --handler extract_ebcdic_to_ascii.lambda_handler \ --role arn:aws:iam::$account:role/E2AConvLambdaRole \ --timeout 10 \ --environment "Variables={layout=$bucket/layout/}"
Anmerkung

 Das Layout der Umgebungsvariablen teilt der Lambda-Funktion mit, wo sich die JSON-Metadaten befinden.

Allgemeines AWS

Erstellen Sie die ressourcenbasierte Richtlinie für die Lambda-Funktion.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, damit Ihre Amazon S3 S3-Ereignisbenachrichtigung die Lambda-Funktion für die EBCDIC-Konvertierung auslöst:

aws lambda add-permission \ --function-name E2A \ --action lambda:InvokeFunction \ --principal s3.amazonaws.com \ --source-arn arn:aws:s3:::$bucket \ --source-account $account \ --statement-id 1
Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

Erstellen Sie das Konfigurationsdokument für die Amazon S3 S3-Ereignisbenachrichtigung.

Die Amazon S3 S3-Ereignisbenachrichtigung initiiert die Lambda-Funktion für die EBCDIC-Konvertierung, wenn Dateien im Eingabeordner platziert werden.

Führen Sie im CloudShell Arbeitsordner den folgenden Befehl aus, um das JSON-Dokument für die Amazon S3 S3-Ereignisbenachrichtigung zu erstellen:

S3E2AEvent=$(cat <<EOF { "LambdaFunctionConfigurations": [ { "Id": "E2A", "LambdaFunctionArn": "arn:aws:lambda:%s:%s:function:E2A", "Events": [ "s3:ObjectCreated:Put" ], "Filter": { "Key": { "FilterRules": [ { "Name": "prefix", "Value": "input/" } ] } } } ] } EOF ) printf "$S3E2AEvent" "$region" "$account" > S3E2AEvent.json
Allgemeines AWS

Erstellen Sie die Amazon S3 S3-Ereignisbenachrichtigung.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die Amazon S3 S3-Ereignisbenachrichtigung zu erstellen:

aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json
Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

Analysieren Sie das COBOL-Copybook.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um ein COBOL-Beispiel-Copybook in eine JSON-Datei zu parsen (die definiert, wie die Datendatei richtig gelesen und aufgeteilt wird):

python3 mdu/parse_copybook_to_json.py \ -copybook mdu/LegacyReference/COBKS05.cpy \ -output CLIENT.json \ -output-s3key CLIENT.ASCII.txt \ -output-s3bkt $bucket \ -output-type s3 \ -print 25
Allgemeines AWS

Fügen Sie die Transformationsregel hinzu.

Bei der Beispieldatendatei und dem entsprechenden COBOL-Copybook handelt es sich um eine Datei mit mehreren Layouts. Das bedeutet, dass bei der Konvertierung Daten nach bestimmten Regeln aufgeteilt werden müssen. In diesem Fall definieren die Bytes an den Positionen 3 und 4 in jeder Zeile das Layout.

Bearbeiten Sie die CLIENT.json Datei im CloudShell Arbeitsordner und ändern Sie "transf-rule": [], den Inhalt wie folgt:

"transf-rule": [ { "offset": 4, "size": 2, "hex": "0002", "transf": "transf1" }, { "offset": 4, "size": 2, "hex": "0000", "transf": "transf2" } ],
Allgemein AWS, IBM Mainframe, Cobol

Laden Sie die JSON-Metadaten in den Amazon S3 S3-Bucket hoch.

Geben Sie im CloudShell Arbeitsordner den folgenden AWS CLI Befehl ein, um die JSON-Metadaten in Ihren Amazon S3 S3-Bucket hochzuladen:

aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json
Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

Senden Sie die EBCDIC-Datei an den Amazon S3 S3-Bucket.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die EBCDIC-Datei an den Amazon S3 S3-Bucket zu senden:

aws s3 cp mdu/sample-data/CLIENT.EBCDIC.txt s3://$bucket/input/
Anmerkung

 Wir empfehlen, unterschiedliche Ordner für Eingabe- (EBCDIC) und Ausgabedateien (ASCII) festzulegen, um zu vermeiden, dass die Lambda-Konvertierungsfunktion erneut aufgerufen wird, wenn die ASCII-Datei in den Amazon S3 S3-Bucket hochgeladen wird.

Allgemeines AWS

Überprüfen Sie die Ausgabe.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um zu überprüfen, ob die ASCII-Datei in Ihrem Amazon S3 S3-Bucket generiert wurde:

aws s3 ls s3://$bucket/
Anmerkung

 Die Datenkonvertierung kann mehrere Sekunden dauern. Wir empfehlen Ihnen, einige Male nach der ASCII-Datei zu suchen.

Nachdem die ASCII-Datei verfügbar ist, geben Sie den folgenden Befehl ein, um den Inhalt der konvertierten Datei im Amazon S3 S3-Bucket anzuzeigen. Bei Bedarf können Sie es herunterladen oder direkt aus dem Amazon S3 S3-Bucket verwenden:

aws s3 cp s3://$bucket/CLIENT.ASCII.txt - | head

Überprüfen Sie den Inhalt der ASCII-Datei:

0|0|220| 1|1|HERBERT MOHAMED|1958-08-31|BACHELOR|0010000.00| 1|2|36|THE ROE AVENUE| 2|1|JAYLEN GEORGE|1969-05-29|ELEMENTARY|0020000.00| 2|2|365|HEATHFIELD ESPLANADE| 3|1|MIKAEEL WEBER|1982-02-17|MASTER|0030000.00| 3|2|4555|MORRISON STRAND| 4|1|APRIL BARRERA|1967-01-12|DOCTOR|0030000.00| 4|2|1311|MARMION PARK| 5|1|ALEEZA PLANT|1985-03-01|BACHELOR|0008000.00|
Allgemeines AWS
AufgabeBeschreibungErforderliche Fähigkeiten

(Optional) Bereiten Sie die Variablen und den Ordner vor.

Wenn Sie die Verbindung mit verlieren CloudShell, stellen Sie die Verbindung erneut her und geben Sie dann den folgenden Befehl ein, um das Verzeichnis in den Arbeitsordner zu ändern:

cd workdir

Stellen Sie sicher, dass die Umgebungsvariablen definiert sind:

bucket=<your_bucket_name> account=<your_account_number> region=<your_region_code>
Allgemeines AWS

Entfernen Sie die Benachrichtigungskonfiguration für den Bucket.

Führen Sie im CloudShell Arbeitsordner den folgenden Befehl aus, um die Konfiguration der Amazon S3 S3-Ereignisbenachrichtigung zu entfernen:

aws s3api put-bucket-notification-configuration \ --bucket=$bucket \ --notification-configuration="{}"
Allgemeines AWS

Löschen Sie die Lambda-Funktion.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die Lambda-Funktion für den EBCDIC-Konverter zu löschen:

aws lambda delete-function \ --function-name E2A
Allgemeines AWS

Löschen Sie die IAM-Rolle und -Richtlinie.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die EBCDIC-Konverter-Rolle und -Richtlinie zu entfernen:

aws iam delete-role-policy \ --role-name E2AConvLambdaRole \ --policy-name E2AConvLambdaPolicy aws iam delete-role \ --role-name E2AConvLambdaRole
Allgemeines AWS

Löschen Sie die im Amazon S3 S3-Bucket generierten Dateien.

Geben Sie im CloudShell Arbeitsordner den folgenden Befehl ein, um die im Amazon S3 S3-Bucket generierten Dateien zu löschen:

aws s3 rm s3://$bucket/layout --recursive aws s3 rm s3://$bucket/input --recursive aws s3 rm s3://$bucket/CLIENT.ASCII.txt
Allgemeines AWS

Löschen Sie den Arbeitsordner.

Geben Sie aus dem CloudShell Arbeitsordner den folgenden Befehl ein, um ihn workdir und seinen Inhalt zu entfernen:

cd ..; rm -Rf workdir
Allgemeines AWS

Zugehörige Ressourcen