Blog de Amazon Web Services (AWS)

Aprende a desplegar aplicaciones en contenedores serverless con AWS

El uso de contenedores para la modernización de aplicaciones es un tema que predomina en muchas de las noticias, informes y charlas recientes sobre tecnología. Los contenedores se están convirtiendo en una capa de computación moderna muy presente en cargas de trabajo on-premises y plataformas híbridas. En este artículo presentamos conceptos básicos sobre contenedores, con ejemplos fáciles de entender, e introducimos un conjunto de herramientas que os facilitarán su despliegue en AWS.

Introducción al uso de contenedores

Si estás empezando a trabajar con esta tecnología, formando o no parte de un puesto de trabajo técnico, no encuentras tiempo para ponerte a aprender como desarrollar utilizando contenedores, estás en el lugar correcto. En unos minutos, vas a poder desplegar tu primer contenedor en AWS.

Todo comienza con una idea, un prototipo, o un caso de uso que quieres validar. En nuestro ejemplo asumiremos que has desarrollado una aplicación web y aun no la has publicado. ¿Por qué no desplegarla en contenedores? Es más, ¿por qué no hacerla totalmente escalable utilizando tecnologías serverless y en la nube de AWS?

En base a la evolución en tecnologías de contenedores de estos últimos años, puedes encontrar un gran número de referencias y artículos que tratan en profundidad estas soluciones en nuestro blog. Al final de esta publicación encontrarás una sección con lecturas adicionales para poder continuar en tu aprendizaje de cara a incorporar los contenedores a tu grupo de herramientas de tu día a día.

En este blog vamos a introducir los conceptos necesarios para desplegar una infraestructura de contenedores en AWS. ¡Manos a la obra!

Introducción técnica y casos de uso de contenedores

Antes de empezar a desplegar nuestro primer contenedor en AWS, vamos a dar un vistazo general a las tecnologías que forman parte de estas soluciones, y los casos de uso donde los contenedores encajan perfectamente siendo de gran ayuda para nuestros proyectos.

Aprende a desplegar aplicaciones en contenedores serverless con AWS

Puedes consultar nuestra página de Contenedores en AWS para obtener más información, ver los servicios que AWS pone a tu disposición y los casos de éxito de algunos de nuestros clientes.

Este blog post se centra en el despliegue de tu primer contenedor en AWS. La tecnología serverless es una manera de describir los servicios, prácticas y estrategias que te permiten construir aplicaciones más ágiles para que puedas innovar y responder más rápido a los cambios. Para ello vamos a utilizar AWS Fargate, un motor informático sin servidor para ejecutar contenedores en Amazon Elastic Container Service (ECS). AWS Fargate elimina la necesidad de aprovisionar y administrar servidores, permite especificar recursos de computación y memoria por aplicación y además mejora la seguridad mediante el aislamiento de aplicaciones por diseño. De esta forma, nos permite centrarnos en la implementación y administración de las aplicaciones y no preocuparnos por la infraestructura.

Ahora que ya hemos identificado los servicios y tecnologías que vamos a utilizar, veamos cuales son algunas de las mejores maneras de desplegar aplicaciones mediante contenedores serverless en AWS. Una de opciones que tenemos es AWS Copilot. AWS Copilot es una herramienta de línea de comandos (CLI) que permite a nuestros clientes desplegar y administrar fácilmente aplicaciones con contenedores en AWS sin tener que preocuparse por la infraestructura.

Tutorial

En la lista de los potenciales casos de uso, anteriormente hemos visto que podemos utilizar los contendores para una gran variedad de aplicaciones y arquitecturas. Aquí vamos a utilizar como ejemplo una aplicación web, que vamos a empaquetar en un contenedor para desplegarla en AWS.

En el siguiente diagrama se muestra la arquitectura simplificada.

Load balanced web service infrastructure (simplified)

A medida que vayamos avanzando en nuestra implementación citaremos los elementos presentes en este diagrama, así como el racional detrás de este diseño, pero por ahora, ¡vamos con el despliegue!

Antes de nada, necesitaremos crear una cuenta en AWS. Una vez tengamos nuestra cuenta creada utilizaremos el servicio AWS Cloud9 para desarrollar nuestro prototipo. Cloud9 es un entorno de desarrollo integrado (IDE) basado en la nube que le permite escribir, ejecutar y depurar código solo con un navegador. Incluye un editor de integrado, así como un depurador y terminal. Lógicamente, puedes utilizar las herramientas con que trabajes habitualmente en tu equipo, como tu editor de texto preferido y tu configuración de terminal, pero en este post nos hemos centrado en la simplicidad y productividad trabajando con entornos de desarrollo pre-configurados en la nube.

Mediante el siguiente enlace, después de haber iniciado sesión en la consola de AWS y seleccionado la región donde quieres crear tu entorno, accederás directamente a AWS Cloud9.

Selección de la región

Ahora necesitamos crear nuestro entorno de desarrollo:

Crear ambiente en Cloud9

Hacemos clic en “Create environment”, tendremos que realizar tres sencillos pasos y ya estará todo listo para empezar a trabajar con nuestra nueva instancia de Cloud9.

Paso 1: Asignaremos un nombre a nuestro entorno, como por ejemplo “Primer contenedor en AWS” y clic en “Next step”.

Paso 2: Dejaremos todos los valores por defecto y de nuevo haremos clic en “Next step”.

Paso 3: Finalmente crearemos el entorno después de haber revisado nuestra configuración pulsando de nuevo en “Create environment”.

AWS creará tu entorno Cloud9 y una vez desplegado abrirá el IDE directamente en tu navegador.

Otro beneficio de usar Cloud9 es que el entorno tiene preinstaladas las herramientas que vamos a necesitar para nuestra práctica, como AWS CLI (interfaz de línea de comandos) y Docker.

Podemos comprobar que Docker se encuentra instalado correctamente escribiendo “docker –version” en la ventana de terminal de Cloud9.

Versión de Docker

Ahora debemos dotar a Cloud9 de los permisos necesarios para desplegar infraestructura en AWS. Para ello vamos a instalar la utilidad jq necesaria para los siguientes pasos.

sudo yum install -y jq

Una vez la hayamos instalado, debemos seguir este tutorial para asignar los permisos necesarios al entorno de Cloud9 que le permitan desplegar la infraestructura. Al final de este post incluiremos enlaces para que puedas aprender más sobre seguridad en entornos de AWS.

La única herramienta que vamos a instalar en este tutorial es AWS Copilot. Para instalarla, sencillamente pega el siguiente comando en la terminal.

sudo curl -Lo /usr/local/bin/copilot https://github.com/aws/copilot-cli/releases/latest/download/copilot-linux \
&& sudo chmod +x /usr/local/bin/copilot \
&& copilot --help

Ahora ya estamos preparados para innovar desplegando contenedores en AWS.

Crearemos un directorio para nuestro proyecto, y un fichero HTML (index.html) que mostrará un título con el mensaje “My first serverless container app on AWS”. Copia y pega el comando siguiente:

mkdir myApp && cd myApp && echo "<html><body><h1>My first serverless Container app on AWS</h1><body></html>" > index.html

Mediante este sencillo ejemplo alcanzaremos nuestro objetivo, pero dependiendo de tu idea puedes sustituir el código fuente con el de tu propia aplicación utilizando este mismo enfoque.

Para desplegar con contenedores necesitamos un fichero de texto Dockerfile. En este fichero especificaremos la configuración para la creación de nuestro contenedor y los pasos necesarios para desplegar nuestra aplicación.

printf "FROM public.ecr.aws/nginx/nginx:1.19-alpine\nCOPY index.html /usr/share/nginx/html" > Dockerfile

Echemos un vistazo rápido a este fichero de configuración.

1: FROM public.ecr.aws/nginx/nginx:1.19-alpine
2: COPY index.html /usr/share/nginx/html

En la primera línea se hace referencia a la imagen que vamos a utilizar para la ejecución de nuestra aplicación, concretamente usaremos el servidor web Nginx, que se encuentra disponible en Amazon Elastic Container Registry (Amazon ECR). A continuación de los dos puntos se indica la versión de la imagen que debe utilizarse. Si quieres llevar tu idea a producción debes especificar una versión y no usar la última (:latest) versión publicada de la imagen. La segunda línea indica a Docker que copie el archivo “index.html” en una carpeta específica de la imagen durante el proceso de construcción de la misma. Esta carpeta es recogida por Nginx para ser servida automáticamente cuando se despliega.

Con todo esto preparado, ya podemos desplegar nuestro primer contenedor mediante la ejecución de un único comando:

copilot init --app myapp \
--name myapp-service \
--type 'Load Balanced Web Service' \
--dockerfile './Dockerfile' \
--port 80 \
--deploy

¡Enhorabuena! En unos pocos minutos verás una pantalla muy parecida a la siguiente captura. Usa la URL que hemos obtenido como resultado para acceder a tu primera aplicación serverless en AWS.

Desplegar contenedor a través de AWS Copilot

Verás el mensaje de tu aplicación ejecutándose en el servicio AWS Fargate.

Resultado de nuestro primer contenedor

En la consola de AWS podemos ver que es lo que hemos desplegado con el servicio de CloudFormation. Copilot divide automáticamente el despliegue de nuestra aplicación en diferentes stacks, de ese modo las futuras actualizaciones se ejecutarán más ágilmente.

Stacks de CloudFormation

Podemos inspeccionar cualquiera de las plantillas de CloudFormation, veremos en ellas todos sus detalles, así como un resumen de los recursos aprovisionados en el proceso de despliegue.

Plantilla de CloudFormation

Puedes consultar y profundizar en las configuraciones implementadas por CloudFormation y ver el tiempo que has ahorrado utilizando AWS Copilot. Mediante la ejecución de un único comando hemos desplegado una plataforma completamente escalable en contenedores serverless

Ahora vamos a ver como podemos beneficiarnos de algunas de las características de la nube de AWS, concretamente de la elasticidad realizando algunos ajustes sobre nuestro despliegue.

Asumiremos que has realizado algunos cambios en tu aplicación, y ahora quieres desplegarla en más de un contenedor utilizando un balanceador de carga para mejorar la disponibilidad de la solución.

Descarga la foto que añadimos a continuación y súbela a tu entorno de Cloud9.

Nubes

Puedes hacerlo sencillamente arrastrando el fichero local de la imagen a la carpeta de tu aplicación dentro de Cloud9.

Subir la imagen a Cloud9

Ahora abre el archivo “index.html” e incluyamos el script para mostrar la imagen que acabamos de subir.

<img src=”clouds.jpg”>

El fichero debería quedar tal y como se muestra en la siguiente captura de pantalla:

Contenido de index.html

El segundo paso es actualizar nuestro contenedor de forma que esta imagen sea incluida en el proceso de creación. Para ello vamos a añadir una línea a nuestro Dockerfile.

COPY clouds.jpg /usr/share/nginx/html

De este modo nuestro archivo de configuración contendrá ahora 3 líneas:

FROM public.ecr.aws/nginx/nginx:1.19-alpine
COPY index.html /usr/share/nginx/html
COPY clouds.jpg /usr/share/nginx/html

Por último, dado que hemos añadido más contenido en nuestra aplicación, queremos desplegarla en más de un contenedor para mejorar su disponibilidad y resiliencia. Para conseguir esto abriremos el fichero “manifest.yml” que se encuentra dentro de la carpeta “copilot”. Este fichero es el encargado de gestionar la configuración que utiliza Copilot para la creación de la infraestructura.

Localizaremos el parámetro de configuración “count” y cambiaremos el valor actual de “1” a “2”.

Cambiando parámetros para definir el número de tasks

En este momento ya tenemos todo listo para actualizar nuestro despliegue con la nueva imagen y generar el nuevo contenedor para nuestra aplicación. Ejecutaremos el siguiente comando:

copilot deploy

En unos pocos minutos el proceso de despliegue habrá finalizado, y podrás visualizar los cambios refrescando la página en tu navegador.

Nuestra nueva app

Accediendo al servicio de Amazon Elastic Container Service (ECS) podrás comprobar el número de contenedores desplegados:

Visualizando en la consola el número de contenedores

Adicionalmente puedes acceder a los logs de tu aplicación (almacenados en Amazon CloudWatch) directamente desde Copilot, sencillamente ejecuta este comando:

copilot svc logs

Finalmente, el aspecto de nuestra arquitectura, ahora que hemos desplegado dos contenedores, será la siguiente:

El nuevo diagrama de arquitectura

Debemos recordar desmantelar la infraestructura y eliminar los recursos que hemos desplegado, Copilot nos permite realizarlo mediante el siguiente comando:

copilot app delete

Una vez confirmado, se eliminará la aplicación y toda la infraestructura que hemos utilizado en este artículo.

Limpiando el entorno

Finalmente, si no vamos a seguir utilizando nuestro entorno de Cloud9 para otros desarrollos, debemos acordarnos también de detenerlo y eliminarlo.

Sugerencias y lecturas adicionales

  1. Seguridad en la nube de AWS y el Modelo de Responsabilidad Compartida
  2. Nuestro Blog sobre Contenedores y nuestra página principal de Contenedores en AWS
  3. Profundiza en la documentación de AWS Copilot y diferentes conceptos para experimentar con esta herramienta de línea de comandos
  4. Explora nuestra página de contenedores en AWS.
  5. Lee más acerca de contenedores e imágenes en la documentación oficial de Kubernetes
  6. Mejores prácticas para escribir Dockerfiles
  7. Un artículo seleccionado de nuestro blog: Amazon ECS vs Amazon EKS: making sense of AWS container services
  8. Video blog con un montón de contenido interesante: Containers from the Couch
  9. Echa un vistazo a nuestro eksworkshop.com o ecsworkshop.com para empezar a probar Amazon EKS y Amazon ECS

Conclusión

En este blog post has desplegado tu primer contenedor serverless en Amazon Web Services. Pero no solo has hecho eso, ahora ya conoces AWS Copilot, una herramienta de línea de comandos que te permite centrarte en tu idea en lugar del trabajo que ocasiona la administración manual de la infraestructura a bajo nivel. Del mismo modo, has aprendido conceptos básicos sobre contenedores y ahora entiendes la terminología común que los rodea. Hay mucho más que explorar y espero que hayas experimentado la “builder experience”, ahora dispongas de más opciones para darle rienda suelta a tus ideas en la nube de AWS y contarnos cómo las has llevado a cabo en nuestra plataforma.

Así mismo, te invitamos a continuar tu camino y aprender más sobre contenedores con nuestro Amazon ECS Workshop.

Este blogpost es una traducción por Marcos Hernandez Alvarez (AWS Global Solutions Architect) del original en Inglés.

Johannes Kupser

Johannes Kupser

Johannes Kupser es Arquitecto de Soluciones en AWS para el sector de la automoción en Alemania. Le encanta ayudar a sus clientes en la integración de tecnologías de contenedores y arquitecturas modernas de aplicación.