

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

# 使用 AWS App2Container 将本地 Java 应用程序迁移到 AWS
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container"></a>

*Dhananjay Karanjkar，Amazon Web Services*

## Summary
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-summary"></a>

AWS App2Container（A2C）是一款命令行工具，无需更改代码即可帮助将虚拟机上运行的现有应用程序转换至容器。A2C 发现服务器上运行的应用程序、识别依赖项并生成相关构件，以便无缝部署到 Amazon Elastic Container Service (Amazon ECS) 和 Amazon Elastic Kubernetes Service (Amazon EKS)。

此模式提供了通过 Worker 计算机，使用 App2Container 将部署在应用程序服务器上的本地 Java 应用程序远程迁移到 AWS Fargate 或 Amazon EKS 的步骤。 

Worker 计算机可用于以下用例：
+ 运行 Java 应用程序的应用程序服务器上不允许安装 Docker，或者安装 Docker 不可用。
+ 您必须管理部署在不同物理或虚拟服务器上的多项应用程序迁移。

此模式使用 AWS CodeCommit AWS CodePipeline、和 AWS CodeBuild。

## 先决条件和限制
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-prereqs"></a>

**先决条件**
+ Java 应用程序在 Linux 服务器上运行的应用程序服务器
+ 装有 Linux 操作系统的 Worker 计算机
+ 至少有 20 GB 可用磁盘空间的 Worker 计算机

**限制**
+ 并非所有应用程序都受支持。有关更多信息，请参阅[支持的应用程序（适用于 Linux）](https://docs.aws.amazon.com/app2container/latest/UserGuide/supported-applications.html)。

## 架构
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-architecture"></a>

**源技术堆栈**
+ 在 Linux 服务器运行的 Java 应用程序

**目标技术堆栈**
+ AWS CodeBuild
+ AWS CodeCommit
+ AWS CodeDeploy
+ AWS CodePipeline
+ Amazon Elastic Container Registry
+ AWS Fargate

**目标架构**

![AWS 上本地 Java 应用程序的架构。](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/images/pattern-img/61ed65a0-fab2-4fc8-8531-18bfd56a25b3/images/602cde7b-ab0c-46a5-8c37-afe304adf061.png)


 

## 工具
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-tools"></a>

**工具**
+ [AWS App2Container](https://docs.aws.amazon.com/app2container/latest/UserGuide/what-is-a2c.html) – AWS App2Container（A2C）是一款命令行工具，可帮助您直接迁移在本地部署的数据中心或在虚拟机上运行的应用程序，以便它们在由 Amazon ECS 或 Amazon EKS 托管的容器中运行。
+ [AWS CodeBuild](https://docs.aws.amazon.com/codebuild/latest/userguide/welcome.html) — AWS CodeBuild 是一项完全托管的云端构建服务。 CodeBuild 编译您的源代码、运行单元测试并生成可随时部署的工件。
+ [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/welcome.html) — AWS CodeCommit 是一项由 Amazon Web Services 托管的版本控制服务，您可以使用它来私下存储和管理云中的资产（例如文档、源代码和二进制文件）。
+ [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/welcome.html) — AWS CodePipeline 是一项持续交付服务，可用于对发布软件所需的步骤进行建模、可视化和自动化。
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) – Amazon Elastic Container Service (Amazon ECS) 是一项可扩展性高的快速容器管理服务，可用于运行、停止和管理集群上的容器。
+ [Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) – Amazon Elastic Container Registry (Amazon ECR) 是一项 AWS 托管容器映像注册表服务，它安全、可扩展且可靠。
+ [Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/what-is-eks.html) – Amazon Elastic Kubernetes Service (Amazon EKS) 是一项托管服务，可让您在 AWS 上轻松运行 Kubernetes，而无需安装、操作和维护您自己的 Kubernetes 控制面板或节点。
+ [AWS Fargate](https://docs.aws.amazon.com/AmazonECS/latest/userguide/what-is-fargate.html) — AWS Fargate 是一项可以与 Amazon ECS 一起使用的技术，无需管理服务器或亚马逊弹性计算云 (Amazon) 实例集群即可运行容器。 EC2使用 Fargate，您不必再预配置、配置或扩展虚拟机集群即可运行容器。

## 操作说明
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-epics"></a>

### 设置凭证
<a name="set-up-credentials"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 创建访问应用程序服务器的密钥。 | 要从 Worker 计算机远程访问应用程序服务器，请在 AWS Secrets Manager 中创建密钥。对于您的机密，您可以使用 SSH 私有密钥或证书和 SSH 私有密钥。有关更多信息，请参阅[管理 AWS App2Container 的密钥](https://docs.aws.amazon.com/app2container/latest/UserGuide/manage-secrets.html)。 | DevOps，开发者 | 

### 设置 Worker 计算机
<a name="set-up-the-worker-machine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 安装 tar 文件。 | 运行 `sudo yum install -y tar`。 | DevOps，开发者 | 
| 安装 Amazon CLI。 | 要安装 Amazon 命令行界面（AWS CLI），请运行 `curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"`。 <br />解压缩 `awscliv2.zip`。<br />运行 `sudo ./aws/install`。 | DevOps，开发者 | 
| 安装 App2Container。 | 运行以下 命令：<br />`curl -o AWSApp2Container-installer-linux.tar.gz https://app2container-release-us-east-1.s3.us-east-1.amazonaws.com/latest/linux/AWSApp2Container-installer-linux.tar.gz`<br />`sudo tar xvf AWSApp2Container-installer-linux.tar.gz`<br />`sudo ./install.sh` | DevOps，开发者 | 
| 配置这些配置文件。 | 要配置 AWS 默认配置文件，请运行 `sudo aws configure`。<br />要配置已命名的 AWS 默认配置文件，请运行 `sudo aws configure --profile <profile name>`。 | DevOps，开发者 | 
| 安装 Docker。 | 运行以下命令。<br />`sudo yum install -y docker`<br />`sudo systemctl enable docker & sudo systemctl restart docker` |  | 
| 初始化 App2Container。 | 要初始化 App2Container，您需要以下信息：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-on-premises-java-applications-to-aws-using-aws-app2container.html)<br />运行 `sudo app2container init`。 | DevOps，开发者 | 

### 配置 Worker 计算机
<a name="configure-the-worker-machine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 配置 Worker 计算机，以远程连接并在应用程序服务器上运行 App2Container 命令。 | 要配置 Worker 计算机，需要以下信息：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_cn/prescriptive-guidance/latest/patterns/migrate-on-premises-java-applications-to-aws-using-aws-app2container.html)<br />运行 `sudo app2container remote configure`。 | DevOps，开发者 | 

### 发现、分析和提取 Worker 计算机上的应用程序
<a name="discover-analyze-and-extract-applications-on-the-worker-machine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 探索本地 Java 应用程序。 | 要远程发现应用程序服务器上运行的所有应用程序，请运行以下命令。<br />`sudo app2container remote inventory --target <FQDN/IP of App server>`<br />此命令生成 `inventory.json` 中已部署应用程序的列表。 | 开发者， DevOps | 
| 分析所发现的应用程序。 | 要通过使用在清单阶段获得的 application-id 来远程分析每个应用程序，请运行以下命令。<br />`sudo app2container remote analyze --application-id <java-app-id> --target <FQDN/IP of App Server>`<br />这将在工作区位置生成 `analysis.json` 文件。生成此文件后，您可根据需要更改容器化参数。 | 开发者， DevOps | 
| 提取分析的应用程序。 | 要为分析的应用程序生成应用程序存档，请远程运行以下命令，这将在工作区位置生成 tar 包。<br />`sudo app2container remote extract --application-id <application id> --target <FQDN/IP of App Server>`<br />提取的构件可以在本地 Worker 计算机上生成。 | 开发者， DevOps | 

### 在 Worker 计算机上对提取的构件进行容器化
<a name="containerize-the-extracted-artifacts-on-the-worker-machine"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 对提取的构件进行容器化。 | 运行以下命令，将上一步中提取的构件容器化。<br />`sudo app2container containerize --input-archive <tar bundle location on worker machine>` | 开发者， DevOps | 
| 最终确定目标。 | 要最终确定目标，请打开 `containerize` 命令运行时创建的 `deployment.json`。要将 AWS Fargate 指定为目标，请将 `createEcsArtifacts` 设置为 `true`。要将 Amazon EKS 设置为目标，请将 `createEksArtifacts` 设置为 true。 | 开发者， DevOps | 

### 生成和预调配 AWS 构件
<a name="generate-and-provision-aws-artifacts"></a>


| Task | 说明 | 所需技能 | 
| --- | --- | --- | 
| 在 Worker 计算机上生成 AWS 部署项目。 | 要生成部署构件，请运行以下命令。<br />`sudo app2container generate app-deployment --application-id <application id>`<br />这将在工作空间中生成 `ecs-master.yml` AWS CloudFormation 模板。 | DevOps | 
| 预调配构件。 | 要进一步配置生成的项目，请运行以下命令部署 AWS CloudFormation 模板。<br />`aws cloudformation deploy --template-file <path to ecs-master.yml> --capabilities CAPABILITY_NAMED_IAM --stack-name <application id>–ECS` | DevOps | 
| 生成管线。 | 根据您的需求，修改在上一个情节中创建的 `pipeline.json`。然后运行 `generate pipeline` 命令以生成管线部署构件。 | DevOps | 

## 相关资源
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-resources"></a>
+ [什么是 App2Container？](https://docs.aws.amazon.com/app2container/latest/UserGuide/what-is-a2c.html)
+ [AWS App2Container 博客文章](https://aws.amazon.com/blogs/aws/aws-app2container-a-new-containerizing-tool-for-java-and-asp-net-applications/)
+ [AWS CLI 配置基础知识](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html)
+ [Amazon ECS 的 Docker 基本信息](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/docker-basics.html)
+ [Docker 命令](https://docs.docker.com/engine/reference/commandline/cli/)