

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.

# Convierta archivos de mainframe del formato EBCDIC al formato ASCII delimitado por caracteres en Amazon S3 mediante 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*

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

Este patrón le muestra cómo lanzar una AWS Lambda función que convierte automáticamente los archivos EBCDIC (Extended Binary Coded Decimal Interchange Code) de mainframe en archivos del Código Estándar Estadounidense para el Intercambio de Información (ASCII) delimitados por caracteres. La función de Lambda se ejecuta después de cargar los archivos ASCII en un bucket de Amazon Simple Storage Service (Amazon S3). Tras la conversión de archivos, puede leer los archivos ASCII en cargas de trabajo basadas en x86 o cargarlos en bases de datos modernas.

El enfoque de conversión de archivos que se muestra en este patrón puede ayudarle a superar los desafíos que supone trabajar con archivos EBCDIC en entornos modernos. Los archivos codificados en EBCDIC suelen contener datos representados en formato binario o decimal empaquetado, y los campos tienen una longitud fija. Estas características crean obstáculos porque las cargas de trabajo modernas basadas en x86 o los entornos distribuidos suelen trabajar con datos codificados en ASCII y no pueden procesar archivos EBCDIC.

## Requisitos previos y limitaciones
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-prereqs"></a>

**Requisitos previos **
+ Un activo Cuenta de AWS
+ Un bucket de Amazon S3
+ Un usuario AWS Identity and Access Management (IAM) con permisos administrativos
+ AWS CloudShell
+ [Python 3.8.0](https://www.python.org/downloads/release/python-380/) o posterior
+ Archivo plano codificado en EBCDIC y su estructura de datos correspondiente en un cuaderno de texto común en un lenguaje empresarial común (COBOL)

**nota**  
Este patrón utiliza un archivo EBCDIC de muestra ([CLIENT.EBCDIC.txt](https://github.com/aws-samples/mainframe-data-utilities/blob/main/sample-data/CLIENT.EBCDIC.txt)) y su cuaderno de texto COBOL correspondiente ([COBKS05.cpy](https://github.com/aws-samples/mainframe-data-utilities/blob/main/LegacyReference/COBKS05.cpy)). Ambos archivos están disponibles en el GitHub [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)repositorio.

**Limitaciones**
+ Los cuadernos de COBOL suelen contener múltiples definiciones de diseño. El [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)proyecto puede analizar este tipo de cuaderno, pero no puede deducir qué diseño considerar en la conversión de datos. Esto se debe a que los cuadernos no tienen esta lógica (que permanece en los programas COBOL). Por lo tanto, debe configurar manualmente las reglas para seleccionar los diseños después de analizar el cuaderno.
+ Este patrón está sujeto a las cuotas de [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).

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

**Pila de tecnología de origen**
+ IBM z/OS, IBM i y otros sistemas EBCDIC
+ Archivos secuenciales con datos codificados en EBCDIC (como descargas de IBM Db2)
+ Cuaderno COBOL

**Pila de tecnología de destino**
+ Amazon S3
+ Notificaciones de eventos de Amazon S3
+ IAM
+ Función de Lambda
+ Python 3.8 o posterior
+ Utilidades de datos de unidad central
+ Metadatos JSON
+ Archivos ASCII delimitados por caracteres

**Arquitectura de destino**

El siguiente diagrama muestra una arquitectura para convertir archivos EBCDIC de mainframe en archivos ASCII.

![Arquitectura para convertir archivos EBCDIC de mainframe en archivos ASCII](http://docs.aws.amazon.com/es_es/prescriptive-guidance/latest/patterns/images/pattern-img/97ab4129-2639-4733-86cb-962d91526df4/images/3ca7ca44-373a-434f-8c40-09e7c2abf5ec.png)


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

1. El usuario ejecuta el script del analizador del cuaderno para convertir el cuaderno COBOL en un archivo JSON.

1. El usuario carga los metadatos JSON en un bucket de Amazon S3. Esto hace que los metadatos sean legibles por la función de Lambda de conversión de datos.

1. El usuario o un proceso automatizado carga el archivo EBCDIC en el bucket de Amazon S3.

1. El evento de notificación de Amazon S3 activa la función de Lambda de conversión de datos.

1. AWS verifica los permisos de lectura/escritura del bucket de Amazon S3 para la función Lambda.

1. Lambda lee el archivo del bucket de Amazon S3 y lo convierte localmente de EBCDIC a ASCII.

1. Lambda registra el estado del proceso en Amazon. CloudWatch

1. Lambda vuelve a escribir el archivo ASCII en Amazon S3.

**nota**  
El script del analizador del cuaderno se ejecuta una sola vez para realizar la conversión de metadatos al formato JSON, que posteriormente se almacena en un bucket de Amazon S3. Tras la conversión inicial, todos los archivos EBCDIC que hagan referencia al mismo archivo JSON del bucket de Amazon S3 utilizarán la configuración de metadatos existente.

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

**Servicios de AWS**
+ [Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/WhatIsCloudWatch.html) le CloudWatch ayuda a supervisar las métricas de sus AWS recursos y las aplicaciones en las que se ejecuta AWS en tiempo real.
+ [Amazon Simple Storage Service (Amazon S3)](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) es un servicio de almacenamiento de objetos basado en la nube que lo ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.
+ [AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)es un shell basado en un navegador que puede utilizar para gestionar Servicios de AWS mediante AWS Command Line Interface (AWS CLI) y una gama de herramientas de desarrollo preinstaladas.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) le ayuda a administrar de forma segura el acceso a sus AWS recursos al controlar quién está autenticado y autorizado a usarlos.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) es un servicio de computación que ayuda a ejecutar código sin necesidad de aprovisionar ni administrar servidores. Lambda ejecuta el código solo cuando es necesario y escala la capacidad de manera automática, por lo que solo pagará por el tiempo informático que utilice.

**Otras herramientas**
+ [GitHub](https://github.com/)es un servicio de alojamiento de código que proporciona herramientas de colaboración y control de versiones.
+ [Python](https://www.python.org/) es un lenguaje de programación de alto nivel.

**Código**

El código de este patrón está disponible en el GitHub [mainframe-data-utilities](https://github.com/aws-samples/mainframe-data-utilities)repositorio.

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

Tenga en cuenta las siguientes prácticas recomendadas:
+ Establezca los permisos requeridos en el nivel de nombre de recurso de Amazon (ARN).
+ Otorgue siempre permisos con privilegios mínimos para las políticas de IAM. Para obtener más información, consulte [Prácticas recomendadas de seguridad en IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) en la documentación de IAM.

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

### Cree variables de entorno y una carpeta de trabajo
<a name="create-environment-variables-and-a-working-folder"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Crear variables de entorno. | Copie las siguientes variables de entorno en un editor de texto y, a continuación, sustituya los valores `<placeholder>` del siguiente ejemplo por los valores de sus recursos:<pre>bucket=<your_bucket_name><br />account=<your_account_number><br />region=<your_region_code></pre>Creará referencias a su bucket de Amazon S3 y Región de AWS más adelante. Cuenta de AWS<br />Para definir las variables de entorno, abra la [CloudShell consola](https://console.aws.amazon.com/cloudshell/) y, a continuación, copie y pegue las variables de entorno actualizadas en la línea de comandos.Debe repetir este paso cada vez que se reinicie la CloudShell sesión. | AWS general | 
| Cree una carpeta de trabajo. | Para simplificar el proceso de limpieza de recursos más adelante, cree una carpeta de trabajo CloudShell ejecutando el siguiente comando:<pre>mkdir workdir; cd workdir</pre>Debe cambiar el directorio al directorio de trabajo (`workdir`) cada vez que pierda la conexión con la CloudShell sesión. | AWS general | 

### Definir una política y un rol de IAM
<a name="define-an-iam-role-and-policy"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree una política de confianza para la función de Lambda. | El convertidor EBCDIC se ejecuta en una función de Lambda. La función debe tener un rol de IAM. Antes de crear el rol de IAM, debe definir un documento de política de confianza que permita a los recursos asumir esa política.<br />Desde la carpeta de CloudShell trabajo, cree un documento de política ejecutando el siguiente 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> | AWS general | 
| Crear el rol de IAM para la conversión de Lambda. | Para crear un rol de IAM, ejecute el siguiente AWS CLI comando desde la carpeta de CloudShell trabajo:<pre>aws iam create-role --role-name E2AConvLambdaRole --assume-role-policy-document file://E2ATrustPol.json</pre> | AWS general | 
| Cree el documento de política de IAM para la función de Lambda. | La función Lambda debe tener acceso de lectura y escritura al bucket de Amazon S3 y permisos de escritura para Amazon Logs. CloudWatch <br />Para crear una política de IAM, ejecute el siguiente comando desde la carpeta de trabajo: 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> | AWS general | 
| Adjuntar los documentos sobre la política de IAM al rol de IAM. | Para adjuntar la política de IAM a la función de IAM, introduzca el siguiente comando desde su CloudShell carpeta de trabajo:<pre>aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json</pre> | AWS general | 

### Crear la función de Lambda para la conversión de EBCDIC
<a name="create-the-lam-function-for-ebcdic-conversion"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Descargar el código fuente de conversión a EBCDIC. | Desde la carpeta de CloudShell trabajo, ejecute el siguiente comando para descargar el código mainframe-data-utilities fuente desde la que se encuentra: GitHub<pre>git clone https://github.com/aws-samples/mainframe-data-utilities.git mdu</pre> | AWS general | 
| Crear el paquete ZIP. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para crear el paquete ZIP que crea la función Lambda para la conversión a EBCDIC:<pre>cd mdu; zip ../mdu.zip *.py; cd ..</pre> | AWS general | 
| Crear la función de Lambda. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para crear la función Lambda para la conversión a 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> El diseño de las variables de entorno indica a la función de Lambda dónde residen los metadatos de JSON. | AWS general | 
| Crear la política basada en recursos para la función de Lambda. | En la carpeta de CloudShell trabajo, introduzca el siguiente comando para permitir que la notificación de eventos de Amazon S3 active la función Lambda para la conversión a 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> | AWS general | 

### Notificaciones de eventos de Amazon S3
<a name="create-the-s3-event-notification"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Cree el documento de configuración para la notificación de eventos de Amazon S3. | La notificación de eventos de Amazon S3 inicia la función de Lambda de conversión EBCDIC cuando los archivos se colocan en la carpeta de entrada.<br />Desde la carpeta de CloudShell trabajo, ejecute el siguiente comando para crear el documento JSON para la notificación de eventos de 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> | AWS general | 
| Crear notificaciones de eventos de Amazon S3. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para crear la notificación de eventos de Amazon S3:<pre>aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json</pre> | AWS general | 

### Crear y cargar los metadatos JSON
<a name="create-and-upload-the-json-metadata"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Analizar el cuaderno de COBOL. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para convertir un cuaderno de COBOL de muestra en un archivo JSON (que define cómo leer y dividir correctamente el archivo de datos):<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> | AWS general | 
| Añada la regla de transformación. | El archivo de datos de ejemplo y su cuaderno de notas COBOL correspondiente son archivos de varios diseños. Esto significa que la conversión debe dividir los datos en función de determinadas reglas. En este caso, los bytes de las posiciones 3 y 4 de cada fila definen el diseño.<br />Desde la carpeta de CloudShell trabajo, edite el `CLIENT.json` archivo y cambie el contenido de la siguiente `"transf-rule": [],` manera:<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> | Información general sobre AWS, lade IBM y Cobol | 
| Cargue los metadatos JSON en el bucket de Amazon S3. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente AWS CLI comando para cargar los metadatos de JSON en su bucket de Amazon S3:<pre>aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json</pre> | AWS general | 

### Convertir el archivo EBCDIC
<a name="convert-the-ebcdic-file"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| Envíe el archivo EBCDIC al bucket de Amazon S3. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para enviar el archivo EBCDIC al bucket de Amazon S3:<pre>aws s3 cp mdu/sample-data/CLIENT.EBCDIC.txt s3://$bucket/input/</pre> Se recomienda configurar carpetas diferentes para los archivos de entrada (EBCDIC) y de salida (ASCII) para evitar volver a llamar a la función de conversión de Lambda cuando el archivo ASCII se cargue en el bucket de Amazon S3. | AWS general | 
| Comprobar la salida. | Desde la carpeta de CloudShell trabajo, introduce el siguiente comando para comprobar si el archivo ASCII se genera en tu bucket de Amazon S3:<pre>aws s3 ls s3://$bucket/</pre> La conversión de datos puede tardar varios segundos en realizarse. Le recomendamos que compruebe el archivo ASCII varias veces.<br />Cuando el archivo ASCII esté disponible, introduzca el siguiente comando para mostrar el contenido del archivo convertido en el bucket de Amazon S3. Si lo necesita, podrá descargarlo o utilizarlo directamente del bucket de Amazon S3:<pre>aws s3 cp s3://$bucket/CLIENT.ASCII.txt - | head</pre><br />Comprobar el contenido del archivo 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> | AWS general | 

### Limpiar el entorno
<a name="clean-the-environment"></a>


| Tarea | Descripción | Habilidades requeridas | 
| --- | --- | --- | 
| (Opcional) Prepare las variables y la carpeta. | Si pierdes la conexión con CloudShell, vuelve a conectarte e introduce el siguiente comando para cambiar el directorio a la carpeta de trabajo:<pre>cd workdir</pre><br />Asegúrese de que las variables de entorno estén definidas:<pre>bucket=<your_bucket_name><br />account=<your_account_number><br />region=<your_region_code></pre> | AWS general | 
| Eliminar la configuración de notificación para el bucket. | Desde la carpeta de CloudShell trabajo, ejecute el siguiente comando para eliminar la configuración de notificaciones de eventos de Amazon S3:<pre>aws s3api put-bucket-notification-configuration \<br />--bucket=$bucket \<br />--notification-configuration="{}"</pre> | AWS general | 
| Elimine la función de Lambda. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para eliminar la función Lambda del convertidor EBCDIC:<pre>aws lambda delete-function \<br />--function-name E2A</pre> | AWS general | 
| Eliminar el rol y la política de IAM. | En la carpeta de CloudShell trabajo, introduzca el siguiente comando para eliminar la función y la política del conversor 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> | AWS general | 
| Elimine los archivos generados en el bucket de Amazon S3. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para eliminar los archivos generados en el bucket de 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> | AWS general | 
| Elimine la carpeta de trabajo. | Desde la carpeta de CloudShell trabajo, introduzca el siguiente comando para eliminarlos `workdir` y su contenido:<pre>cd ..; rm -Rf workdir</pre> | AWS general | 

## Recursos relacionados
<a name="convert-mainframe-files-from-ebcdic-format-to-character-delimited-ascii-format-in-amazon-s3-using-aws-lambda-resources"></a>
+ [Mainframe Data Utilities README](https://github.com/aws-samples/mainframe-data-utilities/blob/main/README.md) () GitHub
+ [El conjunto de caracteres EBCDIC](https://www.ibm.com/docs/en/zos-basic-skills?topic=mainframe-ebcdic-character-set) (documentación de IBM)
+ [EBCDIC a ASCII](https://www.ibm.com/docs/en/iis/11.7.0?topic=tables-ebcdic-ascii) (documentación de IBM)
+ [COBOL](https://www.ibm.com/docs/en/i/7.6.0?topic=languages-cobol) (documentación de IBM)
+ [Uso de un activador de Amazon S3 para invocar una función AWS Lambda Lambda](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html) (documentación)