

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Converti i file mainframe dal formato EBCDIC al formato ASCII delimitato da caratteri in Amazon S3 utilizzando AWS Lambda
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda"></a>

*Luis Gustavo Dantas, Amazon Web Services*

## Riepilogo
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-summary"></a>

Questo modello mostra come avviare una AWS Lambda funzione che converte automaticamente i file EBCDIC (Extended Binary Coded Decimal Interchange Code) del mainframe in file ASCII (American Standard Code for Information Interchange) delimitati da caratteri. La funzione Lambda viene eseguita dopo il caricamento dei file ASCII in un bucket Amazon Simple Storage Service (Amazon S3). Dopo la conversione dei file, puoi leggere i file ASCII su carichi di lavoro basati su x86 o caricare i file in database moderni.

L'approccio alla conversione dei file illustrato in questo modello può aiutarvi a superare le sfide legate all'utilizzo dei file EBCDIC in ambienti moderni. I file codificati in EBCDIC contengono spesso dati rappresentati in formato binario o decimale compresso e i campi sono a lunghezza fissa. Queste caratteristiche creano ostacoli perché i carichi di lavoro o gli ambienti distribuiti moderni basati su x86 generalmente funzionano con dati con codifica ASCII e non sono in grado di elaborare file EBCDIC.

## Prerequisiti e limitazioni
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-prereqs"></a>

**Prerequisiti**
+ Un attivo Account AWS
+ Un bucket Amazon S3
+ Un utente AWS Identity and Access Management (IAM) con autorizzazioni amministrative
+ AWS CloudShell
+ [Python 3.8.0](https://www.python.org/downloads/release/python-380/) o successivo
+ Un file flat codificato in EBCDIC e la struttura dati corrispondente in un quaderno COBOL (Common Business-Oriented Language)

**Nota**  
[Questo modello utilizza un file EBCDIC di esempio ([Client.EBCDIC.txt](https://github.com/aws-samples/mainframe-data-utilities/blob/main/sample-data/CLIENT.EBCDIC.txt)) e il quaderno COBOL corrispondente (COBKS05.cpy).](https://github.com/aws-samples/mainframe-data-utilities/blob/main/LegacyReference/COBKS05.cpy) Entrambi i GitHub [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)file sono disponibili nel repository.

**Limitazioni**
+ I quaderni COBOL di solito contengono più definizioni di layout. Il [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)progetto può analizzare questo tipo di quaderno ma non può dedurre quale layout prendere in considerazione per la conversione dei dati. Questo perché i quaderni non seguono questa logica (che rimane invece nei programmi COBOL). Di conseguenza, è necessario configurare manualmente le regole per la selezione dei layout dopo aver analizzato il quaderno.
+ Questo modello è soggetto alle quote [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).

## Architecture
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-architecture"></a>

**Stack tecnologico di origine**
+ IBM z/OS, IBM i e altri sistemi EBCDIC
+ File sequenziali con dati codificati in EBCDIC (come IBM Db2 unloads)
+ Quaderno COBOL

**Stack tecnologico Target**
+ Simple Storage Service (Amazon S3)
+ Notifica degli eventi di Amazon S3
+ IAM
+ funzione Lambda
+ Python 3.8 o versioni successive
+ Utilità per dati mainframe
+ Metadati JSON
+ File ASCII delimitati da caratteri

**Architettura di Target**

Il diagramma seguente mostra un'architettura per la conversione dei file EBCDIC mainframe in file ASCII.

![Architettura per la conversione dei file EBCDIC mainframe in file ASCII](http://docs.aws.amazon.com/it_it/prescriptive-guidance/latest/patterns/images/pattern-img/97ab4129-2639-4733-86cb-962d91526df4/images/3ca7ca44-373a-434f-8c40-09e7c2abf5ec.png)


Il diagramma mostra il flusso di lavoro seguente:

1. L'utente esegue lo script di analisi dei copybook, che converte il quaderno COBOL in un file JSON.

1. L'utente carica i metadati JSON in un bucket Amazon S3. Ciò rende i metadati leggibili dalla funzione Lambda di conversione dei dati.

1. L'utente o un processo automatizzato carica il file EBCDIC nel bucket Amazon S3.

1. L'evento di notifica di Amazon S3 attiva la funzione Lambda di conversione dei dati.

1. AWS verifica le autorizzazioni di lettura/scrittura del bucket Amazon S3 per la funzione Lambda.

1. Lambda legge il file dal bucket Amazon S3 e lo converte localmente da EBCDIC in ASCII.

1. Lambda registra lo stato del processo in Amazon. CloudWatch

1. Lambda riscrive il file ASCII su Amazon S3.

**Nota**  
Lo script di analisi dei copybook viene eseguito una sola volta per eseguire la conversione dei metadati in formato JSON, che viene successivamente archiviato in un bucket Amazon S3. Dopo la conversione iniziale, tutti i file EBCDIC successivi che fanno riferimento allo stesso file JSON nel bucket Amazon S3 utilizzeranno la configurazione dei metadati esistente.

## Tools (Strumenti)
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-tools"></a>

**Servizi AWS**
+ [Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) ti CloudWatch aiuta a monitorare i parametri delle tue AWS risorse e delle applicazioni su cui esegui AWS in tempo reale.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.
+ [AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)è una shell basata su browser che puoi utilizzare per gestire Servizi AWS utilizzando AWS Command Line Interface (AWS CLI) e una gamma di strumenti di sviluppo preinstallati.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) ti aiuta a gestire in modo sicuro l'accesso alle tue AWS risorse controllando chi è autenticato e autorizzato a utilizzarle.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) è un servizio di calcolo che consente di eseguire il codice senza gestire i server o effettuarne il provisioning. Lambda esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.

**Altri strumenti**
+ [GitHub](https://github.com/)è un servizio di code-hosting che fornisce strumenti di collaborazione e controllo delle versioni.
+ [Python](https://www.python.org/) è un linguaggio di programmazione di alto livello.

**Codice**

Il codice per questo pattern è disponibile nel repository. GitHub [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)

## Best practice
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-best-practices"></a>

Prendi in considerazione le seguenti best practice:
+ Imposta le autorizzazioni richieste a livello di Amazon Resource Name (ARN).
+ Concedi sempre le autorizzazioni con privilegi minimi per le policy IAM. Per ulteriori informazioni, consulta le [best practice di sicurezza in IAM nella documentazione IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html).

## Epiche
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-epics"></a>

### Crea variabili di ambiente e una cartella di lavoro
<a name="create-environment-variables-and-a-working-folder"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Creare le variabili di ambiente. | Copiate le seguenti variabili di ambiente in un editor di testo, quindi sostituite i `<placeholder>` valori dell'esempio seguente con i valori delle risorse:<pre>bucket=<your_bucket_name><br />account=<your_account_number><br />region=<your_region_code></pre>Creerai riferimenti al tuo bucket Amazon S3 e versioni successive Account AWS. Regione AWS <br />Per definire le variabili di ambiente, apri la [CloudShell console](https://console.aws.amazon.com/cloudshell/), quindi copia e incolla le variabili di ambiente aggiornate nella riga di comando.È necessario ripetere questo passaggio ogni volta che la CloudShell sessione viene riavviata. | Informazioni generali su AWS | 
| Crea una cartella di lavoro. | Per semplificare il processo di pulizia delle risorse in un secondo momento, crea una cartella di lavoro CloudShell eseguendo il seguente comando:<pre>mkdir workdir; cd workdir</pre>È necessario modificare la directory nella directory di lavoro (`workdir`) ogni volta che si perde la connessione alla CloudShell sessione. | Informazioni generali su AWS | 

### Definisci un ruolo e una policy IAM
<a name="define-an-iam-role-and-policy"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea una politica di fiducia per la funzione Lambda. | Il convertitore EBCDIC funziona con una funzione Lambda. La funzione deve avere un ruolo IAM. Prima di creare il ruolo IAM, è necessario definire un documento sulla politica di fiducia che consenta alle risorse di assumere tale politica.<br />Dalla cartella CloudShell di lavoro, crea un documento di policy eseguendo il seguente comando:<pre>E2ATrustPol=$(cat <<EOF<br />{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                "Service": "lambda.amazonaws.com"<br />            },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]<br />}<br />EOF<br />)<br />printf "$E2ATrustPol" > E2ATrustPol.json</pre> | Informazioni generali su AWS | 
| Crea il ruolo IAM per la conversione Lambda. | Per creare un ruolo IAM, esegui il seguente AWS CLI comando dalla cartella di CloudShell lavoro:<pre>aws iam create-role --role-name E2AConvLambdaRole --assume-role-policy-document file://E2ATrustPol.json</pre> | Informazioni generali su AWS | 
| Crea il documento di policy IAM per la funzione Lambda. | La funzione Lambda deve disporre dell'accesso in lettura/scrittura al bucket Amazon S3 e delle autorizzazioni di scrittura per Amazon Logs. CloudWatch <br />Per creare una policy IAM, esegui il seguente comando dalla cartella di lavoro: CloudShell <pre>E2APolicy=$(cat <<EOF<br />{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Sid": "Logs",<br />            "Effect": "Allow",<br />            "Action": [<br />                "logs:PutLogEvents",<br />                "logs:CreateLogStream",<br />                "logs:CreateLogGroup"<br />            ],<br />            "Resource": [<br />                "arn:aws:logs:*:*:log-group:*",<br />                "arn:aws:logs:*:*:log-group:*:log-stream:*"<br />            ]<br />        },<br />        {<br />            "Sid": "S3",<br />            "Effect": "Allow",<br />            "Action": [<br />                "s3:GetObject",<br />                "s3:PutObject",<br />                "s3:GetObjectVersion"<br />            ],<br />            "Resource": [<br />                "arn:aws:s3:::%s/*",<br />                "arn:aws:s3:::%s"<br />            ]<br />        }<br />    ]<br />}<br />EOF<br />)<br />printf "$E2APolicy" "$bucket" "$bucket" > E2AConvLambdaPolicy.json</pre> | Informazioni generali su AWS | 
| Allega il documento relativo alla policy IAM al ruolo IAM. | Per allegare la policy IAM al ruolo IAM, inserisci il seguente comando dalla tua cartella di CloudShell lavoro:<pre>aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json</pre> | Informazioni generali su AWS | 

### Crea la funzione Lambda per la conversione EBCDIC
<a name="create-the-lam-function-for-ebcdic-conversion"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Scarica il codice sorgente della conversione EBCDIC. | Dalla cartella CloudShell di lavoro, esegui il seguente comando per scaricare il codice mainframe-data-utilities sorgente da: GitHub<pre>git clone https://github.com/aws-samples/mainframe-data-utilities.git mdu</pre> | Informazioni generali su AWS | 
| Crea il pacchetto ZIP. | Dalla cartella di CloudShell lavoro, immettete il seguente comando per creare il pacchetto ZIP che crea la funzione Lambda per la conversione EBCDIC:<pre>cd mdu; zip ../mdu.zip *.py; cd ..</pre> | Informazioni generali su AWS | 
| Creazione della funzione Lambda | Dalla cartella di CloudShell lavoro, immettete il seguente comando per creare la funzione Lambda per la conversione EBCDIC:<pre>aws lambda create-function \<br />--function-name E2A \<br />--runtime python3.9 \<br />--zip-file fileb://mdu.zip \<br />--handler extract_ebcdic_to_ascii.lambda_handler \<br />--role arn:aws:iam::$account:role/E2AConvLambdaRole \<br />--timeout 10 \<br />--environment "Variables={layout=$bucket/layout/}"</pre> Il layout della variabile di ambiente indica alla funzione Lambda dove risiedono i metadati JSON. | Informazioni generali su AWS | 
| Crea la politica basata sulle risorse per la funzione Lambda. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per consentire alla notifica degli eventi di Amazon S3 di attivare la funzione Lambda per la conversione EBCDIC:<pre>aws lambda add-permission \<br />--function-name E2A \<br />--action lambda:InvokeFunction \<br />--principal s3.amazonaws.com \<br />--source-arn arn:aws:s3:::$bucket \<br />--source-account $account \<br />--statement-id 1</pre> | Informazioni generali su AWS | 

### Crea la notifica degli eventi di Amazon S3
<a name="create-the-s3-event-notification"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Crea il documento di configurazione per la notifica degli eventi di Amazon S3. | La notifica degli eventi di Amazon S3 avvia la funzione Lambda di conversione EBCDIC quando i file vengono inseriti nella cartella di input.<br />Dalla cartella di CloudShell lavoro, esegui il seguente comando per creare il documento JSON per la notifica degli eventi di Amazon S3:<pre>S3E2AEvent=$(cat <<EOF<br />{<br />"LambdaFunctionConfigurations": [<br />    {<br />      "Id": "E2A",<br />      "LambdaFunctionArn": "arn:aws:lambda:%s:%s:function:E2A",<br />      "Events": [ "s3:ObjectCreated:Put" ],<br />      "Filter": {<br />        "Key": {<br />          "FilterRules": [<br />            {<br />              "Name": "prefix",<br />              "Value": "input/"<br />            }<br />          ]<br />        }<br />      }<br />    }<br />  ]<br />}<br />EOF<br />)<br />printf "$S3E2AEvent" "$region" "$account" > S3E2AEvent.json</pre> | Informazioni generali su AWS | 
| Crea la notifica degli eventi di Amazon S3. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per creare la notifica degli eventi di Amazon S3:<pre>aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json</pre> | Informazioni generali su AWS | 

### Crea e carica i metadati JSON
<a name="create-and-upload-the-json-metadata"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Analizza il quaderno COBOL. | Dalla cartella di CloudShell lavoro, immettete il seguente comando per analizzare un quaderno COBOL di esempio in un file JSON (che definisce come leggere e suddividere correttamente il file di dati):<pre>python3       mdu/parse_copybook_to_json.py \<br />-copybook     mdu/LegacyReference/COBKS05.cpy \<br />-output       CLIENT.json \<br />-output-s3key CLIENT.ASCII.txt \<br />-output-s3bkt $bucket \<br />-output-type  s3 \<br />-print        25</pre> | Informazioni generali su AWS | 
| Aggiungi la regola di trasformazione. | Il file di dati di esempio e il corrispondente quaderno COBOL sono un file a più layout. Ciò significa che la conversione deve suddividere i dati in base a determinate regole. In questo caso, i byte nelle posizioni 3 e 4 in ogni riga definiscono il layout.<br />Dalla cartella CloudShell di lavoro, modificate il `CLIENT.json` file e modificate il contenuto nel `"transf-rule": [],` modo seguente:<pre>"transf-rule": [<br />{<br />"offset": 4,<br />"size": 2,<br />"hex": "0002",<br />"transf": "transf1"<br />},<br />{<br />"offset": 4,<br />"size": 2,<br />"hex": "0000",<br />"transf": "transf2"<br />}<br />],</pre> | Informazioni generali su AWS, mainframe IBM, Cobol | 
| Carica i metadati JSON nel bucket Amazon S3. | Dalla cartella di CloudShell lavoro, inserisci il seguente AWS CLI comando per caricare i metadati JSON nel tuo bucket Amazon S3:<pre>aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json</pre> | Informazioni generali su AWS | 

### Convertire il file EBCDIC
<a name="convert-the-ebcdic-file"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| Invia il file EBCDIC al bucket Amazon S3. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per inviare il file EBCDIC al bucket Amazon S3:<pre>aws s3 cp mdu/sample-data/CLIENT.EBCDIC.txt s3://$bucket/input/</pre> Ti consigliamo di impostare cartelle diverse per i file di input (EBCDIC) e di output (ASCII) per evitare di richiamare nuovamente la funzione di conversione Lambda quando il file ASCII viene caricato nel bucket Amazon S3. | Informazioni generali su AWS | 
| Controlla l'output. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per verificare se il file ASCII è generato nel tuo bucket Amazon S3:<pre>aws s3 ls s3://$bucket/</pre> La conversione dei dati può richiedere diversi secondi. Ti consigliamo di verificare la presenza del file ASCII alcune volte.<br />Una volta che il file ASCII è disponibile, inserisci il seguente comando per visualizzare il contenuto del file convertito nel bucket Amazon S3. Se necessario, puoi scaricarlo o utilizzarlo direttamente dal bucket Amazon S3:<pre>aws s3 cp s3://$bucket/CLIENT.ASCII.txt - | head</pre><br />Controlla il contenuto del file ASCII:<pre>0|0|220|<br />1|1|HERBERT MOHAMED|1958-08-31|BACHELOR|0010000.00|<br />1|2|36|THE ROE AVENUE|<br />2|1|JAYLEN GEORGE|1969-05-29|ELEMENTARY|0020000.00|<br />2|2|365|HEATHFIELD ESPLANADE|<br />3|1|MIKAEEL WEBER|1982-02-17|MASTER|0030000.00|<br />3|2|4555|MORRISON STRAND|<br />4|1|APRIL BARRERA|1967-01-12|DOCTOR|0030000.00|<br />4|2|1311|MARMION PARK|<br />5|1|ALEEZA PLANT|1985-03-01|BACHELOR|0008000.00|</pre> | Informazioni generali su AWS | 

### Pulisci l'ambiente
<a name="clean-the-environment"></a>


| Operazione | Description | Competenze richieste | 
| --- | --- | --- | 
| (Facoltativo) Prepara le variabili e la cartella. | Se perdete la connessione con CloudShell, riconnettetevi e immettete il seguente comando per spostare la directory nella cartella di lavoro:<pre>cd workdir</pre><br />Assicuratevi che le variabili di ambiente siano definite:<pre>bucket=<your_bucket_name><br />account=<your_account_number><br />region=<your_region_code></pre> | Informazioni generali su AWS | 
| Rimuovi la configurazione di notifica per il bucket. | Dalla cartella di CloudShell lavoro, esegui il seguente comando per rimuovere la configurazione di notifica degli eventi di Amazon S3:<pre>aws s3api put-bucket-notification-configuration \<br />--bucket=$bucket \<br />--notification-configuration="{}"</pre> | Informazioni generali su AWS | 
| Elimina la funzione Lambda. | Dalla cartella di CloudShell lavoro, immettete il seguente comando per eliminare la funzione Lambda per il convertitore EBCDIC:<pre>aws lambda delete-function \<br />--function-name E2A</pre> | Informazioni generali su AWS | 
| Elimina il ruolo e la policy IAM. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per rimuovere il ruolo e la politica del convertitore EBCDIC:<pre>aws iam delete-role-policy \<br />--role-name E2AConvLambdaRole \<br />--policy-name E2AConvLambdaPolicy<br /><br />aws iam delete-role \<br />--role-name E2AConvLambdaRole</pre> | Informazioni generali su AWS | 
| Elimina i file generati nel bucket Amazon S3. | Dalla cartella di CloudShell lavoro, inserisci il seguente comando per eliminare i file generati nel bucket Amazon S3:<pre>aws s3 rm s3://$bucket/layout --recursive<br />aws s3 rm s3://$bucket/input --recursive<br />aws s3 rm s3://$bucket/CLIENT.ASCII.txt</pre> | Informazioni generali su AWS | 
| Elimina la cartella di lavoro. | Dalla cartella di CloudShell lavoro, immettete il seguente comando per `workdir` rimuoverne il contenuto:<pre>cd ..; rm -Rf workdir</pre> | Informazioni generali su AWS | 

## Risorse correlate
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-resources"></a>
+ [Utilità per dati mainframe README](https://github.com/aws-samples/mainframe-data-utilities/blob/main/README.md) () GitHub
+ [Il set di caratteri EBCDIC (documentazione IBM](https://www.ibm.com/docs/en/zos-basic-skills?topic=mainframe-ebcdic-character-set))
+ [Da EBCDIC](https://www.ibm.com/docs/en/iis/11.7.0?topic=tables-ebcdic-ascii) ad ASCII (documentazione IBM)
+ [COBOL](https://www.ibm.com/docs/en/i/7.6.0?topic=languages-cobol) (documentazione IBM)
+ [Utilizzo di un trigger Amazon S3 per richiamare una funzione Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html) (documentazione)AWS Lambda 