

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 AWS App2Container 將內部部署 Java 應用程式遷移至 AWS
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container"></a>

*Dhananjay Karanjkar，Amazon Web Services*

## 總結
<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)。

此模式提供透過工作者機器使用 App2Container 將部署在應用程式伺服器上的內部部署 Java 應用程式遠端遷移至 AWS Fargate 或 Amazon EKS 的步驟。 

工作者機器可用於下列使用案例：
+ 執行 Java 應用程式的應用程式伺服器上不允許或無法使用 Docker 安裝。
+ 您必須管理部署在不同實體或虛擬伺服器上的多個應用程式的遷移。

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

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

**先決條件**
+ 在 Linux 伺服器上執行 Java 應用程式的應用程式伺服器
+ 具有 Linux 作業系統的工作者機器
+ 具有至少 20 GB 可用磁碟空間的工作者機器

**限制**
+ 並非所有應用程式都受到支援。如需詳細資訊，請參閱 [Linux 支援的應用程式](https://docs.aws.amazon.com/app2container/latest/UserGuide/supported-applications.html)。

## Architecture
<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_tw/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 Elastic Compute Cloud (Amazon EC2) 執行個體的伺服器或叢集。使用 Fargate，就不再需要佈建、設定或擴展虛擬機器的叢集來執行容器。

## 史詩
<a name="migrate-on-premises-java-applications-to-aws-using-aws-app2container-epics"></a>

### 設定登入資料
<a name="set-up-credentials"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 建立秘密以存取應用程式伺服器。 | 若要從工作者機器遠端存取應用程式伺服器，請在 AWS Secrets Manager 中建立秘密。對於您的秘密，您可以使用 SSH 私有金鑰或憑證和 SSH 私有金鑰。如需詳細資訊，請參閱[管理 AWS App2Container 的秘密](https://docs.aws.amazon.com/app2container/latest/UserGuide/manage-secrets.html)。 | DevOps、開發人員 | 

### 設定工作者機器
<a name="set-up-the-worker-machine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 安裝 tar 檔案。 | 執行 `sudo yum install -y tar`。 | DevOps、開發人員 | 
| 安裝 AWS CLI。 | 若要安裝 Amazon Command Line Interface (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_tw/prescriptive-guidance/latest/patterns/migrate-on-premises-java-applications-to-aws-using-aws-app2container.html)<br />執行 `sudo app2container init`。 | DevOps、開發人員 | 

### 設定工作者機器
<a name="configure-the-worker-machine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 將工作者機器設定為遠端連線，並在應用程式伺服器上執行 App2Container 命令。 | 若要設定工作者機器，需要下列資訊：[See the AWS documentation website for more details](http://docs.aws.amazon.com/zh_tw/prescriptive-guidance/latest/patterns/migrate-on-premises-java-applications-to-aws-using-aws-app2container.html)<br />執行 `sudo app2container remote configure`。 | DevOps、開發人員 | 

### 在工作者機器上探索、分析和擷取應用程式
<a name="discover-analyze-and-extract-applications-on-the-worker-machine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 探索內部部署 Java 應用程式。 | 若要遠端探索應用程式伺服器上執行的所有應用程式，請執行下列命令。<br />`sudo app2container remote inventory --target <FQDN/IP of App server>`<br />此命令會在 中產生已部署應用程式的清單`inventory.json`。 | DevOps 開發人員 DevOps | 
| 分析探索到的應用程式。 | 若要使用庫存階段中取得的應用程式 ID 遠端分析每個應用程式，請執行下列命令。<br />`sudo app2container remote analyze --application-id <java-app-id> --target <FQDN/IP of App Server>`<br />這會在工作區位置產生`analysis.json`檔案。產生此檔案後，您可以根據您的需求修改容器化參數。 | DevOps 開發人員 DevOps | 
| 擷取已分析的應用程式。 | 若要為分析的應用程式產生應用程式封存，請遠端執行下列命令，這會在工作區位置產生 tar 套件。<br />`sudo app2container remote extract --application-id <application id> --target <FQDN/IP of App Server>`<br />擷取的成品可以在本機工作者機器上產生。 | DevOps 開發人員 DevOps | 

### 在工作者機器上容器化擷取的成品
<a name="containerize-the-extracted-artifacts-on-the-worker-machine"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 容器化擷取的成品。 | 執行下列命令，將上一個步驟中擷取的成品容器化。<br />`sudo app2container containerize --input-archive <tar bundle location on worker machine>` | DevOps 開發人員 DevOps | 
| 完成目標。 | 若要完成目標，請開啟 `deployment.json`在`containerize`命令執行時建立的 。若要指定 AWS Fargate 做為目標，請將 `createEcsArtifacts`設定為 `true`。若要將 Amazon EKS 設定為目標，請將 `createEksArtifacts` 設為 true。 | DevOps 開發人員 DevOps | 

### 產生和佈建 AWS 成品
<a name="generate-and-provision-aws-artifacts"></a>


| 任務 | Description | 所需的技能 | 
| --- | --- | --- | 
| 在工作者機器上產生 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/)