Blog de Amazon Web Services (AWS)

AWS App2Container: migra tus aplicaciones en Java y .NET hacia contenedores

Por Channy Yun, Principal Developer Advocate de AWS

 

Nuestros clientes están desarrollando cada vez más sus nuevas aplicaciones con contenedores y tecnologías serverless, y utilizan herramientas modernas de integración y entrega continua (CI/CD) para automatizar el ciclo de vida y entrega de software. También mantienen una gran cantidad de aplicaciones existentes que se crean y administran manualmente o mediante sistemas legados. El mantenimiento de estos dos conjuntos de aplicaciones con herramientas dispares aumenta la carga operativa y hace más lenta la entrega de nuevas capacidades comerciales. En la medida de lo posible, quieren poder estandarizar sus herramientas de gestión y procesos de CI / CD en sus aplicaciones nuevas y existentes, y ven la opción de empaquetar sus aplicaciones existentes en contenedores como el primer paso para lograr ese objetivo.

Sin embargo, empaquetar aplicaciones existentes requiere hacer muchas tareas manuales; por ejemplo identificar dependencias de las aplicaciones, escribir Dockerfiles y configurar procesos de compilación e implementación para cada aplicación. Estas tareas manuales requieren mucho tiempo, son propensas a errores y pueden hacer más difícil esta modernización.

Es por esto que hace algunos meses lanzamos AWS App2Container, una nueva herramienta de línea de comandos que ayuda a empaquetar dentro de contenedores sus aplicaciones existentes (ejecutadas en sus instalaciones, en Amazon Elastic Compute Cloud (EC2) o en otras nubes) sin necesidad de cambios en el código. App2Container descubre aplicaciones que se ejecutan en un servidor, identifica sus dependencias y genera una imagen de Docker para después implementarla en Amazon ECS o Amazon EKS. También proporciona integración con AWS CodeBuild y AWS CodeDeploy, permitiéndole construir una forma repetible de crear e implementar aplicaciones en contenedores.

AWS App2Container genera los siguientes artefactos para cada componente de la aplicación: artefactos de la aplicación como archivos o carpetas de la aplicación, Dockerfiles, imágenes de contenedor en Amazon Elastic Container Registry (ECR), definiciones de tareas ECS, documentos YAML para implementación en Kubernetes, plantillas de CloudFormation para implementar la aplicación en Amazon ECS o EKS, y plantillas para configurar un pipeline de compilación y lanzamiento a producción usando CodePipeline, que también aprovecha AWS CodeBuild y CodeDeploy.

Puede usar App2Container para empaquetar aplicaciones web ASP.NET (.NET 3.5+) que se ejecutan en IIS 7.5+ en Windows y aplicaciones Java que se ejecutan en Linux: JBoss, Apache Tomcat o Java genéricas como Spring Boot, IBM WebSphere, Oracle WebLogic, etc.

Al modernizar sus aplicaciones existentes usando contenedores, puede convertirlas en portátiles, aumentar la agilidad de sus desarrollos, estandarizar sus procesos de CI/CD y reducir sus costos operativos. ¡Ahora veamos cómo funciona!

 

AWS App2Container: introducción

AWS App2Container requiere que se instalen lo siguiente de forma previa en los servidores que alojan su aplicación: AWS Command Line Interface (CLI) versión 1.14 o posterior, las herramientas de Docker y (en el caso de ASP.NET) Powershell 5.0+. Además, debe proporcionar los permisos de IAM adecuados para que App2Container pueda interactuar con los servicios de AWS.

Por ejemplo, veamos cómo empaquetar sus aplicaciones Java existentes. La CLI de App2Container para Linux está empaquetada como un archivo tar.gz. El archivo proporciona a los usuarios un script llamado install.sh para instalarla. La ejecución del script guía a los usuarios a través de la instalación.

Primero comience ejecutando una inicialización única en el servidor que contiene la aplicación a empaquetar para la CLI de App2Container con el 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

Esto configura un espacio de trabajo para almacenar artefactos del contenedor de aplicaciones (contar con mínimo 20 GB de espacio en disco disponible). Puede extraerlos hacia un bucket de Amazon Simple Storage Service (S3) utilizando su perfil de AWS configurado para usar los servicios de AWS.

A continuación, puede ver los procesos Java que se ejecutan en el servidor de aplicaciones mediante el comando inventory. Cada proceso tiene un identificador único (por ejemplo, java-tomcat-9e8e4799) que es el ID de la aplicación. Puede utilizar este ID para hacer referencia a la aplicación con otros comandos de la CLI de App2Container.

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

También puede inicializar aplicaciones ASP.NET en una sesión de PowerShell ejecutada en Windows con IIS versión 7.0 o posterior. Tenga en cuenta que las herramientas de Docker y la compatibilidad con contenedores están disponibles a partir de Windows Server 2016 y versiones posteriores. Puede seleccionar ejecutar todas las operaciones de app2container en el servidor de aplicaciones con las herramientas de Docker instaladas o utilizar una máquina de trabajo con herramientas de Docker mediante una AMI de Windows Server optimizada para Amazon ECS.

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

El comando inventory muestra todos los sitios web de IIS en el servidor de aplicaciones que se pueden empaquetar. Cada sitio web de IIS tiene un identificador único (por ejemplo, iis-smarts-51d2dbf8). Puede utilizar este ID para hacer referencia a la aplicación con otros comandos de la CLI de App2Container.

También puede elegir una aplicación específica consultando su ID de aplicación y generar un informe de análisis utilizando el 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“

Puede usar la plantilla analysis.json (generada por el análisis de la aplicación para recopilar información sobre la aplicación analizada que ayuda a identificar todas las dependencias del sistema de la sección analysisInfo) y actualizar los parámetros del contenedor para personalizar las imágenes de contenedor generadas utilizando la sección containerParameters.

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

Además, puede ejecutar el comando $ app2container extract --application-id java-tomcat-9e8e4799 para generar un archivo de aplicación para la aplicación analizada. Esto depende del archivo analysis.json generado anteriormente en la carpeta del espacio de trabajo de la aplicación y se adhiere a las actualizaciones de los parámetros de contenerización especificadas allí. Al usar el comando extract, puede continuar el flujo de trabajo en otro servidor después de ejecutar el primer conjunto de comandos en el servidor de aplicaciones.

Ahora puede empaquetar imágenes de Docker generadas por comandos para la aplicación seleccionada

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

Con este comando, usted podrá ver las imágenes de contenedor generadas mediante imágenes de Docker en el servidor donde se ejecuta el comando containerize. Puede utilizar el comando docker run para inicializar el contenedor localmente y probar la funcionalidad de la aplicación ya empaquetada.

Tenga en cuenta que, además de generar imágenes de contenedor, el comando containerize también genera un archivo de plantilla deployment.json que puede usar con el comando generate-appdeployment. Puede editar los parámetros en el archivo de plantilla deployment.json para, por ejemplo, modificar el nombre del repositorio de imágenes que se registrará en Amazon ECR, los parámetros de definición de tareas de ECS o el nombre de la aplicación 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": ""
}
}
}

En este punto, el espacio de trabajo de la aplicación donde se generan los artefactos sirve como un espacio aislado para probar. Puede elegir editar el Dockerfile generado aquí para realizar cambios en su aplicación y usar el comando docker build para crear nuevas imágenes de contenedor según sea necesario. Recuerde que puede generar los artefactos necesarios para implementar los contenedores en Amazon EKS mediante el comando 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 según la plantilla deployment.json generada como parte de la ejecución del comando containerize. App2Container ahora también generará plantillas de CloudFormation para ECS o EKS y una opción para implementarlas.

El comando registra la imagen del contenedor en el repositorio ECR especificado por el usuario y genera una plantilla de CloudFormation para implementarlo ya sea en Amazon ECS o Amazon EKS. Puede registrar la definición de tareas de ECS con Amazon ECS y usar kubectl para iniciar la aplicación en contenedor en el clúster de Amazon EKS o un clúster de kubernetes autoadministrado existente utilizando el archivo de descripción Amazon-eks-master.template.deployment.yaml generado por App2Container.

Otra alternativa es implementar las aplicaciones directamente en contenedores usando el comando --deploy en Amazon EKS.

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

 

Manejo de aplicaciones ASP.NET con Windows Authentication

La creación de contenedores de aplicaciones ASP.NET conlleva casi el mismo proceso que las aplicaciones Java, pero los contenedores de Windows no pueden unirse directamente a un dominio. Sin embargo se pueden usar identidades de dominio de Active Directory (AD) para admitir varios escenarios de autenticación.

App2Container detecta si un sitio está utilizando la autenticación de Windows y, en consecuencia, hace que el grupo de aplicaciones del sitio IIS se ejecute como identidad del servicio de red y genera las nuevas plantillas de CloudFormation para las aplicaciones IIS autenticadas de Windows. La creación de gMSA y el grupo de seguridad del AD, el dominio de los nodos ECS y hacer que los contenedores usen este gMSA está a cargo de esas plantillas.

Además, proporciona dos scripts de PowerShell como salida para el comando $ app2container containerize junto con un archivo de instrucciones sobre cómo usarlo.

El siguiente es un resultado de ejemplo:

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"

El primer script de PowerShell, DomainJoinAddToSecGroup.ps1, se une al host del contenedor y lo agrega a un grupo de seguridad de Active Directory. El segundo script, CreateCredSpecFile.ps1, crea una cuenta de servicio administrada por grupo (gMSA), otorga acceso al grupo de seguridad de Active Directory, genera la especificación de credenciales para este gMSA y la almacena localmente en el host del contenedor. Puede ejecutar estos scripts de PowerShell en el host de ECS. El siguiente es un ejemplo de uso de los 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 ejecutar el comando app2container generate-deployment, edite el archivo deployment.json para cambiar el valor de dockerSecurityOption por el nombre del archivo CredentialSpec que generó el script CreateCredSpecFile. Por ejemplo:

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

Cualquier acceso a recursos de red realizado por el servidor IIS dentro del contenedor para el sitio ahora usará la cuenta de servicio administrada de grupo (group Managed Service Account, gMSA) anterior para autenticarse. El último paso es autorizar esta cuenta gMSA en los recursos de red a los que accederá el servidor IIS. Un ejemplo común es la autorización de este gMSA dentro de SQL Server.

Por último, si la aplicación debe conectarse a una base de datos para que sea completamente funcional y usted ejecuta el contenedor en Amazon ECS o Amazon EKS, asegúrese de que el contenedor de la aplicación creado a partir de la imagen de Docker tenga conectividad con la misma base de datos. Puede consultar esta documentación para conocer las opciones de migración: MS SQL Server de Windows a Linux en AWS, el servicio de migración de bases de datos de AWS y realizar una copia de seguridad y restaurar su Base de datos de SQL Server a Amazon RDS.

Disponible para todos los clientes
AWS App2Container se ofrece de forma gratuita. Usted solo paga por el uso real de los servicios de AWS, por ejemplo el costo de Amazon EC2, ECS, EKS, S3 según su uso. Para obtener más información, consulte las preguntas frecuentes y la documentación de App2Container.

Más información:
https://aws.amazon.com/es/blogs/aws/aws-app2container-a-new-containerizing-tool-for-java-and-asp-net-applications/
https://docs.aws.amazon.com/app2container/latest/UserGuide/start-intro.html

 

Este artículo fue traducido del Blog de AWS en Inglés.

 


Sobre el autor

Channy Yun es Principal Developer Advocate de AWS.

 

 

 

 

 

Sobre los traductores

Jesús Humberto Contreras Rancurello es Senior Solutions Architects de AWS Mexico.

 

 

 

 

 

José Lorenzo Cuencar es Senior Solutions Architects de AWS Mexico.