使用 Lambda 在 ASCII Amazon S3 中将大型机文件从EBCDIC格式转换为以字符分隔的格式 AWS - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Lambda 在 ASCII Amazon S3 中将大型机文件从EBCDIC格式转换为以字符分隔的格式 AWS

由路易斯·古斯塔沃·丹塔斯创作 () AWS

代码存储库:大型机数据实用程序

环境:PoC 或试点

来源:IBMEBCDIC文件

目标:带分隔符ASCII的文件

R 类型:更换平台

工作量:IBM

技术:大型机

AWS服务:AWS CloudShell; AWS Lambda; 亚马逊 S3; 亚马逊 CloudWatch

Summary

此模式向您展示如何启动 AWS Lambda 函数,该函数可自动将大型机EBCDIC(扩展二进制编码的十进制交换码)文件转换为字符分隔ASCII(美国信息交换标准代码)文件。Lambda 函数将在ASCII文件上传到亚马逊简单存储服务 (Amazon S3) 存储桶后运行。文件转换后,您可以读取基于 x86 的工作负载上的ASCII文件或将文件加载到现代数据库中。

此模式中演示的文件转换方法可以帮助您克服在现代环境中处理EBCDIC文件所面临的挑战。编码的文件EBCDIC通常包含以二进制或压缩十进制格式表示的数据,并且字段的长度是固定的。这些特征造成了障碍,因为基于 x86 的现代工作负载或分布式环境通常使用ASCII编码的数据并且无法处理文件。EBCDIC

先决条件和限制

先决条件

  • 一个活跃的AWS账户

  • 一个 S3 存储桶

  • 具有管理权限的 AWS Identity and Access Management (IAM) 用户

  • AWS CloudShell

  • Python 3.8.0 或更高版本

  • 以通用业务为导向EBCDIC的语言 () COBOL 字帖中编码的平面文件及其相应的数据结构

注意:此模式使用示例EBCDIC文件 (CLIENT. EBCDIC.txt) 及其相应的COBOL抄本 (COBKS0 5.cpy)。这两个文件都在 GitHub mainframe-data-utilities存储库中可用。

限制

  • COBOL字帖通常包含多个布局定义。该mainframe-data-utilities项目可以解析这种抄本,但无法推断出在数据转换时要考虑哪种布局。这是因为抄写本不包含这种逻辑(改为保留在COBOL程序上)。因此,解析副本后,必须要手动配置布局选择规则。

  • 这种模式受 Lambda 配额约束。

架构

源技术堆栈

  • IBMz/OS、IBM i 和其他系统 EBCDIC

  • 使用编码数据的顺序文件EBCDIC(例如 IBM Db2 卸载)

  • COBOL复印本

目标技术堆栈

  • Amazon S3

  • Amazon S3 事件通知

  • IAM

  • Lambda 函数

  • Python 3.8 或更高版本

  • 大型机数据实用程序

  • JSON元数据

  • 以字符分隔的文件 ASCII

目标架构

下图显示了将大型机EBCDIC文件转换为ASCII文件的架构。

将大型机EBCDIC文件转换为ASCII文件的架构

图表显示了以下工作流:

  1. 用户运行抄本解析器脚本将COBOL抄写本转换为文件。JSON

  2. 用户将JSON元数据上传到 S3 存储桶。这使得数据转换 Lambda 函数可读取元数据。

  3. 用户或自动流程将EBCDIC文件上传到 S3 存储桶。

  4. S3 通知事件将会触发数据转换 Lambda 函数。

  5. AWS验证 Lambda 函数的 S3 存储桶读写权限。

  6. Lambda 从 S3 存储桶读取文件并在本地将文件从EBCDIC转换为。ASCII

  7. Lambda 在亚马逊上记录流程状态。 CloudWatch

  8. Lambda 将ASCII文件写回亚马逊 S3。

注意:Copybook 解析器脚本在将元数据转换为 S3 存储桶JSON然后将其上传到 S3 存储桶之后,仅运行一次。初始转换后,任何EBCDIC使用上传到 S3 存储桶的相同JSON文件的文件都将使用相同的元数据。

工具

AWS工具

  • Amazon CloudWatch 可帮助您实时监控您的AWS资源和运行的应用程序AWS的指标。

  • Amazon Simple Storage Service (Amazon S3) 是一项基于云的对象存储服务,可帮助您存储、保护和检索任意数量的数据。

  • AWS CloudShell是一个基于浏览器的外壳,您可以使用AWS命令行界面 (AWSCLI) 和一系列预装的开发工具来管理AWS服务。

  • AWSIdentity and Access Management (IAM) 通过控制谁经过身份验证并有权使用AWS资源,从而帮助您安全地管理对资源的访问权限。

  • AWSLambda 是一项计算服务,可帮助您运行代码,而无需预置或管理服务器。Lambda 仅在需要时运行您的代码,并且能自动扩缩,因此您只需为使用的计算时间付费。

其他工具

  • GitHub是一项代码托管服务,提供协作工具和版本控制。

  • Python 是高级编程语言。

代码

此模式的代码可在 GitHub mainframe-data-utilities存储库中找到。

最佳实践

考虑下面的最佳实践:

  • 在 Amazon 资源名称 (ARN) 级别设置所需的权限。

  • 始终为策略授予最低权限权限。IAM有关更多信息,请参阅IAM文档IAM中的安全最佳实践

操作说明

任务描述所需技能

创建环境变量。

将以下环境变量复制至文本编辑器,然后将<placeholder>以下示例中的值替换为您的资源值:

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

注意:稍后您将创建对您的 S3 存储桶、AWS账户和AWS区域的引用。

要定义环境变量,请打开CloudShell 控制台,然后将更新的环境变量复制并粘贴到命令行中。

注意:每次 CloudShell 会话重新启动时都必须重复此步骤。

将军 AWS

创建工作文件夹。

要简化以后的资源清理过程,请运行以下命令在中 CloudShell 创建一个工作文件夹:

mkdir workdir; cd workdir

注意:每次断开与 CloudShell 会话的连接时,都必须将目录更改为工作目录 (workdir)。

将军 AWS
任务描述所需技能

创建 Lambda 函数的信任策略。

EBCDIC转换器在 Lambda 函数中运行。该函数必须有IAM角色。在创建IAM角色之前,必须定义一个信任策略文档,使资源能够承担该策略。

在 CloudShell 工作文件夹中,通过运行以下命令创建策略文档:

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

创建用于 Lambda 转换的IAM角色。

要创建IAM角色,请在 CloudShell 工作文件夹中运行以下AWSCLI命令:

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

为 Lambda 函数创建IAM策略文档。

Lambda 函数必须具有对 S3 存储桶的读写访问权限以及对 Amazon 日志的写入权限。 CloudWatch

要创建IAM策略,请在 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
将军 AWS

将IAM策略文档附加到该IAM角色。

要将IAM策略附加到IAM角色,请从您的 CloudShell 工作文件夹中运行以下命令:

aws iam put-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy --policy-document file://E2AConvLambdaPolicy.json
将军 AWS
任务描述所需技能

下载EBCDIC转换源代码。

在 CloudShell 工作文件夹中,运行以下命令从中下载 mainframe-data-utilities源代码 GitHub:

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

创建ZIP软件包。

在 CloudShell 工作文件夹中,运行以下命令来创建用于转换的 Lambda 函数的ZIPEBCDIC包:

cd mdu; zip ../mdu.zip *.py; cd ..
将军 AWS

创建 Lambda 函数。

在 CloudShell 工作文件夹中,运行以下命令来创建用于EBCDIC转换的 Lambda 函数:

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

注意:环境变量布局告知 Lambda 函数JSON元数据所在的位置。

将军 AWS

为 Lamba 函数创建基于资源的策略。

在 CloudShell 工作文件夹中,运行以下命令以允许您的 Amazon S3 事件通知触发 Lambda 函数进行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
任务描述所需技能

为 Amazon S3 的事件通知创建配置文档。

当文件放入输入文件夹时,Amazon S3 事件通知会启动EBCDIC转换 Lambda 函数。

在 CloudShell 工作文件夹中,运行以下命令为 Amazon S3 事件通知创建JSON文档:

{ "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

创建 Amazon S3 事件通知。

在 CloudShell 工作文件夹中,运行以下命令来创建 Amazon S3 事件通知:

aws s3api put-bucket-notification-configuration --bucket $bucket --notification-configuration file://S3E2AEvent.json
将军 AWS
任务描述所需技能

解析字COBOL帖。

在 CloudShell 工作文件夹中,运行以下命令将示例COBOL抄写本解析为JSON文件(该文件定义了如何正确读取和切片数据文件):

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

添加转换规则。

样本数据文件及其对应的COBOL副本是一个多布局文件。这意味着转换必须按某些规则对数据进行切片。在这种情况下,每行位置 3 和 4 的字节定义了布局。

在 CloudShell 工作文件夹中,编辑CLIENT.json文件并将内容从更改"transf-rule": [],为以下内容:

"transf-rule": [ { "offset": 4, "size": 2, "hex": "0002", "transf": "transf1" }, { "offset": 4, "size": 2, "hex": "0000", "transf": "transf2" } ],
通用AWS、IBM大型机、Cobol

将JSON元数据上传到 S3 存储桶。

在 CloudShell 工作文件夹中,运行以下AWSCLI命令将JSON元数据上传到您的 S3 存储桶:

aws s3 cp CLIENT.json s3://$bucket/layout/CLIENT.json
将军 AWS
任务描述所需技能

将EBCDIC文件发送到 S3 存储桶。

在 CloudShell 工作文件夹中,运行以下命令将EBCDIC文件发送到 S3 存储桶:

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

注意:我们建议您为输入 (EBCDIC) 和输出 (ASCII) 文件设置不同的文件夹,以免在ASCII文件上传到 S3 存储桶时再次调用 Lambda 转换函数。

将军 AWS

检查输出情况。

在 CloudShell 工作文件夹中,运行以下命令以检查ASCII文件是否在您的 S3 存储桶中生成:

awss3 ls s3://$bucket/

注意:数据转换可能需要几秒钟才能完成。我们建议您多次检查该ASCII文件。

ASCII文件可用后,运行以下命令将文件从 S3 存储桶下载到当前文件夹:

aws s3 cp s3://$bucket/CLIENT.ASCII.txt .

检查ASCII文件内容:

head CLIENT.ASCII.txt
将军 AWS
任务描述所需技能

(可选)准备变量与文件夹。

如果与断开连接 CloudShell,请重新连接,然后运行以下命令将目录更改为工作文件夹:

cd workdir

确保您已定义环境变量:

bucket=<your_bucket_name> account=<your_account_number> region=<your_region_code>
将军 AWS

移除存储桶的通知配置。

在 CloudShell 工作文件夹中,运行以下命令以删除 Amazon S3 事件通知配置:

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

删除 Lambda 函数。

在 CloudShell 工作文件夹中,运行以下命令删除转换器的 Lambda 函数:EBCDIC

awslambdadelete-function--function-nameE2A
将军 AWS

删除IAM角色和策略。

在 CloudShell 工作文件夹中,运行以下命令以删除EBCDIC转换器角色和策略:

aws iam delete-role-policy --role-name E2AConvLambdaRole --policy-name E2AConvLambdaPolicy aws iam delete-role --role-name E2AConvLambdaRole
将军 AWS

删除 S3 存储桶内生成的文件。

在 CloudShell 工作文件夹中,运行以下命令删除 S3 存储桶中生成的文件:

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

删除工作文件夹。

在 CloudShell 工作文件夹中,运行以下命令以删除workdir及其内容:

cd ..; rm -Rf workdir
将军 AWS

相关资源