本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用和构建 COBOL Db2 程序 AWS Mainframe Modernization AWS CodeBuild
Luis Gustavo Dantas 和 Eduardo Zimelewicz,Amazon Web Services
Summary
注意
AWS Mainframe Modernization 服务(托管运行时环境体验)不再向新客户开放。要获得与 AWS Mainframe Modernization 服务(托管运行时环境体验)类似的功能,请浏览 AWS Mainframe Modernization 服务(自我管理体验)。现有客户可以继续正常使用该服务。有关更多信息,请参阅 AWS Mainframe Modernization 可用性变更。
此模式说明了如何使用 Replatform 工具创建一个用于预编译和绑定 COBOL Db2 程序的简单 AWS CodeBuild 项目。 AWS Mainframe Modernization 这允许在 AWS Mainframe Modernization Replatform 运行时环境中部署和执行这些程序。
COBOL 是一种业务导向的编程语言,得益于其可靠性和可读性,它可为许多关键应用程序提供支持。IBM Db2 是一种关系数据库管理系统,可高效管理大量数据,并通过 SQL 与 COBOL 程序集成。尽管出现了新技术,但 COBOL 和 Db2 共同构成了金融和政府等行业关键任务运营的支柱。
从大型机环境向其他平台迁移 COBOL 和 Db2 组件会带来一些挑战,例如平台兼容性、集成复杂性、数据迁移和性能优化等。移动这些关键组件需要仔细的规划、技术专业知识和资源,以确保顺利迁移,同时保持可靠性和功能性。
该 AWS Mainframe Modernization 服务提供工具和资源,用于将大型机应用程序和数据库改为在 AWS 基础设施(例如亚马逊弹性计算云 (Amazon) 实例 EC2)上运行。这涉及在不进行重大代码更改的情况下将大型机工作负载迁移到云端。
Db2 预编译和绑定过程对于优化数据库应用程序的性能和可靠性至关重要。预编译可将嵌入式 SQL 语句转换为可执行代码,从而减少运行时开销并提高效率。绑定过程将预编译的代码与数据库结构联系起来,便于访问路径和查询优化。此过程可确保数据完整性,提高应用程序响应能力并防范安全漏洞。正确预编译和绑定应用程序可最大限度地减少资源消耗、增强可扩展性,并降低 SQL 注入攻击的风险。
先决条件和限制
先决条件
AWS 账户 和管理员级别的控制台访问权限。
一个 IBM Db2 数据库系统,例如适用于 Linux、Unix 和 Windows 的 IBM Db2 z/OS 或适用于 Linux、Unix 和 Windows 的 Db2 (LUW)。
IBM 数据服务器客户端软件,可从 IBM 网站
下载。有关更多信息,请参阅 IBM 数据服务器客户端和数据服务器驱动程序类型 。 要编译和绑定的 COBOL Db2 程序。或者,此模式还提供了一个基本示例程序供您使用。
AWS 带有私有网络的虚拟私有云 (VPC)。有关创建 VPC 的信息,请参阅 Amazon Virtual Private Cloud(Amazon VPC)文档。
源代码控制存储库,例如 GitHub 或 GitLab。
限制
有关 AWS CodeBuild 配额,请参阅配额 AWS CodeBuild。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅按区域划分的AWS 服务
。有关特定端点,请参阅服务端点和配额页面,然后选择相应服务的链接。
架构
源技术堆栈
源堆栈包括:
使用 Db2 数据库存储数据的 COBOL 程序
IBM COBOL 编译器和用于预编译器的 Db2 z/OS
大型机设置的其他部分,例如文件系统、事务管理器和缓冲池
目标技术堆栈
这种模式的方法适用于两个选项:将数据从 Db2 for 移动 z/OS 到 Db2 for LUW,或者停留在 Db2 上适用于 z/OS。目标架构包括:
使用 Db2 数据库存储数据的 COBOL 程序
AWS Mainframe Modernization 平台重组编译工具
AWS CodeBuild 作为构建应用程序的基础架构
其他 AWS Cloud 资源,例如亚马逊 Linux
目标架构

下图说明了以下内容:
用户将其代码上传到源代码控制存储库,例如 GitHub 或 GitLab。
AWS CodePipeline 注意到更改并从存储库中获取代码。
CodePipeline 启动 AWS CodeBuild 并发送代码。
CodeBuild 按照
buildspec.yml模板(在 “其他信息” 部分中提供)中的说明执行以下操作:从 Amazon Simple Storage Service(Amazon S3)存储桶中获取 IBM Data Server Client。
安装并设置 IBM Data Server Client。
从中检索 Db2 凭证。 AWS Secrets Manager
连接到 Db2 服务器。
预编译、编译并绑定 COBOL 程序。
将成品保存在 S3 存储桶中 AWS CodeDeploy 以备使用。
CodePipeline 开始 CodeDeploy。
CodeDeploy 协调其代理,这些代理已经安装在运行时环境中。代理从 Amazon S3 获取应用程序,并根据
appspec.yml中的说明进行安装。
为了使事情变得简单并专注于构建,此模式中的说明涵盖了步骤 1 到 4,但不包括 COBOL Db2 程序的部署。
自动化和扩展
为简单起见,此模式描述了如何手动预调配资源。但是,有许多自动化选项可用,例如 CloudFormation AWS Cloud Development Kit (AWS CDK)、和 HashiCorp Terraform,它们可以自动执行这些任务。有关更多信息,请参阅 CloudFormation 和 AWS CDK 文档。
工具
AWS 服务
AWS CodeBuild 是一项完全托管式构建服务,可编译源代码、运行单元测试和生成部署就绪的构件。
AWS CodeDeploy自动部署到亚马逊 EC2 或本地实例、 AWS Lambda 函数或亚马逊弹性容器服务 (Amazon ECS) Container Service 服务。
AWS CodePipeline 可帮助您快速对软件发布过程的不同阶段进行建模和配置,并自动执行持续发布软件变更所需步骤。
AWS Mainframe Modernization提供工具和资源,帮助您规划和实施从大型机到 AWS 托管运行时环境的迁移和现代化。
其他工具
适用于 AWS Mainframe Modernization 平台重构工具的 Amazon ECR 图片。要编译 COBOL 应用程序,您需要使用包含重新平台工具的亚马逊弹性容器注册表 (Amazon ECR) Container Registr CodeBuild y 镜像启动: AWS Mainframe Modernization
673918848628.dkr.ecr.<your-region>.amazonaws.com/m2-enterprise-build-tools:9.0.7.R1有关可用的 ECR 映像的更多信息,请参阅《AWS Mainframe Modernization 用户指南》中的教程。
IBM 数据服务器客户机
软件对于预编译和绑定 COBOL Db2 程序至关重要。 CodeBuild它充当 COBOL 编译器和 Db2 之间的桥梁。
最佳实践
并非每个 COBOL 程序都依赖 Db2 作为其数据持久层。确保用于访问 Db2 的编译指令仅应用于专为与 Db2 交互而设计的 COBOL 程序。实现一种逻辑来区分 COBOL Db2 程序与不使用 Db2 的 COBOL 程序。
我们建议您避免编译未修改的程序。实施用来确定哪些程序需要编译的过程。
操作说明
| Task | 说明 | 所需技能 |
|---|---|---|
创建 S3 存储桶以托管 IBM Data Server Client 和管道构件。 | 您需要设置 S3 存储桶,以(a)上传 IBM Data Server Client,(b)存储来自存储库的代码,以及(c)存储构建过程的结果。
有关创建 S3 存储桶的方法,请参阅 Amazon S3 文档。 | 常规 AWS |
将 IBM Data Server Client 上传至 S3 存储桶。 |
| 常规 AWS |
为您的 Db2 凭证创建一个 AWS Secrets Manager 密钥。 | 要创建用于安全存储您的 DB2 凭据的密钥,请执行以下操作:
有关创建密钥的更多信息,请参阅 Secrets Manager 文档。 | 常规 AWS |
验证是否能够从 VPC 子网访问 Db2。 | AWS CodeBuild 需要连接到 Db2 服务器,以便数据服务器客户端可以执行预编译和绑定操作。确保它 CodeBuild 可以通过安全连接到 Db2 服务器。
| 网络管理员、常规 AWS |
| Task | 说明 | 所需技能 |
|---|---|---|
创建 COBOL Db2 资产。 |
| 应用程序开发人员 |
创建 |
| AWS DevOps |
将您的存储库连接到 CodePipeline。 |
在后续步骤中创建 (IAM) 策略时,您将需要连接的 Amazon 资源名称 AWS Identity and Access Management (ARN)。 CodePipeline | AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
为创建 IAM 策略 CodeBuild。 | 该 CodeBuild 项目需要访问某些资源,包括 Secrets Manager 和 Amazon S3。 设置必要权限: 有关创建 IAM 策略的更多信息,请参阅 IAM 文档。 | 常规 AWS |
为创建 IAM 角色 CodeBuild。 | 要使安全策略可用 CodeBuild,您需要配置 IAM 角色。 要创建此角色: 1. 在 IAM 控制台 3. 对于可信实体类型,请保留默认的 AWS 服务 设置。 4. 在 “用例” 中,选择 CodeBuild 服务,然后选择 “下一步”。 4. 在可用 IAM 策略列表中,找到您为其创建的策略 CodeBuild,然后选择下一步将其附加到该角色。 5. 为角色指定名称,然后选择 “创建角色” 将其保存以备将来参考 CodeBuild。 有关为创建 IAM 角色的更多信息 AWS 服务,请参阅 IAM 文档。 | 常规 AWS |
为创建 IAM 策略 CodePipeline。 | 该 AWS CodePipeline 管道需要访问某些资源,包括您的代码存储库和 Amazon S3。 重复之前提供的步骤, CodeBuild 为创建 IAM 策略 CodePipeline (在步骤 2 中,选择CodePipeline而不是 CodeBuild)。 | AWS DevOps |
为创建 IAM 角色 CodePipeline。 | 要使安全策略可用 CodePipeline,您需要配置 IAM 角色。 要创建此角色:
| AWS DevOps |
| Task | 说明 | 所需技能 |
|---|---|---|
创建 CodePipeline 管道和 CodeBuild 项目。 | 要创建 CodePipeline 管道以及编译和绑定 COBOL Db2 程序的 CodeBuild 项目,请执行以下操作:
| AWS DevOps |
检查输出。 | 通过查看构建日志来验证 CodePipeline 构建是否成功。 | AWS DevOps |
在 Db2 中检查结果。 | 验证 SYSPLAN 表中的软件包版本。
版本必须与 CodeBuild 构建 ID 相匹配,在我们的示例
|
问题排查
| 问题 | 解决方案 |
|---|---|
有时,当您在服务之间切换时, AWS 控制台会切换区域。 | AWS 区域 每当您在服务之间切换时,请务必验证所选内容。 AWS 区域 选择器位于控制台窗口的右上角。 |
可能很难从 CodeBuild中识别 Db2 连接问题。 | 要解决连接问题,请在
|
有时,IAM 控制台中的角色窗格不会立即显示您创建的 IAM 策略。 | 如果遇到延迟,请刷新屏幕以显示最新信息。 |
相关资源
IBM 文档
AWS 文档
附加信息
CodeBuild 策略
将占位符 <RegionID>、<AccountID>、<SubnetARN>、<BucketARN> 和 <DB2CredSecretARN> 替换为您的值。
{"Version": "2012-10-17", "Statement": [ {"Action": "ecr:GetAuthorizationToken", "Effect": "Allow", "Resource": "*" }, {"Action": ["ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability"], "Effect": "Allow", "Resource": "arn:aws:ecr:*:673918848628:repository/m2-enterprise-build-tools"}, {"Action": "s3:PutObject", "Effect": "Allow", "Resource": "arn:aws:s3:::aws-m2-repo-*/*"}, {"Action": ["logs:PutLogEvents", "logs:CreateLogStream", "logs:CreateLogGroup"], "Effect": "Allow", "Resource": "arn:aws:logs:<RegionId>:<AccountId>:*"}, {"Action": ["ec2:DescribeVpcs", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "ec2:DescribeNetworkInterfaces", "ec2:DescribeDhcpOptions", "ec2:DeleteNetworkInterface", "ec2:CreateNetworkInterface"], "Effect": "Allow", "Resource": "*"}, {"Action": "ec2:CreateNetworkInterfacePermission", "Effect": "Allow", "Resource": ["<SubnetARN>"]}, {"Action": "s3:*", "Effect": "Allow", "Resource": ["<BucketARN>/*","<BucketARN>"]}, {"Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Resource": "<DB2CredSecretARN>"} ] }
CodePipeline 策略
将占位符 <BucketARN> 和 <ConnectionARN> 替换为您的值。
{ "Version": "2012-10-17", "Statement": [ {"Action": ["s3:List*", "s3:GetObjectVersion", "s3:GetObject", "s3:GetBucketVersioning" ], "Effect": "Allow", "Resource": ["<BucketARN>/*", "<BucketARN>"]}, {"Action": ["codebuild:StartBuild", "codebuild:BatchGetBuilds"], "Effect": "Allow", "Resource": "*"}, {"Action": ["codestar-connections:UseConnection"], "Effect": "Allow", "Resource": "<ConnectionARN>"} ] }
buildspec.yml
将 <your-bucket-name> 占位符替换为实际 S3 存储桶名称。
version: 0.2 phases: pre_build: commands: - /var/microfocuslicensing/bin/mfcesd -no > /var/microfocuslicensing/logs/mfcesd_startup.log 2>&1 & - | mkdir $CODEBUILD_SRC_DIR/db2client aws s3 cp s3://<your-bucket-name>/v11.5.8_linuxx64_client.tar.gz $CODEBUILD_SRC_DIR/db2client/ >> /dev/null 2>&1 tar -xf $CODEBUILD_SRC_DIR/db2client/v11.5.8_linuxx64_client.tar.gz -C $CODEBUILD_SRC_DIR/db2client/ cd $CODEBUILD_SRC_DIR/db2client/ ./client/db2_install -f sysreq -y -b /opt/ibm/db2/V11.5 >> /dev/null 2>&1 useradd db2cli /opt/ibm/db2/V11.5/instance/db2icrt -s client -u db2cli db2cli DB2CRED=$(aws secretsmanager get-secret-value --secret-id dev-db2-cred | jq -r '.SecretString | fromjson') read -r DB2USER DB2PASS DB_NODE DB_HOST DB_PORT DB_NAME DB_QUAL <<<$(echo $DB2CRED | jq -r '.username, .password, .db2node, .db2host, .db2port, .db2name, .qualifier') . /home/db2cli/sqllib/db2profile db2 catalog tcpip node $DB_NODE remote $DB_HOST server $DB_PORT db2 catalog db $DB_NAME as $DB_NAME at node $DB_NODE authentication server build: commands: - | revision=$CODEBUILD_SRC_DIR/loadlib mkdir -p $revision; cd $revision . /opt/microfocus/EnterpriseDeveloper/bin/cobsetenv cob -zU $CODEBUILD_SRC_DIR/CDB2SMP.cbl -C "DB2(DB==${DB_NAME} PASS==${DB2USER}.${DB2PASS} VERSION==${CODEBUILD_BUILD_NUMBER} COLLECTION==DB2AWSDB" artifacts: files: - "**/*" base-directory: $revision