Crea dockers en Fargate y habilita schedules de disponibilidad

Por Sahian Hernández, Infrastructure Analyst en Financial Solutions

Si bien el tema de dockers no es algo nuevo, ha llegado a ser una herramienta ampliamente usada por las empresas, lo que sí puede llegar a ser algo nuevo, es el servicio que ofrece AWS para el uso de dockers y aunque tiene 2 servicios para ello (ECS y EKS), el que veremos en esta ocasión es ECS con Fargate, el cual hace que ECS este más enfocado a «serverless».

https://aws.amazon.com/es/fargate/

¿Qué es Fargate?

Fargate, es un motor informático sin servidor, que funciona tanto con Amazon Elastic Container Service (ECS), como con Amazon Elastic Kubernetes Service (EKS), eliminando la necesidad de aprovisionar y administrar servidores para cargas de trabajo con Docker.

¿Y por qué alguien usaría Fargate?

La respuesta es tan simple como decir porque alguien usaría Lambda, la facilidad y flexibilidad que ofrecen los servicios «serveless» permite ahorrarse tiempo de configuración de servidores, sistemas operativos, mantenimientos, costos, etc. Todo esto sin descuidar aspectos importantes como la seguridad o escalabilidad.

Con Fargate se puede lograr levantar servicios altamente disponibles, un poco más baratos que sus contrapartes de «servidor» y casi completamente automatizado, por lo que se vuelve una muy buena opción para satisfacer muchas cargas de trabajo en las empresas.

Para empezar a trabajar con Fargate, el primer paso será tener una imagen de Docker, si bien existen maneras de trabajarlo directamente con Docker Hub, para esta guía usaremos Amazon Elastic Container Registry (ECR).

Dentro de un servidor o un equipo local que se tenga instalado Docker y AWS CLI, con credenciales activas y permisos suficientes para ECR, creamos la imagen como lo muestro a continuación:

En este ejemplo se compone de un Dockerfile, el cual contiene la definición de la imagen, en este caso un amazoncorretto:11 siendo este un Docker enfocado a JAVA y a su vez se habilita unzip y AWS CLI en el sistema.

También cuenta con un script que al ser ejecutado ira a S3 a buscar archivos, en este caso un «.jar» y su archivo de configuración para posteriormente ejecutarlo.

Antes de crear la imagen procederemos a ir a ECR y crear un nuevo repositorio, con el nombre que se desea en la imagen de Docker:

Las demás opciones se pueden dejar en default.

Después entramos al repositorio y hacemos clic en «view push commands».

Aquí podremos ver varios comandos, en la misma ruta donde estén los 2 archivos o en su defecto el Dockerfile correspondiente de ejecutar los 4 comandos; en caso de que el primero cause problemas, se puede sustituir por este otro:

· eval $(aws ecr get-login –no-include-email | sed’s | https: // | | ‘)

Al terminar los 4 comandos podremos ver una versión en el repositorio, posteriormente si creamos una nueva pasa la anterior a «untagged».

Terminando de preparar nuestras herramientas iniciales, estamos listos para empezar con Fargate y en esta guía, como lo había comentado anteriormente, se usará Amazon Elastic Container Service (ECS).

1. Crea un nuevo cluster de ECS

2. En donde nos da diferentes opciones de cluster, elige el que tiene en letras resaltadas «Powered by AWS Fargate» o bien «Networking only».

3. Pondremos solamente el nombre del Cluster, esto es debido a que en la cuenta ya existen recursos como VPC, RDS, SSM, etc. y se busca que los dockers que se creen, convivan con esos recursos, al no ponerle VPC podremos usar VPC y Subnets que se encuentren en la cuenta.

Con estos 3 pasos tendremos el cluster creado, pero antes de empezar a crear Dockers, se debe definir una parte esencial; como vimos en la introducción no tendremos un servidor o un lugar convencional donde pondremos la imagen y trabajaremos con ella, por lo que necesitamos asignar los recursos que necesitará, la imagen a utilizar, si necesita puertos abiertos, comandos especiales, etc.

Para ello iremos a «Task Definitions» el cual se encuentra a la izquierda en nuestro cluster y procederemos a crear una nueva «Task Definition».

· Se le asignará un nombre, se recomienda que sea fácilmente identificable a la imagen de ECR o bien el mismo.

· Se le asignará un IAM ROL, existirá uno por defecto que tenga los permisos necesarios de usar los recursos de ECS, al cual le agregaremos permisos de ECR y en el caso de esta guía permisos para S3, por lo que el ROL tiene que ser creado en base a las necesidades de la imagen a utilizar.

· En «Network Mode» se deja «awsvpc».

· En «Requires compabilities» se usa FARGATE.

En esta sección es donde Fargate se puede «personalizar» ya que permite poner varias combinaciones de procesamiento, se puede asignar Memoria y CPU especializada a la tarea a realizar, en este ejemplo se usa 2GB y 0.25 VCPU, pero podrían ser hasta 30GB de Memoria y 4 VCPU.

Después de asignar los recursos necesarios se da clic en «Add container» en donde pondremos un nombre al contenedor el «URI» de la imagen de ECR y a su vez, podremos personalizar el contenedor para cosas mucho más específicas que por el momento no serán usadas.

Todas las demás opciones se dejan en default y se crea la «Task Definition».

A este momento tendremos todo preparado para empezar a crear Dockers, regresando al cluster, iremos a la parte de tasks y creamos una nueva tarea en donde pondremos:

· «Capacity provider strategy» será Fargate

· Task Definition será la anteriormente creada junto con la revisión

· » Platform version» usaremos «LATEST»

· Cluster creado

· Number of tasks, al ser una prueba solo crearemos 1

· Cluter VPC nos permite seleccionar una VPC dentro de la cuenta

· Subnets elegiremos una subnet dentro de la VPC

· Security groups un SG que permita conectar con los recursos a necesitar

· Auto-assign public IP se deja en ENABLED, para que pueda llegar a ECR y traer la imagen

Se da clic en ejecutar y después de unos minutos podremos ver el Docker corriendo, en caso de que la tarea aparezca como «STOPPED», se pueden revisar logs para tratar de trazar el problema.

Aquí es donde se ve la información relacionada al mismo, tags e incluso los logs que genera, inclusive también es posible ir a Cloudwatch a revisar los logs con más detalle.

En este punto se está usando Fargate y se pueden crear más tareas dependiendo de las necesidades, sin embargo, al detenerse la tarea se «destruye», por lo que, si la tarea es un servicio que deseas siempre disponible, crear la tarea no sirve de mucho.

Para estos casos se puede usar ECS para crear servicios, que, en palabras simples, se encargarán de mantener las tareas en cierto número deseado o incluso muchas tareas detrás de algún ELB.

Para la creación del servicio:

  1. Iremos a servicios y crearemos uno nuevo donde únicamente, pedirá el nombre del servicio y las mismas definiciones que al ejecutar la «Task» , las demás configuraciones pueden quedar por default ya que en este ejemplo no se usará ELB.

El servicio tendrá activas tareas en base al «Number of tasks», si alguna llega a detenerse, automáticamente crea otra para sustituirla.

Por último, si bien ya se tiene el servicio que asegura que la o las tareas siempre estén ejecutándose, a veces se requiere que el servicio solo esté disponible ciertas horas, sobre todo en ambientes de testing. Para resolverlo, una opción viable sería realizar una ejecución que haga que nuestro servicio pase de 1 a 0 ó viceversa, lo cuál haría que virtualmente se «apague o encienda» el servicio, para ello podríamos usar lambda con la siguiente configuración:

· Phyton 3.7

· 128 MB

· Timeout 5 seg

lambda_funtion.py:

import boto3 

import pprint 

import os 

region = ‘us-east-1’ 

client = boto3.client(‘ecs’, region_name=region) 

def lambda_handler(event, context): 

    lambda_realone(event, context); 

def lambda_realone(event, context): 

    response = client.update_service( 

        cluster=’NOMBRECLUSTER’, 

        service=’NOMBRESERVICIO’, 

        desiredCount=1, 

        deploymentConfiguration={ 

            ‘maximumPercent’: 200, 

            ‘minimumHealthyPercent’: 100 

        }, 

        forceNewDeployment=True 

    

Solo se sustituye el nombre del cluster y del servicio y si se desea apagar o encender.

Nota: si el servicio necesita más de 1 tarea a la vez, se debe poner el número de tareas deseadas.

De esta manera se crearía una lambda para «encendidoECS» y una «apagadoECS», para posteriormente poder crear reglas en Cloudwatch.

Las cuales permitirán ejecutar un «encendido»a una hora deseada llamando a la lambda de encendido y un apagado a una hora diferente con un llamado a lambda de apagado.

De esta manera se puede lograr un horario de uso de ECS, cabe recalcar que ECS o Fargate no cobra por tener un Cluster creado ni por servicios o «Task definitions«, únicamente cobra por el procesamiento usado, el cual es más bajo que usar EC2 normalmente y se puede bajar aún más si se usa FARGATE_SPOT.

En Financial Solutions nos preocupamos por siempre estar a la vanguardia, trabajamos de la mano de nuestros partners certificándonos para ofrecerte una ventaja competitiva y aun alto estándar tecnológico.

Cuéntame si esta guía te ayudo y cuáles más te gustaría leer.


Related Post

Contactar a un especialista