Guía inicial de AWS ECS explicado con mamushkas

Guía inicial de AWS ECS explicado con mamushkas

Podemos explicar el funcionamiento básico del orquestador de contenedores ECS con mamushkas? Quedate y lo averiguamos!

Play this article

Intro

Había una vez un contenedor solitario corriendo en un servidor, en una turbulencia cuántica lamentablemente dejo de existir y este hermoso servicio nunca más pudo ser usado por millones de personas.

Porqué nadie se enteró?, cómo que nadie estaba velando por la existencia del contenedor y ante el trágico echo nos ayudo a crear otro?, cómo suceden estas cosas sin que nadie se de cuenta? Es trágico!

Gracias al Dios de IT hace ya algunos años se crearon productos que nos ayudan a solucionar estos problemas, estos son ni mas ni menos los orquestadores que contenedores. Ellos velan por la salud de los servicios y van a hacer su mayor esfuerzo por asegurarse que siempre nuestros servicios se encuentren en el estado que nosotros necesitamos.

Qué es ECS?

ECS, o Elastic Container Service es el orquestador de contenedores creado por AWS prometiendo:

Run highly secure, reliable, and scalable containers

Entonces lo que sucede es que en lugar de simplemente correr un contenedor, vamos a definir ciertas características que no solo inician ese contenedor sino que le indican a ECS que queremos que el mismo siempre esté corriendo, con cuantas copias del mismo, etc...

Mamushkas?

Es un conjunto de muñecas tradicionales rusas creadas en 1890. Su originalidad consiste en que se encuentran huecas y en su interior albergan una nueva muñeca. Considero que el concepto de las muñecas nos puede ayudar a explicar cómo es la lógica de creación y configuración de los clusters de ECS.

mamushkas

Cuantas mamushkas tenemos?

Bueno aquí podría ponerme muy pesado y comenzar a desarmar la explicación de ECS comenzando por el mundo, el continente, de ahi a la region de AWS que elegimos, el data center y estar años. Por supuesto la idea no es esa, aunque sabemos que este servicio vive en uno o varios datacenters de AWS.

Antes de dar mis comentarios de cada componente intentando simplificar muchisimo el funcionamiento y dar un concepto general, les dejo la información oficial del servicio que dispone de muchísima más información y la misma es mucho mas completa que lo que explico en este post.

ECS service

Cluster

Bueno vamos a comenzar con la Mamushka mas grande que será en nuestro caso un cluster de ECS. El cluster como entidad podemos decir que es el maestro de orquesta, dentro de el vivirán todos los servicios, con los estados deseados para cada uno de ellos y será el cluster en su lógica interna el que decida si tiene que crear contenedores, eliminarlos, etc.

Task definition

Aquí simplemente vamos a definir una tarea para este cluster que acabamos de crear. En la analogía con las Mamushkas sería la mas pequeña de todas! Esta definición posee todo lo necesario para que el contenedor pueda funcionar de manera correcta.

Entre otras configuraciones, las más importantes pueden ser:

  • Imágen del contenedor que vamos a ejecutar (por defecto buscar en github, pero podemos usar ECR para nuestro propio repositorio de imágenes)
  • Cúanto CPU y memoria queremos utilizar para esta tarea.
  • Configuración de red
  • El manejo de volumenes si necesitamos persistencia de datos

En definitiva, aquí configuramos todo lo necesario para que nuestro contenedor funcione.

Task

Aquí simplemente ejecutamos una tarea en base a una definición creada en el paso anterior.

Esta Mamushka tiene dentro la mamushka "task definition"

Simplemente lanzará el contenedor deacuerdo a la definición hasta que este finalice o sea parado manualmente. En este punto, la tarea no será lanzada nuevamente de manera automática.

Este paso es muy importante de comprender, lanzar una task simplemente inicia el contenedor pero no se queda como guardia imperial a ver que es de la vida del mismo. Si falla, se cae, muere a la task no le preocupa en lo más mínimo.

Servicio

El servicio es quien vela por la salud de nuestras tareas, será el encargado de configurar esta tarea y asegurarse que siempre esté corriendo de ese modo. Es nuestro heroe en este lío!

Si bien funciona diferente, esta mamushka también tiene dentro un "task definition"

Alguna de las configuraciones más importantes que debemos realizar en este punto son:

  • Cuántas tareas ejecutamos?
  • Esta tarea debe escalar? cómo? En base a uso de CPU por ejemplo.
  • La configuración de red dentro del cluster
  • Debe ser expuesta a través de un balanceador de carga? Aquí lo configuramos

Hermoso, y el ejemplo?

Realicemos un pequeño ejemplo para ilustrar todo este funcionamiento.

Pre requisitos

  • Suponemos que disponemos de una cuenta de AWS y acceso de consola web a la misma.
  • Esta cuenta tiene una VPC con una subnet pública.

Creamos un cluster

Para crear un cluster de ECS, nos logueamos en nuestra cuenta de AWS y buscamos el servicio ecs

image.png

Dentro del menú de la izquierda, seleccionamos cluster y crear cluster

image.png

En la elección de "template ", elegimos la opción por defecto

image.png

Por último le damos un nombre a nuestro cluster y damos click en crear

image.png

Es todo para poder crear un cluster de ECS, continuemos con la definición de nuestro contenedor (la mamushka mas pequeña!)

Creamos una task definition

Para el ejemplo vamos a generar una task definition muy simple que nos permita levantar una imágen de nginx.

Para esto, chequeamos el menu izquierdo y seleccionamos "task definition" y luego "create new task definition" Se nos presentará una imágen que nos indica el "launch type" a utilizar. Donde podemos decirle a ECS que se ejecute en EC2 o en fargate (se encarga aws de manejar la infra donde corre el contenedor, a mi me encanta :))

Seleccionamos fargate y continuamos

image.png

Seleccionamos un nombre, el sistema operativo, memoria y CPU

image.png

image.png

Luego de esto viene la parte importante, donde seleccionamos y definimos el contenedor. Hacemos click en "add container"

Aquí vamos a hacer una configuración muy básica, simplemente colocamos un nombre y la imágen que deseamos, en este caso nginx (recordemos que por defecto busca en dockerhub)

Seleccionamos el puerto a exportar para poder acceder desde fuera y eso es todo!

image.png

Exelente terminamos a definir el hijo pequeño de la familia, la mamushka mas chiquita de todas!

Creamos un servicio

Ahora nos resta el paso de generar un servicio que contenga esta task definition, nos vamos al cluster que generamos, verificamos la pestaña service y damos click en create

image.png

Entonces, aqui definimos el launch type, task definition, nombre de cluster, nombre del servicio y cantidad de task que queremos lanzar, 1 en nuesto caso.

image.png

Avancemos, el siguiente paso tiene que ver con la configuración de red que utilizaremos.

Vamos a configurar en este caso.

  • VPC
  • Subnet
  • Habilitar ip publica (para poder probarlo)

En este punto no habilitamos un balanceador de carga porque es una pequeña prueba, pero si queremos que este servicio escale y podamos generar muchos contenedores para un mismo servicio, debemos crear un balanceador de carga y asociarlo en este punto al servicio.

image.png

Por lo comentado anteriormente sobre el balanceo de carga no tiene sentido escalar el servicio, por lo que le damos siguiente al paso de Auto scaling

image.png

Y por último creamos el servicio!

Veamos que luego de unos segundos, en nuestro cluster tendremos algo similar a lo que se muesta a continuación

image.png

En este caso se especifica que se desea tener 1 task y que hay 1 task corriendo, por lo que el servicio siempre intentará dejar la configuración como indica el desired task.

Para validar que la task esté funcionando, vamos a la pestaña task y notamos que la misma está corriendo

image.png

Para poder ver la ip pública que tiene nuestra task y realizar la prueba, hacemos click en Task

image.png

Verificamos la ip pública que tenemos, y al acceder obtenemos

image.png

Con esto disponemos de un servicio para levantar un nginx utilizando ECS, de más está decir que podemos utilizar cualquier imágen ya sea de dockerhub o de nuestro repositorio de imágenes ECR.

voilà

Esto es todo lo relacionado a este pequeño documento de ECS, espero que sea de utilidad. Si deseas más sobre ECS o algun otro servicio de AWS dejamelo saber en los comentarios!