O blog da AWS

AWS App2Container: Migre seus aplicativos Java e .NET para contêinere

Por Channy Yun, Principal Developer Advocate na AWS

 

Nossos clientes estão cada vez mais desenvolvendo seus novos aplicativos com contêineres e serverless, usando ferramentas modernas de integração e entrega contínua (CI/CD) para automatizar o ciclo de vida e a entrega do software. Eles também mantêm um grande número de aplicações existentes que são criadas e gerenciadas manualmente ou por meio de sistemas legados. A manutenção desses dois grupos de aplicações, com diferentes ferramentas, aumenta o custo operacional e reduz o ritmo de entrega de valor de negócio. Na medida do possível, eles querem ser capazes de padronizar seus processos de CI/CD e usar as ferramentas de gerenciamento em seus aplicativos novos e existentes, e ter a opção de empacotar suas aplicações existentes em contêineres é o primeiro passo para alcançar esse objetivo.

No entanto, migrar aplicações existentes para contêineres requer muitas tarefas manuais, como identificar as suas dependências, escrever Dockerfiles e configurar processos de compilação e implantação para cada aplicação. Essas tarefas manuais são demoradas, propensas a erros e podem dificultar essa modernização.

É por isso que, há alguns meses, lançamos o AWS App2Container, uma nova ferramenta de linha de comando que ajuda você a empacotar seus aplicativos existentes (executados localmente, no Amazon Elastic Compute Cloud (EC2) ou em outras nuvens) sem alterações no código. O App2Container descobre aplicativos em execução em um servidor, identifica suas dependências e gera uma imagem Docker para implantação no Amazon ECS ou no Amazon EKS. Ele também oferece integração com o AWS CodeBuild e o AWS CodeDeploy, permitindo que você crie um processo automatizado para construir e implantar aplicações em contêineres.

O AWS App2Container gera os seguintes artefatos para cada componente de aplicação: artefatos da aplicação (como arquivos ou diretórios), Dockerfiles, imagens de contêiner no Amazon Elastic Container Registry (ECR), task definition do ECS, YAML para implantação no Kubernetes, modelos do CloudFormation para implantar a aplicação no Amazon ECS ou EKS e modelos para configurar um pipeline de build e release usando o AWS CodePipeline, que utiliza o AWS CodeBuild e o CodeDeploy

Você pode usar o App2Container para migrar para contêineres: aplicações Web ASP.NET (.NET 3.5+) em execução no IIS 7.5+/Windows e aplicações Java em execução no Linux com os servidores de aplicação JBoss (standalone), Apache Tomcat, Spring Boot, IBM WebSphere, Oracle WebLogic, etc.

Ao modernizar seus aplicativos existentes usando contêineres, você pode torna-los portáveis, aumentar a agilidade de desenvolvimento, padronizar seus processos de CI/CD e reduzir custos operacionais. Agora vamos ver como funciona!

 

AWS App2Container: introdução

O AWS App2Container exige que os seguintes pré-requisitos sejam instalados nos servidores que hospedam sua aplicação: AWS Command Line Interface (CLI) versão 1.14 ou posterior, Docker, e no caso do ASP.NET, Powershell 5.0+. Além disso, você também deve fornecer as permissões apropriadas do IAM para que o App2Container interaja com os serviços da AWS.

Por exemplo, vejamos como migrar suas aplicações Java existentes para contêineres. A CLI do App2Container para Linux é empacotada como um arquivo tar.gz. O arquivo fornece aos usuários um script shell chamado install.sh para instalá-lo. Executar o script guia o usuário através dos passos da instalação e também atualiza o path do usuário do sistema operacional para incluir os comandos do App2Container.

Primeiramente, execute o processo de inicialização no servidor onde o App2Container CLI está instalado utilizando o comando init.

Bash
 $ 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

Este passo configura um espaço de trabalho (workspace) para armazenar artefatos do processo de transformar a aplicação em contêiner (são necessários, no mínimo 20GB de espaço em disco disponível). Você pode colocar estes artefatos em um bucket do Amazon Simple Storage Service (S3) usando seu profile AWS configurado.

Posteriormente, você pode exibir os processos Java em execução no servidor usando o comando inventory. Cada processo tem um identificador único (por exemplo, java-tomcat-9e8e4799) que é o ID do aplicativo. Você pode usar esse ID para fazer referência ao aplicativo a partir de outros comandos do App2Container CLI.

Bash
$ 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"
}
}

Você também pode inicializar aplicações ASP.NET em uma sessão PowerShell com privilégios de administrador em Windows Servers com IIS versão 7.0 ou superior. Observe que o Docker está disponível apenas no Windows Server 2016 e superior. Você pode escolher executar todas as operações do app2container no servidor de aplicações com Docker instalado ou usar uma instância com Docker instalado com uma AMI do Windows Server otimizada para o Amazon ECS.

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

O comando inventory exibe todos os websites do IIS no servidor de aplicações que podem ser transformados em contêineres. Cada processo de website do IIS tem um identificador único (por exemplo, iis-smarts-51d2dbf8). Você pode usar esse ID para fazer referência ao aplicativo a partir de outros comandos do App2Container CLI.

Você também pode escolher uma aplicação específica ao referenciar o seu ID e gerar um relatório de avaliação de um aplicativo com o comando analyze.

Bash
 $ 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“

Você pode usar o arquivo analysis.json gerado a partir da análise da aplicação para conseguir obter mais informações sobre a aplicação analisada, o que ajuda a identificar todas as dependências do sistema na seção analysisInfo e atualizar parâmetros em containerParameters para personalizar as imagens de container geradas para a aplicação.

Bash
$ 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": {...},

Além disso, você pode executar o comando $app2container extract —application-id java-tomcat-9e8e4799 para gerar um arquivo para a aplicação analisada. Esse processo depende do arquivo analysis.json gerado anteriormente, e respeita qualquer parâmetro definido nele. Ao usar o comando extract você pode continuar o trabalho em outro servidor após executar o primeiro conjunto de comandos no servidor de aplicação.

Agora você pode usar o comando containerize para gerar as imagens Docker para o aplicativo selecionado.

Bash
 $ 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

Usando esse comando você pode ver as imagens de contêiner geradas usando docker images no servidor onde o comando containerize foi executado. O comando docker run pode ser utilizado para executar o contêiner e testar o funcionamento da aplicação.

Observe que além de gerar imagens de container, o comando containerize também gera um arquivo deployment.json que pode ser utilizado com o comando generate-appdeployment Você pode editar os parâmetros no deployment.json para modificar o nome do repositório da imagem a ser registrado no Amazon ECR, os parâmetros da task definition do ECS, ou o nome da aplicação Kubernetes.

Bash
 $ 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": ""
}
}
}

Neste ponto, o espaço de trabalho (workspace) da aplicação onde os artefatos são gerados servem como um ambiente de teste isolado (sandbox). Você pode escolher editar o Dockerfile gerado aqui para fazer mudanças nas aplicações e usar o comando docker build para construir novas imagens de contêiner conforme necessário. Você pode gerar os artefatos necessários para implantar os contêineres no Amazon EKS utilizando generate deployment.

Bash
 $ 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. 
You're all set to test and deploy your container image. 
                                                                                               
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

Este comando funciona com base no arquivo deployment.json gerado ao executar o comando containerize. O App2Container irá gerar os modelos CloudFormation para ECS/EKS, bem como fornecer uma opção para implantá-los.

O comando envia a imagem de contêiner para o repositório ECR especificado pelo usuário, gera o modelo CloudFormation para a implantação no Amazon ECS e EKS. A task definition pode ser registrada no Amazon ECS e podemos usar o kubectl para implantar a aplicação em um cluster existente de Amazon EKS ou kubernetes auto-gerenciado utilizando o arquivo amazona-eks-master.template.deployment.yaml gerado pelo App2Container.

Como alternativa, você pode implantar diretamente no Amazon EKS utilizando a opção --deploy.

Bash
$ 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

 

Gerenciando aplicações ASP.NET com Autenticação do Windows

Transformar aplicações ASP.NET em contêiner é quase o mesmo processo de aplicações Java, mas os containers Windows não podem ingressar diretamente em um domínio. No entanto, identidades de domínio do Active Directory (AD) ainda podem ser usadas para suportar diversos cenários de autenticação.

O App2Container detecta se um site está usando autenticação Windows e faz com que o pool de aplicação de um site IIS seja executado com uma conta de “Serviço de Rede”, e gera os novos modelos CloudFormation para aplicativos IIS autenticados. Todo o processo de criação de uma conta de serviço gerenciado de grupo (gMSA), grupo de segurança do Active Directory (AD), registrar os nodes ECS no domínio e fazer com os contêineres os utilizem, é realizado por estes modelos.

Além disso, ele fornece dois scripts PowerShell como saída do comando $app2container containerize juntamente com um arquivo de instruções sobre como usá-lo.

Segue um exemplo de saída:

Powershell
 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"

O primeiro script PowerShell, DomainJoinAddToSecGroup.ps1, adiciona o host do contêiner em um domínio e grupo de segurança do AD (Active Directory). O segundo script, CreateRedSpecFile.ps1, cria uma conta de serviço gerenciado de grupo (gMSA), concede acesso ao grupo de segurança do Active Directory, gera a especificação de credencial para este gMSA e a armazena localmente no host do contêiner. Você pode executar esses scripts do PowerShell em uma instância do ECS. Veja a seguir um exemplo de uso de scripts:

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

Antes de executar o comando app2container generate-deployment, edite o arquivo deployment.json para alterar o valor de dockerSecurityOption para o nome do arquivo CredentialSpec que o script CreateCredSpecFile gerou. Por exemplo:

dockerSecurityOption:” “credentialspec:file://dominion_mygmsaforiis.json” .

Qualquer acesso a recursos na rede que for realizado pelo servidor IIS dentro do container para o site irá utilizar a gMSApara autenticar. O último passo é autorizar essa conta gMSA nos recursos de rede que serão acessados pelo servidor. Um exemplo comum é autorizar essa gMSA no SQL Server.

Por último, caso sua aplicação precise se conectar a um banco de dados para funcionar e você executar este contêiner no Amazon ECS ou Amazon EKS, certifique-se que o contêinerda aplicação criado a partir da imagem Docker gerado pela ferramenta possui conectividade para este banco de dados. Você pode consultar esta documentação para ver as opções de migração: MS SQL Server do Windows para Linux na AWS, Serviço de Migração de Banco de Dados da AWS e faça backup e restaure seu banco de dados SQL Server para o Amazon RDS.

Disponível para todos os clientes
O AWS App2Container é oferecido gratuitamente. Você paga apenas pelo uso real dos serviços da AWS, como o custo do Amazon EC2, ECS, EKS, S3 com base no seu uso. Para obter mais informações, consulte as Perguntas frequentes e a documentação do App2Container.

 

Este artigo foi traduzido do Blog da AWS em Inglês.

 


Sobre o autor

Channy Yun é Principal Developer Advocate da AWS.

 

 

 

 

 

Sobre o tradutor

Jairo da Silva Junior é Arquitetos de Soluções Sênior da AWS Brasil.