亚马逊AWS官方博客

AWS App2Container – 一款面向Java与.NET应用程序的新型容器化工具

我们的客户正在越来越多地使用容器无服务器技术来开发其新应用程序,并使用现代化的持续集成和交付 (CI/CD) 工具来自动化软件交付生命周期。他们还维护大量手动或使用旧版系统构建和管理的现有应用程序。使用不同工具维护这两套应用程序会增加运营开销,并减慢交付新业务功能的速度。他们希望尽可能地标准化现有和新应用程序之间的管理工具和 CI/CD 流程,并希望将现有应用程序打包到容器中的选项作为实现该目标的第一步。

但是,对现有应用程序进行容器化需要执行一长串手动任务,例如识别应用程序依赖项、编写 dockerfiles 以及为每个应用程序设置构建和部署过程。这些手动任务很耗时,容易出错,并且可能减慢现代化工作的速度。

今天,我们将推出 AWS App2Container,这是一个新的命令行工具,可帮助在 Amazon Elastic Compute Cloud (EC2) 或其他云中容器化本地运行的现有应用程序,而无需更改任何代码。App2Container 会发现服务器上运行的应用程序,识别其依赖项,并生成相关构件以无缝部署到 Amazon ECSAmazon EKS。它还提供与 AWS CodeBuildAWS CodeDeploy 的集成,从而能够以可重复的方式构建和部署容器化应用程序。

AWS App2Container 为每个应用程序组件生成以下构件:应用程序构件,例如应用程序文件/文件夹、Dockerfile、Amazon Elastic Container Registry (ECR) 中的容器映像、ECS 任务定义、Kubernetes 部署 YAML、用于将应用程序部署到 Amazon ECS 或 EKS 的 CloudFormation 模板,以及用于在 AWS Codepipeline 中设置构建/发布管道的模板,AWS Codepipeline 也利用 AWS CodeBuild 和 CodeDeploy。

从今天开始,您可以使用 App2Container 容器化以下应用程序:在 Windows 上的 IIS 7.5+ 中运行的 ASP.NET (.NET 3.5+) Web 应用程序,以及在 Linux 上运行的 Java 应用程序(独立的 JBoss、Apache Tomcat 和常规 Java 应用程序,例如 Spring Boot、IBM WebSphere、Oracle WebLogic 等)。

通过使用容器对现有应用程序进行现代化改造,可以使它们变得可移植,提高开发敏捷性,标准化 CI/CD 流程并降低运营成本。现在我们来看它的工作原理。

AWS App2Container – 入门
AWS App2Container 要求在托管应用程序的服务器上安装以下必备组件:AWS Command Line Interface (CLI) 版本 1.14 或更高版本、Docker 工具以及 Powershell 5.0+(对于 ASP.NET,针对在 Windows 上运行的应用程序)。此外,您需要提供 App2Container 适当的 IAM 权限才能与 AWS 服务进行交互。

例如,让我们看看如何容器化现有的 Java 应用程序。App2Container CLI for Linux 打包为 tar.gz 存档。该文件为用户提供了一个安装 App2Container CLI 的交互式 Shell 脚本 install.sh。运行脚本可指导用户完成安装步骤,并更新用户的路径,以包括 App2Container CLI 命令。

首先,可以使用 init 命令在已安装的 App2Container CLI 服务器上运行一次性初始化。

$ sudo app2container init
Workspace directory path for artifacts[default:  /home/ubuntu/app2container/ws]:
AWS Profile (configured using 'aws configure --profile')[default: default]:  
Optional S3 bucket for application artifacts (Optional)[default: none]: 
Report usage metrics to AWS? (Y/N)[default: y]:
Require images to be signed using Docker Content Trust (DCT)? (Y/N)[default: n]:
Configuration saved

这将设置一个工作区来存储应用程序容器化构件(至少 20GB 的可用磁盘空间)。您可以使用配置为使用 AWS 服务的AWS配置文件将它们提取到 Amazon Simple Storage Service (S3) 存储桶中。

接下来,您可以使用清单命令查看在应用程序服务器上运行的 Java 进程。每个 Java 应用程序进程都有一个唯一的标识符(例如java-tomcat-9e8e4799),它是应用程序 ID。您可以使用此 ID 参阅使用其他 App2Container CLI 命令的应用程序。

$ sudo app2container inventory
{
    "java-jboss-5bbe0bec": {
        "processId": 27366,
        "cmdline": "java ... /home/ubuntu/wildfly-10.1.0.Final/modules org.jboss.as.standalone -Djboss.home.dir=/home/ubuntu/wildfly-10.1.0.Final -Djboss.server.base.dir=/home/ubuntu/wildfly-10.1.0.Final/standalone ",
        "applicationType": "java-jboss"
    },
    "java-tomcat-9e8e4799": {
        "processId": 2537,
        "cmdline": "/usr/bin/java ... -Dcatalina.home=/home/ubuntu/tomee/apache-tomee-plume-7.1.1 -Djava.io.tmpdir=/home/ubuntu/tomee/apache-tomee-plume-7.1.1/temp org.apache.catalina.startup.Bootstrap start ",
        "applicationType": "java-tomcat"
    }
}

在具有 IIS 7.0 或更高版本的 Windows Server 的管理员运行 PowerShell 会话上,您也可以初始化 ASP.NET 应用程序。请注意,Windows Server 2016 和更高版本提供了 Docker 工具和容器支持。您可以选择在安装了 Docker 工具的应用程序服务器上运行所有 app2container 操作,或者通过优化 Amazon ECS 的 Windows Server AMI 将工作机与Docker 工具结合使用。

PS> app2container inventory
{
    "iis-smarts-51d2dbf8": {
        "siteName": "nopCommerce39",
        "bindings": "http/*:90:",
        "applicationType": "iis"
    }
}

清单命令显示可以容器化的应用程序服务器上的所有 IIS 网站。每个 IIS 网站进程都有一个唯一的标识符(例如 iis-smarts-51d2dbf8),即应用程序 ID。您可以使用此 ID 参阅使用其他 App2Container CLI 命令的应用程序。

您可以通过参考特定应用程序的应用程序 ID 来选择该应用程序,并使用 analyze 命令为该应用程序生成分析报告。

$ sudo app2container analyze --application-id java-tomcat-9e8e4799
Created artifacts folder /home/ubuntu/app2container/ws/java-tomcat-9e8e4799
Generated analysis data in /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/analysis.json
Analysis successful for application java-tomcat-9e8e4799
Please examine the same, make appropriate edits and initiate containerization using "app2container containerize --application-id java-tomcat-9e8e4799"

您可以使用应用程序分析生成的 analysis.json 模板,收集已分析应用程序的相关信息,以帮助您从 analysisInfo 部分识别所有系统依赖项,并更新容器化参数,以使用 containerParameters 部分来自定义为应用程序生成的容器映像。

$ cat java-tomcat-9e8e4799/analysis.json
{
    "a2CTemplateVersion": "1.0",
	"createdTime": "2020-06-24 07:40:5424",
    "containerParameters": {
        "_comment1": "*** EDITABLE: The below section can be edited according to the application requirements.Please see the analyisInfo section below for deetails discoverd regarding the application. ***",
        "imageRepository": "java-tomcat-9e8e4799",
        "imageTag": "latest",
        "containerBaseImage": "ubuntu:18.04",
        "coopProcesses": [ 6446, 6549, 6646]
    },
    "analysisInfo": {
        "_comment2": "*** NON-EDITABLE: Analysis Results ***",
        "processId": 2537
        "appId": "java-tomcat-9e8e4799",
		"userId": "1000",
        "groupId": "1000",
        "cmdline": [...],
        "os": {...},
        "ports": [...]
    }
}

另外,您可以运行 $ app2container extract --application-id java-tomcat-9e8e4799 命令,为已分析的应用程序生成应用程序存档。这取决于先前在应用程序的工作区文件夹中生成的 analysis.json 文件,并遵守其中指定的任何容器化参数更新。通过使用 extract 命令,您可以在应用程序服务器上运行第一组命令后,继续在工作机上运行工作流。

现在,您可以容器化为所选应用程序命令生成的 Docker 映像。

$ sudo app2container containerize --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Extracted container artifacts for application
Entry file generated
Dockerfile generated under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated dockerfile.update under /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/Artifacts
Generated deployment file at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json
Containerization successful.Generated docker image java-tomcat-9e8e4799
You're all set to test and deploy your container image.

Next Steps:
1.View the container image with \"docker images\" and test the application.
2.When you're ready to deploy to AWS, please edit the deployment file as needed at /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/deployment.json.
3.Generate deployment artifacts using app2container generate app-deployment --application-id java-tomcat-9e8e4799

使用此命令,可以在运行容器化命令的机器上使用 Docker 映像查看生成的容器映像。您可以使用 docker run 命令启动容器并测试应用程序功能。

请注意,除了生成容器映像之外,containerize 命令还会生成一个 deployment.json 模板文件,您可以将其与下一个 generate-appdeployment 命令结合使用。您可以在 deployment.json 模板文件中编辑参数,以更改要在 Amazon ECR 中注册的映像存储库名称、ECS 任务定义参数或 Kubernetes 应用程序名称。

$ cat java-tomcat-9e8e4799/deployment.json
{
       "a2CTemplateVersion": "1.0",
       "applicationId": "java-tomcat-9e8e4799",
       "imageName": "java-tomcat-9e8e4799",
       "exposedPorts": [
              {
                     "localPort": 8090,
                     "protocol": "tcp6"
              }
       ],
       "environment": [],
       "ecrParameters": {
              "ecrRepoTag": "latest"
       },
       "ecsParameters": {
              "createEcsArtifacts": true,
              "ecsFamily": "java-tomcat-9e8e4799",
              "cpu": 2,
              "memory": 4096,
              "dockerSecurityOption": "",
              "enableCloudwatchLogging": false,
              "publicApp": true,
              "stackName": "a2c-java-tomcat-9e8e4799-ECS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              },
              "gMSAParameters": {
                     "domainSecretsArn": "",
                     "domainDNSName": "",
                     "domainNetBIOSName": "",
                     "createGMSA": false,
                     "gMSAName": ""
              }
       },
       "eksParameters": {
              "createEksArtifacts": false,
              "applicationName": "",
              "stackName": "a2c-java-tomcat-9e8e4799-EKS",
              "reuseResources": {
                     "vpcId": "",
                     "cfnStackName": "",
                     "sshKeyPairName": ""
              }
       }
 }

此时,生成构件的应用程序工作区将用作迭代沙箱。您可以选择编辑此处生成的 Dockerfile 来更改其应用程序,并根据需要使用 docker build 命令构建新的容器映像。您可以使用 generate-deployment 命令生成在 Amazon EKS 中部署应用程序容器所需的构件。

$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
EKS Cloudformation templates and additional deployment artifacts generated successfully for application java-tomcat-9e8e4799

You're all set to use AWS Cloudformation to manage your application stack.
Next Steps:
1.Edit the cloudformation template as necessary.
2.Create an application stack using the AWS CLI or the AWS Console.AWS CLI command:

       aws cloudformation deploy --template-file /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml --capabilities CAPABILITY_NAMED_IAM --stack-name java-tomcat-9e8e4799

3.Setup a pipeline for your application stack:

       app2container generate pipeline --application-id java-tomcat-9e8e4799

此命令基于在运行 containerize 命令过程中生成的 deployment.json 模板文件工作。App2Container 现在还将生成 ECS/EKS cloudformation 模板,并提供部署这些堆栈的选项。

该命令会将容器映像注册到用户指定的 ECR 存储库,为 Amazon ECS 和 EKS 部署生成 cloudformation 模板。您可以在 Amazon ECS 上注册 ECS 任务定义,并使用 kubectl 通过 App2Container 生成的 amazon-eks-master.template.deployment.yaml 在现有 Amazon EKS 或自行管理的 kubernetes 集群上启动容器化应用程序。

或者,您可以通过 --deploy 选项直接将容器化的应用程序部署到 Amazon EKS 中。

$ sudo app2container generate app-deployment --application-id java-tomcat-9e8e4799 --deploy
AWS pre-requisite check succeeded
Docker pre-requisite check succeeded
Created ECR Repository
Uploaded Cloud Formation resources to S3 Bucket: none
Generated Cloud Formation Master template at: /home/ubuntu/app2container/ws/java-tomcat-9e8e4799/EksDeployment/amazon-eks-master.template.yaml
Initiated Cloudformation stack creation.This may take a few minutes.Please visit the AWS Cloudformation Console to track progress.
Deploying application to EKS

使用Windows 身份验证处理 ASP.NET 应用程序
ASP.NET 应用程序的容器化几乎与 Java 应用程序相同,但是 Windows 容器不能直接加入域。但是,它们仍然可以使用 Active Directory (AD) 域身份来支持各种身份验证方案。

App2Container 会检测站点是否正在使用 Windows 身份验证,并相应地使 IIS 站点的应用程序池作为网络服务标识运行,并为经 Windows 身份验证的 IIS 应用程序生成新的 cloudformation 模板。这些模板负责创建 gMSA 和 AD Security 组,加入域 ECS 节点,并使容器使用此 gMSA。

此外,它提供了两个 PowerShell 脚本作为 $ app2container containerize 命令的输出以及有关其使用方法的说明文件。

以下是示例输出:

PS C:\Windows\system32> app2container containerize --application-id iis-SmartStoreNET-a726ba0b
Running AWS pre-requisite check...
Running Docker pre-requisite check...
Container build complete.Please use "docker images" to view the generated container images.
Detected that the Site is using Windows Authentication.
Generating powershell scripts into C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts required to setup Container host with Windows Authentication
Please look at C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b\Artifacts\WindowsAuthSetupInstructions.md for setup instructions on Windows Authentication.
A deployment file has been generated under C:\Users\Admin\AppData\Local\app2container\iis-SmartStoreNET-a726ba0b
Please edit the same as needed and generate deployment artifacts using "app2container generate-deployment"

第一个 PowerShell 脚本 DomainJoinAddToSecGroup.ps1 加入容器主机,并将其添加到 Active Directory 安全组。第二个脚本 CreateCredSpecFile.ps1 创建一个组托管服务帐户 (gMSA),授予对 Active Directory 安全组的访问权限,生成该 gMSA 的凭据规范,并将其本地存储在容器主机上。您可以在 ECS 主机上执行这些 PowerShell 脚本。以下是脚本的使用示例:

PS C:\Windows\system32> .\DomainJoinAddToSecGroup.ps1 -ADDomainName Dominion.com -ADDNSIp 10.0.0.1 -ADSecurityGroup myIISContainerHosts -CreateADSecurityGroup:$true
PS C:\Windows\system32> .\CreateCredSpecFile.ps1 -GMSAName MyGMSAForIIS -CreateGMSA:$true -ADSecurityGroup myIISContainerHosts

在执行 app2container generate-deployment 命令之前,请编辑 deployment.json 文件,将 dockerSecurityOption 的值更改为 CreateCredSpecFile 脚本生成的 CredentialSpec 文件的名称。例如:
"dockerSecurityOption": "credentialspec:file://dominion_mygmsaforiis.json"

实际上,站点容器内的 IIS 服务器对网络资源的任何访问现在都将使用上述 gMSA 进行身份验证。最后一步是在 IIS 服务器将访问的网络资源上授权此 gMSA 帐户。一个常见的示例是在 SQL Server 中授权此 gMSA。

最后,如果应用程序必须连接到数据库才能正常运行,并且您在 Amazon ECS 中运行该容器,请确保通过该工具生成的 Docker 映像创建的应用程序容器连接同一数据库。您可以参考此文档以了解有关迁移的选项:在 AWS 上将 MS SQL 从Windows 迁移到 Linux数据库迁移服务,以及将 MS SQL Server 备份和还原到 Amazon RDS

现已推出!
免费提供 AWS App2Container。您仅需根据使用情况,为实际使用的 AWS服务(如Amazon EC2、ECS、EKS 和 S3 等)付费。有关详细信息,请参阅 App2Container常见问题文档。试一下,然后请通过您平常的 AWS Support 联系人在 ECS 的 AWS 论坛EKS 的 AWS 论坛上或 Github 的容器路线图上向我们发送反馈。

Channy