本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS Mainframe Modernization 和构建 COBOL Db2 程序 AWS CodeBuild
由路易斯·古斯塔沃·丹塔斯 (AWS) 和爱德华多·齐梅莱维奇 () 创作 AWS
摘要
此模式说明了如何使用 AWS Mainframe Modernization Replatform 工具创建一个用于预编译和绑定 COBOL Db2 程序的简单 AWS CodeBuild 项目。这允许在 AWS Mainframe Modernization Replatform 运行时环境中部署和执行这些程序。
COBOL是一种面向业务的编程语言,由于其可靠性和可读性,它为许多关键应用程序提供了支持。 IBMDb2 是一个关系数据库管理系统,可高效管理大量数据,并通过SQL它与COBOL程序集成。尽管出现了新技术,COBOL但 Db2 共同构成了金融和政府等行业关键任务运营的支柱。
将 Db2 组件从大型机环境迁移COBOL到其他平台会带来诸如平台兼容性、集成复杂性、数据迁移和性能优化等挑战。移动这些关键组件需要仔细的规划、技术专业知识和资源,以确保顺利迁移,同时保持可靠性和功能性。
该 AWS Mainframe Modernization 服务提供工具和资源,用于将大型机应用程序和数据库改为在 AWS 基础设施上运行,例如亚马逊弹性计算云 (AmazonEC2) 实例。这涉及在不进行重大代码更改的情况下将大型机工作负载迁移到云端。
Db2 预编译和绑定过程对于优化数据库应用程序的性能和可靠性至关重要。预编译可将嵌入式SQL语句转换为可执行代码,从而减少运行时开销并提高效率。绑定过程将预编译的代码与数据库结构联系起来,便于访问路径和查询优化。此过程可确保数据完整性、提高应用程序响应能力并防范安全漏洞。正确预编译和绑定应用程序可最大限度地减少资源消耗,增强可扩展性并降低SQL注入攻击的风险。
先决条件和限制
先决条件
AWS 账户 和管理员级别的控制台访问权限。
一个 IBM Db2 数据库系统,例如适用于 z/OS 的 IBM Db2 或适用于 Linux、Unix 和 Windows 的 Db2 ()。LUW
IBM数据服务器客户端软件,可从IBM网站
下载。有关更多信息,请参阅IBM数据服务器客户端和数据服务器驱动程序类型 。 要编译和绑定的 COBOL Db2 程序。或者,此模式提供了一个基本的示例程序供您使用。
带有私有网络的虚拟私 AWS 有云 (VPC)。有关创建的信息VPC,请参阅亚马逊虚拟私有云 (AmazonVPC) 文档。
源代码控制存储库,例如 GitHub 或 GitLab。
限制
有关 AWS CodeBuild 配额,请参阅配额 AWS CodeBuild。
有些 AWS 服务 并非全部可用 AWS 区域。有关区域可用性,请参阅AWS 服务 按地区划分
。有关特定终端节点,请参阅服务终端节点和配额页面,然后选择服务的链接。
架构
源技术堆栈
源堆栈包括:
COBOL使用 Db2 数据库存储数据的程序
IBMCOBOL编译器和适用于 z/OS 的 Db2 预编译器
大型机设置的其他部分,例如文件系统、事务管理器和缓冲池
目标技术堆栈
这种模式的方法适用于两个选项:将数据从适用于 z/OS 的 Db2 移动到 Db2LUW,或者在 z/OS 上保留在 Db2 上。目标架构包括:
COBOL使用 Db2 数据库存储数据的程序
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 函数或亚马逊弹性容器服务 (AmazonECS) 服务。
AWS CodePipeline帮助您快速建模和配置软件发布的不同阶段,并自动执行持续发布软件更改所需的步骤。
AWS Mainframe Modernization提供工具和资源,帮助您规划和实施从大型机到 AWS 托管运行时环境的迁移和现代化。
其他工具
AWS Mainframe Modernization Replatform 工具的 Amazon ECR 图片。要编译COBOL应用程序,您需要使用包含 AWS Mainframe Modernization 重新平台工具 CodeBuild 的亚马逊弹性容器注册表 (AmazonECR) 镜像启动:
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 COBOL 程序和不使用 Db2 的程序。
我们建议您避免编译尚未修改的程序。实施一个流程来确定哪些程序需要编译。
操作说明
任务 | 描述 | 所需技能 |
---|---|---|
创建 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 |
任务 | 描述 | 所需技能 |
---|---|---|
创建 D COBOL b2 资产。 |
| 应用程序开发人员 |
创建 |
| AWS DevOps |
将您的存储库连接到 CodePipeline。 |
在后续步骤中创建 (ARN) 策略时,您将需要连接的 Amazon 资源名称 AWS Identity and Access Management (IAM)。 CodePipeline | AWS DevOps |
任务 | 描述 | 所需技能 |
---|---|---|
为创建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 |
任务 | 描述 | 所需技能 |
---|---|---|
创建 CodePipeline 管道和 CodeBuild 项目。 | 要创建 CodePipeline 管道以及编译和绑定 D COBOL b2 程序的 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