本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 AWS Transform 和 Terraform 实现大型机应用程序的现代化和部署
Mason Cahill、Polaris Jhandi、Prachi Khanna、Sivasubramanian Ramani 和 Santosh Kumar Singh,Amazon Web Services
Summary
AWS Transform可以加速.NET、大型机和 VMware 工作负载的大规模现代化。它部署了专门的 AI 代理,可以自动执行评估、代码分析、重构、分解、依赖关系映射、验证、转型规划等复杂的任务。此模式演示了如何使用对大型机应用程序 AWS Transform 进行现代化改造,然后使用 Hashic orp Terraform 将其部署到 AWS 基础架构。这些 step-by-step说明可帮助您将开源大型机应用程序示例,从 COBOL 转换为CardDemo现代 Java 应用程序。
先决条件和限制
先决条件
限制
AWS Transform 仅在某些版本中可用 AWS 区域。有关支持区域的完整列表,请参阅 AWS Transform支持的区域。
AWS Transform对大型机转换功能设有服务配额。有关更多信息,请参阅 AWS Transform配额。
要在共享工作区上进行协作,所有用户都必须是与您 AWS IAM Identity Center 的 AWS Transform Web 应用程序实例关联的相同实例的注册用户。
亚马逊简单存储服务 (Amazon S3) Semple Storage Service 存储桶 AWS Transform 必须位于 AWS 账户 相同的区域中。
架构
下图显示了旧版应用程序的 end-to-end现代化以及部署到的过程 AWS 云。应用程序和数据库凭证存储在中 AWS Secrets Manager,Amazon CloudWatch 提供监控和记录功能。
下图显示了如下工作流:
通过 AWS IAM Identity Center,用户在中进行身份验证和访问 AWS Transform 。 AWS 账户
用户将 COBOL 大型机代码上传到 Amazon S3 存储桶,然后在 AWS Transform中启动转换。
AWS Transform 将 COBOL 代码现代化为云原生 Java 代码,并将现代化的代码存储在 Amazon S3 存储桶中。
Terraform 创建用于部署现代化应用程序 AWS 的基础设施,包括应用程序负载均衡器、亚马逊弹性计算云 (Amazon EC2) 实例和亚马逊关系数据库服务 (Amazon RDS) 数据库。Terraform 将现代化的代码部署到亚马逊实例。 EC2
VSAM 文件已上传到亚马逊, EC2 然后从亚马逊迁移 EC2 到亚马逊 RDS 数据库。
工具
AWS 服务
其他工具
代码存储库
此模式的代码可在 GitHub 大型机转换 E2E 存储库中找到。此模式使用开源 AWS CardDemo大型机应用程序作为示例应用程序。
最佳实践
分配要迁移的代码和资源的全部所有权。
先开发并测试概念验证,再全面迁移。
确保得到所有利益相关者的承诺。
建立清晰的沟通渠道。
定义并记录最简可行产品(MVP)要求。
设定明确的成功标准。
操作说明
| Task | 说明 | 所需技能 |
|---|
创建存储桶。 | 在已启用的相同 AWS 账户 区域中创建 Amazon S3 存储桶。 AWS Transform 您可以使用此存储桶存储构建和运行应用程序所需的大型机应用程序代码、数据和其他脚本。 AWS Transform 使用此存储桶存储重构后的代码和其他与转换相关的文件。有关说明,请参阅 Amazon S3 文档中的创建存储桶。 | 常规 AWS、AWS 管理员 |
设置存储桶的 CORS 权限。 | 在设置存储桶以进行 AWS Transform 访问时,您需要为存储桶配置跨源资源共享 (CORS)。如果设置不正确,可能无法使用 AWS Transform的内联查看或文件比较功能。有关如何为存储桶配置 CORS 的说明,请参阅 Amazon S3 存储桶中的使用跨域资源共享。有关策略,请参阅 AWS Transform 文档中的 S3 存储桶 CORS 权限。 | 常规 AWS、AWS 管理员 |
准备大型机应用程序代码示例。 | 输入以下命令将CardDemo存储库克隆到本地工作站: git clone https://github.com/aws-samples/aws-mainframe-modernization-carddemo.git
将 aws-mainframe-modernization-carddemo 文件夹压缩为 ZIP 文件。 将 ZIP 文件上传到您创建的 Amazon S3 存储桶。有关说明,请参阅 Amazon S3 文档中的上传对象。
| 常规 AWS,应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|
设置作 AWS Transform 业。 | 使用您的凭据登录即可访问 AWS Transform Web 应用程序。 按照 AWS Transform 文档中设置工作区中的说明创建新的工作区。 在您的工作空间登录页面上,选择询问 AWS Transform 以创建作业。 接下来,选择大型机现代化作为作业类型。 在聊天窗口中,输入将代码转换为 Java。 查看建议的作业类型、名称和目标。按 Enter 键以确认。 请选择创建任务。
| 应用程序开发人员、应用程序所有者 |
设置连接器。 | 使用您创建的 Amazon S3 存储桶设置连接器。有关说明,请参阅 AWS Transform 文档中的设置连接器。出现提示时,输入 Amazon S3 存储桶中 aws-mainframe-modernization-carddemo zip 文件的路径。 等待分析完成。
| 应用程序开发人员、应用程序所有者 |
转换代码。 | 根据 AWS Transform 文档中分析代码中的说明查看代码分析的结果。 根据文档中重构代码中的说明重构大型机代码。 AWS Transform 对于示例 CardDemo 大型机应用程序,您可以接受默认设置。 等待重构完成。 选择查看结果以查看 Amazon S3 存储桶中重构代码的路径。记下此文件路径。您将在以后需要它。
| 应用程序开发人员、应用程序所有者 |
| Task | 说明 | 所需技能 |
|---|
更新模板。 | 输入以下命令将大型机转换 E2E 存储库克隆到您的本地工作站: git clone https://github.com/aws-samples/sample-mainframe-transformation-e2e.git
输入以下命令检索您当前的公共 IP 地址: curl checkip.amazonaws.com
输入以下命令导航到 infra 目录: cd mainframe-transformation-e2e/infra
打开 variables.tf 文件。 将 YOUR_IP_ADDRESS_HERE 替换为您的 IP 地址。 如果有公共托管区,请执行以下操作: 将 hosted_zone_name 替换为您的托管区名称。 将 hosted_zone_enabled 设置为 true。
如果没有公共托管区,请执行以下操作: 输入以下命令生成自签名证书。 openssl genrsa 2048 > my-private-key.pem
openssl req -new -x509 -nodes -sha256 -days 365 -key my-private-key.pem -outform PEM -out my-certificate.pem
输入以下命令将证书导入 AWS Certificate Manager (ACM): aws acm import-certificate \
--certificate fileb://my-certificate.pem \
--private-key fileb://my-private-key.pem
此命令的输出包含导入证书的 Amazon 资源名称(ARN)。 将 self_signed_cert_arn 替换为证书的 ARN。 将 hosted_zone_enabled 设置为 false。
将aws_region 更改为目标区域。默认值为 us-east-1。 保存并关闭 variables.tf 文件。
| 常规 AWS、AWS 管理员 |
部署基础设施。 | 输入以下命令初始化 Terraform: terraform init
输入以下命令生成执行计划: terraform plan
审查计划,并验证将要创建的资源和基础设施组件。 输入以下命令部署基础设施: terraform apply
出现提示时,输入是确认部署。 请等待部署完成。
| Terraform |
| Task | 说明 | 所需技能 |
|---|
安装所需软件: | 使用连接到您的 Amazon EC2 实例AWS Systems Manager Session Manager。 输入以下命令切换到根用户: sudo su -
输入以下命令导航到 scripts 目录: cd /opt/scripts
查看 install_software.sh 脚本。此脚本安装 Java 17、Apache Maven 和 Apache Tomcat 10.0.23。 根据使用案例需要更新脚本。 输入以下命令将脚本设置为可执行: chmod +x install_software.sh
输入以下命令运行脚本: ./install_software.sh
| 应用程序开发人员、迁移工程师 |
验证软件安装。 | 输入以下命令启动 Tomcat 服务器: /opt/tomcat/apache-tomcat-10.0.23/bin/startup.sh
输入以下命令验证 Web 服务器响应: curl http://localhost:8080
输出应确认 Tomcat 正在提供 HTML 页面。
| 应用程序开发人员、迁移工程师 |
| Task | 说明 | 所需技能 |
|---|
下载并解压生成的代码。 | 输入以下命令将 download_and_extract.sh 脚本设置为可执行。此脚本下载存储在 Amazon S3 存储桶中的重构代码和 Gapwalk 运行时库: chmod +x /opt/scripts/download_and_extract.sh
输入以下命令运行 脚本。将 <file_path> 替换为 Amazon S3 存储桶中 generated.zip 文件的路径: ./download_and_extract.sh <file_path>
文件路径通常为 s3://<bucket-name>/transform_output/<aws_transform_job_id>/codetransformation/generated.zip。 输入以下命令导航至 shared 文件夹: cd /opt/runtime/velocity/shared
输入以下命令复制 deploy-velocity-runtime.sh 脚本: cp /opt/scripts/deploy-velocity-runtime.sh .
输入以下命令将复制的脚本设置为可执行: chmod +x deploy-velocity-runtime.sh
输入以下命令运行 脚本。此脚本将项目对象模型(POM)文件中的所有必要 Web 应用程序存档(WAR)依赖项复制到存储库文件夹中: ./deploy-velocity-runtime.sh
检查是否不存在错误,且所需的 WAR 依赖项是否已安装在本地 Maven 存储库中,从而验证执行是否成功。
| 应用程序开发人员、迁移工程师 |
构建现代化的应用程序。 | 输入以下命令导航到 app-pom 项目目录: cd /opt/codebase/app-pom/
输入以下命令安装 Maven: mvn clean install
等待软件安装和构建完成。 为 CardDemo 应用程序运行此命令时,您可能会遇到该app-web项目的警告消息。可以安心地忽略这些警告。 构建成功完成后,确认存在 app-service/target/app-service-1.0.0.war 和 app-web/target/app-web-1.0.0.war。 请勿在此阶段重新启动 Tomcat 服务器。由于缺少必要的数据库,会导致错误。必须先设置数据库,然后才能重新启动服务器。
| 应用程序开发人员、迁移工程师 |
| Task | 说明 | 所需技能 |
|---|
创建数据库和 JICS 架构。 | 输入以下命令将 csd commands 文件夹重命名为 csd_commands。这将移除文件夹名称中的空格: mv /opt/codebase/extra/csd\ commands/ /opt/codebase/extra/csd_commands
输入以下命令导航到 scripts 目录: cd /opt/scripts
输入以下命令将数据库迁移脚本设置为可执行: chmod +x database_migration_setup.sh
输入以下命令配置下述变量作为参数: RDS_ENDPOINT=<database_endpoint>
SECRET_NAME=<secret_name>
JICS_SQL_SCRIPT_DIR=/opt/runtime/velocity/jics/sql/jics.sql
INIT_JICS_SQL_SCRIPT_DIR=/opt/codebase/extra/csd_commands/sql/aws-mainframe-modernization-carddemo-main/app/csd/initJics.sql
其中: 输入以下命令运行数据库迁移脚本: ./database_migration_setup.sh $RDS_ENDPOINT $SECRET_NAME $JICS_SQL_SCRIPT_DIR $INIT_JICS_SQL_SCRIPT_DIR
输入以下命令以从您的 Amazon EC2 实例连接到数据库: psql -h <Your Amazon RDS Endpoint> -U foo -p 5432 postgres
出现提示时,输入您的数据库凭证。
| 应用程序开发人员、迁移工程师 |
验证数据库创建。 | 输入以下命令查看所有数据库: \l
输入以下命令切换至 jics 数据库: \c jics
输入以下命令查看所创建表的列表: \dt
| 应用程序开发人员、迁移工程师 |
将数据迁移到 JICS 数据库。 | 输入以下命令将 execute_listcat_sql.sh 脚本设置为可执行: chmod +x execute_listcat_sql.sh
输入以下命令配置 PATH_TO_LISTCAT_SQL_FILES 变量(包含 LISTCAT SQL 文件的目录): PATH_TO_LISTCAT_SQL_FILES=/opt/codebase/extra/listcat/sql/cluster/aws-mainframe-modernization-carddemo-main/app/catlg
确保按照前面的说明正确设置 RDS_ENDPOINT、SECRET_NAME 和 PATH_TO_LISTCAT_SQL_FILES 变量。 输入以下命令运行 execute_listcat_sql.sh 脚本: ./execute_listcat_sql.sh $RDS_ENDPOINT $SECRET_NAME $PATH_TO_LISTCAT_SQL_FILES
此脚本更新 JICS 数据库中的 VSAM 文件属性,并运行必要的查询来修改数据库。
| 应用程序开发人员、迁移工程师 |
| Task | 说明 | 所需技能 |
|---|
在 Amazon EC2 实例上安装现代化的应用程序。 | 输入以下命令将 application_installer.sh 脚本设置为可执行: chmod +x /opt/scripts/application_installer.sh
输入以下命令配置下述变量作为参数: RDS_ENDPOINT=<database_endpoint>
SECRET_NAME=<secret_name>
AIX_JSON_FILE_PATH=/opt/codebase/extra/csd_commands/json/aws-mainframe-modernization-carddemo-main/jicsFileAix.json
LISTCAT_JSON_FILES_DIR=/opt/codebase/extra/listcat/json/cluster/default/aws-mainframe-modernization-carddemo-main/app/catlg
S3_PATH_FOR_EBCDIC_DATA_FILES=s3://<bucket_name>/transform-output/<job_id>/inputs/aws-mainframe-modernization-carddemo-main/app/data/EBCDIC
其中: <database_endpoint> 是您通过 Terraform 部署的 Amazon RDS 数据库的端点。
<secret_name>是你通过 Terraform 部署的 AWS Secrets Manager 密钥的名称。
<bucket_name> 是包含现代化应用程序的 Amazon S3 存储桶的名称。
<job_id>是 AWS Transform 任务的 ID。
输入以下命令运行 application_installer.sh 脚本: ./application_installer.sh $RDS_ENDPOINT $SECRET_NAME $AIX_JSON_FILE_PATH $LISTCAT_JSON_FILES_DIR $S3_PATH_FOR_EBCDIC_DATA_FILES
在/opt/tomcat/apache-tomcat-10.0.23/workingdir/config文件夹中的 application-utility-pgm.yml 文件中,将编码参数更改为以下内容: encoding : CP1047
| 应用程序开发人员、云架构师 |
重新启动 Tomcat 服务器。 | 输入以下命令导航到工作目录: cd /opt/tomcat/apache-tomcat-10.0.23/workingdir
输入以下命令停止并启动 Tomcat 服务器: /opt/tomcat/apache-tomcat-10.0.23/bin/shutdown.sh
/opt/tomcat/apache-tomcat-10.0.23/bin/startup.sh
输入以下命令监控 Tomcat 服务启动日志: tail -f /opt/tomcat/apache-tomcat-10.0.23/logs/catalina.out
| 应用程序开发人员、云架构师 |
迁移 VSAM 数据集。 | 打开亚马逊 EC2 控制台。 在导航窗格中,选择 Load Balancers (负载均衡器)。 选择通过 Terraform 创建的负载均衡器。 找到应用程序负载均衡器的域名系统(DNS)名称,例如 application-load-balancer-<id>.<region>.elb.amazonaws.com。 在浏览器中,导航到 http://<dns_name>/gapwalk-application/scripts/data-load,其中 <dns_name> 是应用程序负载均衡器的 DSN 名称。这将启动数据加载脚本。 等待脚本完成。完成后,浏览器将显示完成。 在 Amazon EC2 实例上,打开一个新的终端。 输入以下命令连接到 Amazon RDS 数据库,并将 <database_endpoint> 替换为您的值: psql -h <database_endpoint> -U foo -p 5432 postgres
出现提示时,输入您的凭证以连接至数据库。 输入以下命令查看所有数据库: \l
输入以下命令切换至 bluesam 数据库: \c bluesam
输入以下命令查看所创建表的列表: \dt
输入以下命令验证数据加载: SELECT * FROM public.aws_m2_carddemo_usrsec_vsam_ksds;
输出应显示返回的 10 条记录。
| 应用程序开发人员、迁移工程师 |
更新 Groovy 脚本中的参数。 | 输入以下命令导航到脚本目录: cd /opt/tomcat/apache-tomcat-10.0.23/webapps/workingdir/scripts
在所有包含对平面文件引用内容的 Groovy 文件中,更新以下文件配置: 有关参考,请参阅代码存储库中的 DUSRSECJ.jcl.groovy 脚本示例。 保存并关闭文件。
| 应用程序开发人员 |
| Task | 说明 | 所需技能 |
|---|
测试现代化的应用程序。 | 通过应用程序负载均衡器(http://<your-load-balancer-dns>)或托管区(https://myhostedzone.dev/)访问在线应用程序。 对于事务 ID,输入 CC00。 对于用户名,输入 USER0001。 对于密码,输入 PASSWORD。 成功登录后,主菜单将显示。
| 应用程序开发人员、测试工程师 |
验证批处理脚本。 | 通过应用程序负载均衡器(http://<your-load-balancer-dns>/gapwalk-application/scripts)或托管区(https://myhostedzone.dev/gapwalk-application/scripts)访问脚本界面。 选择要运行的脚本,例如 DUSRSECJ.jcl.groovy 脚本。 验证脚本是否运行成功。以下为成功执行后的输出示例。 { "exitCode": 0, "stepName": "STEP03", "program": "IDCAMS", "status": "Succeeded" }
| 应用程序开发人员、测试工程师 |
| Task | 说明 | 所需技能 |
|---|
准备删除基础设施。 | 输入以下命令从 Amazon RDS 实例中移除删除保护: aws rds modify-db-instance \
--db-instance-identifier <your-db-instance-name> \
--no-deletion-protection \
--apply-immediately
输入以下命令从应用程序负载均衡器中移除删除保护: aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn <your-load-balancer-arn> \
--attributes Key=deletion_protection.enabled,Value=false
输入以下命令删除 Amazon S3 存储桶的内容: ACCOUNT_NUMBER=$(aws sts get-caller-identity --query Account --output text)
aws s3 rm s3://mf-carddemo-$ACCOUNT_NUMBER --recursive
aws s3 rm s3://mf-carddemo-logs-$ACCOUNT_NUMBER --recursive
| 常规 AWS |
删除基础设施。 | 这些步骤将永久删除您的资源。在继续之前,请确保您已备份所有重要数据。 输入以下命令导航至 infra 文件夹: cd /mainframe-transformation-e2e/infra
输入以下命令删除基础设施: terraform destroy --auto-approve
| 常规 AWS |
问题排查
| 问题 | 解决方案 |
|---|
Terraform 身份验证 | 确保正确配置了 AWS 凭据。 确认您选择了正确的 AWS 配置文件。 确认您拥有必要的权限。
|
Tomcat 相关错误 | 检查 /opt/tomcat/apache-tomcat-10.0.23/logs 中的 catalina.out,查看是否有任何异常。 输入以下命令将 Tomcat 文件夹的所有权更改为 Tomcat 用户: chown -R tomcat:tomcat /opt/tomcat/*
|
URL 名称未加载 | 确保在入站规则中,应用程序负载均衡器安全组将您的 IP 地址作为源。 |
Tomcat 日志中存在身份验证问题 | 确认中的数据库密钥密码 AWS Secrets Manager 和 server.xml 中的密码匹配。 |
相关资源
AWS 规范性指导
AWS 服务文档
AWS 博客文章