本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用和构建 COBOL Db2 程序 AWS Mainframe ModernizationAWS CodeBuild
Luis Gustavo Dantas 和 Eduardo Zimelewicz,Amazon Web Services
摘要
此模式说明了如何使用 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 的信息,请参阅亚马逊虚拟私有云(亚马逊 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 S3) 存储桶获取 IBM 数据服务器客户端。 
- 安装和设置 IBM 数据服务器客户机。 
- 从中检索 Db2 凭证。 AWS Secrets Manager 
- 连接到 Db2 服务器。 
- 预编译、编译和绑定 COBOL 程序。 
- 将成品保存在 S3 存储桶中 AWS CodeDeploy 以备使用。 
 
- CodePipeline 开始 CodeDeploy。 
- CodeDeploy 协调其代理,这些代理已经安装在运行时环境中。代理从 Amazon S3 获取应用程序并根据中的说明进行安装 - appspec.yml。
为了使事情变得简单并专注于构建,此模式中的说明涵盖了步骤 1 到 4,但不包括 COBOL Db2 程序的部署。
自动化和扩缩
为简单起见,此模式描述了如何手动配置资源。但是,有许多自动化选项可用,例如 AWS CloudFormation AWS Cloud Development Kit (AWS CDK)、和 HashiCorp Terraform,它们可以自动执行这些任务。有关更多信息,请参阅AWS 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 数据服务器客户端和管道项目。 | 您需要设置 S3 存储桶,以 (a) 上传 IBM 数据服务器客户端,(b) 存储存储库中的代码,以及 (c) 存储构建过程的结果。 
 有关创建 S3 存储桶的方法,请参阅 Amazon S3 文档。 | 常规 AWS | 
| 将 IBM 数据服务器客户端上传到 S3 存储桶。 | 
 | 常规 AWS | 
| 为您的 Db2 凭证创建一个 AWS Secrets Manager 密钥。 | 要创建用于安全存储您的 DB2 凭据的密钥,请执行以下操作: 
 有关创建密钥的更多信息,请参阅 Secr ets 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 策略
用您的值替换占位<ConnectionARN>符<BucketARN>和。
{ "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