Converta arquivos de mainframe do formato EBCDIC para o formato ASCII delimitado por caracteres no Amazon S3 usando AWS Lambda - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Converta arquivos de mainframe do formato EBCDIC para o formato ASCII delimitado por caracteres no Amazon S3 usando AWS Lambda

Luis Gustavo Dantas, Amazon Web Services

Resumo

Esse padrão mostra como iniciar uma AWS Lambda função que converte automaticamente arquivos EBCDIC (Extended Binary Coded Decimal Interchange Code) do mainframe em arquivos American Standard Code for Information Interchange (ASCII) delimitados por caracteres. A função do Lambda é executada depois do upload dos arquivos ASCII em um bucket do Amazon Simple Storage Service (Amazon S3). Após a conversão do arquivo, você pode ler os arquivos ASCII em workloads baseadas em x86 ou carregar os arquivos em bancos de dados modernos.

A abordagem de conversão de arquivos demonstrada nesse padrão pode ajudar a superar os desafios de trabalhar com arquivos EBCDIC em ambientes modernos. Os arquivos codificados em EBCDIC geralmente contêm dados representados em formato binário ou decimal compactado, e os campos têm tamanho fixo. Essas características criam obstáculos, porque workloads modernas baseadas em x86 ou ambientes distribuídos geralmente funcionam com dados codificados em ASCII e não conseguem processar arquivos EBCDIC.

Pré-requisitos e limitações

Pré-requisitos

  • Um ativo Conta da AWS

  • Um bucket do Amazon S3

  • Um usuário AWS Identity and Access Management (IAM) com permissões administrativas

  • AWS CloudShell

  • Python 3.8.0 ou superior

  • Um arquivo simples codificado em EBCDIC e sua estrutura de dados correspondente em um copybook de linguagem comum orientada a negócios (COBOL)

Limitações

  • Os copybooks de COBOL geralmente contêm várias definições de layout. O mainframe-data-utilitiesprojeto pode analisar esse tipo de caderno, mas não consegue inferir qual layout considerar na conversão de dados. Isso ocorre porque os copybooks não mantêm essa lógica (que, em vez disso, permanece nos programas COBOL). Consequentemente, você deve configurar manualmente as regras para selecionar layouts depois de analisar o copybook.

  • Esse padrão está sujeito às cotas do Lambda.

Arquitetura

Pilha de tecnologia de origem

  • IBM z/OS, IBM i e outros sistemas EBCDIC

  • Arquivos sequenciais com dados codificados em EBCDIC (como descarregamentos do IBM Db2)

  • Copybook de COBOL

Pilha de tecnologias de destino

  • Amazon S3

  • Notificação de eventos do Amazon S3

  • IAM

  • Função do Lambda

  • Python 3.8 ou superior

  • Utilitários de dados de mainframe

  • Metadados JSON

  • Arquivos ASCII delimitados por caracteres

Arquitetura de destino

O diagrama a seguir mostra uma arquitetura para converter arquivos EBCDIC de mainframe em arquivos ASCII.

Arquitetura para converter arquivos EBCDIC de mainframe em arquivos ASCII

O diagrama mostra o seguinte fluxo de trabalho:

  1. O usuário executa o script do analisador de cadernos, que converte o caderno COBOL em um arquivo JSON.

  2. O usuário carrega os metadados JSON em um bucket do Amazon S3. Isso torna os metadados legíveis pela função do Lambda de conversão de dados.

  3. O usuário ou um processo automatizado carrega o arquivo EBCDIC no bucket do Amazon S3.

  4. O evento de notificação do Amazon S3 aciona a função Lambda de conversão de dados.

  5. AWS verifica as permissões de leitura e gravação do bucket do Amazon S3 para a função Lambda.

  6. O Lambda lê o arquivo do bucket do Amazon S3 e converte localmente o arquivo de EBCDIC para ASCII.

  7. O Lambda registra o status do processo na Amazon. CloudWatch

  8. O Lambda grava o arquivo ASCII de volta no Amazon S3.

nota

O script do analisador do copybook é executado uma única vez para realizar a conversão de metadados para o formato JSON, que é posteriormente armazenado em um bucket do Amazon S3. Após a conversão inicial, todos os arquivos EBCDIC subsequentes que fazem referência ao mesmo arquivo JSON no bucket do Amazon S3 usarão a configuração de metadados existente.

Ferramentas

Serviços da AWS

  • CloudWatchA Amazon ajuda você a monitorar as métricas dos seus AWS recursos e dos aplicativos nos quais você executa AWS em tempo real.

  • O Amazon Simple Storage Service (Amazon S3) é um serviço de armazenamento de objetos baseado na nuvem que ajuda você a armazenar, proteger e recuperar qualquer quantidade de dados.

  • AWS CloudShellé um shell baseado em navegador que você pode usar para gerenciar Serviços da AWS usando o AWS Command Line Interface (AWS CLI) e uma variedade de ferramentas de desenvolvimento pré-instaladas.

  • AWS Identity and Access Management (IAM) ajuda você a gerenciar com segurança o acesso aos seus AWS recursos controlando quem está autenticado e autorizado a usá-los.

  • O AWS Lambda é um serviço de computação que ajuda a executar código sem exigir provisionamento ou gerenciamento de servidores. O Lambda executa seu código somente quando necessário e escala automaticamente, e, assim, você paga apenas pelo tempo de computação usado.

Outras ferramentas

  • GitHubé um serviço de hospedagem de código que fornece ferramentas de colaboração e controle de versão.

  • O Python é uma linguagem de programação de alto nível.

Código

O código desse padrão está disponível no GitHub mainframe-data-utilitiesrepositório.

Práticas recomendadas

Considere as seguintes práticas recomendadas:

  • Defina as permissões necessárias no nível do nome do recurso da Amazon (ARN).

  • Sempre conceda permissões de privilégio mínimo para políticas do IAM. Para obter mais informações, consulte Melhores práticas de segurança no IAM na documentação do IAM.

Épicos

TarefaDescriçãoHabilidades necessárias

Crie as variáveis de ambiente.

Copie as seguintes variáveis de ambiente para um editor de texto e, em seguida, substitua <placeholder> os valores no exemplo a seguir pelos valores do seu recurso:

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

Você criará referências para seu bucket do Amazon S3 e Conta da AWS Região da AWS , posteriormente.

Para definir variáveis de ambiente, abra o CloudShell console e, em seguida, copie e cole suas variáveis de ambiente atualizadas na linha de comando.

nota

Você deve repetir essa etapa sempre que a CloudShell sessão for reiniciada.

AWS geral

Crie uma pasta de trabalho.

Para simplificar o processo de limpeza de recursos posteriormente, crie uma pasta de trabalho CloudShell executando o seguinte comando:

mkdir workdir; cd workdir
nota

Você deve alterar o diretório para o diretório de trabalho (workdir) toda vez que perder uma conexão com sua CloudShell sessão.

AWS geral
TarefaDescriçãoHabilidades necessárias

Crie uma política de confiança para a função do Lambda.

O conversor EBCDIC é executado em uma função do Lambda. A função deve ter um perfil do IAM. Antes de criar um perfil do IAM, você deve definir um documento de política de confiança que permita que os recursos assumam essa política.

Na pasta de CloudShell trabalho, crie um documento de política executando o seguinte comando:

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

Crie o perfil do IAM para conversão do Lambda.

Para criar uma função do IAM, execute o seguinte AWS CLI comando na pasta de CloudShell trabalho:

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

Crie o documento de política do IAM para a função do Lambda.

A função Lambda deve ter acesso de leitura e gravação ao bucket do Amazon S3 e permissões de gravação para o Amazon Logs. CloudWatch

Para criar uma política do IAM, execute o seguinte comando na pasta de CloudShell trabalho:

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
AWS geral

Anexe o documento da política do IAM ao perfil do IAM.

Para anexar a política do IAM à função do IAM, digite o seguinte comando na sua pasta de CloudShell trabalho:

aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json
AWS geral
TarefaDescriçãoHabilidades necessárias

Baixe o código-fonte da conversão EBCDIC.

Na pasta de CloudShell trabalho, execute o comando a seguir para baixar o mainframe-data-utilities código-fonte de GitHub:

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

Crie o pacote ZIP.

Na pasta de CloudShell trabalho, insira o seguinte comando para criar o pacote ZIP que cria a função Lambda para conversão EBCDIC:

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

Criar a função do Lambda.

Na pasta de CloudShell trabalho, insira o seguinte comando para criar a função Lambda para conversão EBCDIC:

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/}"
nota

 O layout da variável de ambiente informa à função Lambda onde residem os metadados JSON.

AWS geral

Crie a política baseada em recursos para a função do Lambda.

Na pasta de CloudShell trabalho, insira o seguinte comando para permitir que sua notificação de eventos do Amazon S3 acione a função Lambda para conversão EBCDIC:

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
AWS geral
TarefaDescriçãoHabilidades necessárias

Crie o documento de configuração para a notificação de evento do Amazon S3.

A notificação de evento do Amazon S3 inicia a função do Lambda de conversão do EBCDIC quando os arquivos são colocados na pasta de entrada.

Na pasta de CloudShell trabalho, execute o seguinte comando para criar o documento JSON para a notificação de eventos do Amazon S3:

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
AWS geral

Crie a notificação de evento do Amazon S3.

Na pasta de CloudShell trabalho, digite o seguinte comando para criar a notificação de evento do Amazon S3:

aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json
AWS geral
TarefaDescriçãoHabilidades necessárias

Analise o copybook de COBOL.

Na pasta de CloudShell trabalho, insira o seguinte comando para analisar um exemplo de caderno COBOL em um arquivo JSON (que define como ler e dividir o arquivo de dados corretamente):

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
AWS geral

Adicione a regra de transformação.

O arquivo de dados de amostra e seu copybook de COBOL correspondente são arquivos com vários layouts. Isso significa que a conversão deve dividir os dados com base em determinadas regras. Nesse caso, os bytes nas posições 3 e 4 em cada linha definem o layout.

Na pasta de CloudShell trabalho, edite o CLIENT.json arquivo e altere o conteúdo "transf-rule": [], para o seguinte:

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

Faça o upload dos metadados JSON para o bucket do Amazon S3.

Na pasta de CloudShell trabalho, insira o seguinte AWS CLI comando para fazer o upload dos metadados JSON em seu bucket do Amazon S3:

aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json
AWS geral
TarefaDescriçãoHabilidades necessárias

Envie o arquivo EBCDIC para o bucket do Amazon S3.

Na pasta de CloudShell trabalho, digite o seguinte comando para enviar o arquivo EBCDIC para o bucket do Amazon S3:

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

 Recomendamos que você defina pastas diferentes para arquivos de entrada (EBCDIC) e saída (ASCII) para evitar chamar a função de conversão do Lambda novamente quando o arquivo ASCII for carregado no bucket do Amazon S3.

AWS geral

Verifique a saída.

Na pasta de CloudShell trabalho, insira o seguinte comando para verificar se o arquivo ASCII foi gerado no seu bucket do Amazon S3:

aws s3 ls s3://$bucket/
nota

 A conversão de dados pode levar alguns segundos para acontecer. Recomendamos que você verifique o arquivo ASCII algumas vezes.

Depois que o arquivo ASCII estiver disponível, digite o seguinte comando para visualizar o conteúdo do arquivo convertido no bucket do Amazon S3. Conforme necessário, você pode baixá-lo ou usá-lo diretamente do bucket do Amazon S3:

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

Verifique o conteúdo do arquivo ASCII:

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|
AWS geral
TarefaDescriçãoHabilidades necessárias

(Opcional) Prepare as variáveis e a pasta.

Se você perder a conexão com CloudShell, reconecte-se e digite o seguinte comando para alterar o diretório para a pasta de trabalho:

cd workdir

Certifique-se de que as variáveis de ambiente estejam definidas:

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

Remova a configuração de notificação para o bucket.

Na pasta de CloudShell trabalho, execute o seguinte comando para remover a configuração de notificação de eventos do Amazon S3:

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

Exclua a função do Lambda.

Na pasta de CloudShell trabalho, digite o seguinte comando para excluir a função Lambda para o conversor EBCDIC:

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

Exclua a política e o perfil do IAM.

Na pasta de CloudShell trabalho, digite o seguinte comando para remover a função e a política do conversor EBCDIC:

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

Exclua os arquivos gerados no bucket do Amazon S3.

Na pasta de CloudShell trabalho, insira o seguinte comando para excluir os arquivos gerados no bucket do Amazon S3:

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

Exclua a pasta de trabalho.

Na pasta de CloudShell trabalho, digite o seguinte comando para remover workdir e seu conteúdo:

cd ..; rm -Rf workdir
AWS geral

Recursos relacionados