ICM / how-to-do / Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate. Parte 1

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate. Parte 1

18 septiembre 2021 | Carlos Calvo

Las necesidades de los proyectos de software en relación a la fiabilidad del desarrollo y de la puesta en producción nos ha llevado a implementar soluciones que cubran las necesidades de DevOps. En una serie de 3 capítulos daremos las configuraciones necesarias para llevar a cabo una automatización de procesos de integración y despliegue de aplicaciones en entorno cloud basado en tecnologías de AWS. El proyecto podría llevarse a cabo en Nube privada o Azure cambiando tecnologías pero utilizando la misma filosofía: ci/cd, containers y despliegue en AKS, ECS, Docker Swarm, K8S, …

En este artículo vamos a explicar cómo realizar el despliegue de una aplicación desarrollada en ASP.NET MVC 5 (Introducción con MVC 5 de ASP.NET | Microsoft Docs) en un clúster de AWS ECS utilizando AWS Fargate mediante el uso de Terraform para la definición de la infraestructura que soportará nuestra solución.

La idea principal es guiarte a través de los pasos e ideas principales que envuelven un despliegue en AWS Fargate a partir de un repositorio de código ubicado en AWS CodeCommit. Te enseñaremos a crear el proyecto con Terraform, a ejecutar tu primer repositorio de código y a saber instaurar una Pipeline de CI/CD que se encargue de compilar nuestro código, a generar una imagen con él y posteriormente a publicarla en un cluster de AWS ECS bajo Fargate de forma 100% autónoma.

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Para completar esta guía, es importante disponer previamente de una suscripción de AWS, descargar la versión del binario de Terraform que más nos interese y tener configurado el entorno de trabajo para que Terraform sea capaz de conectarse a nuestra suscripción de AWS y crear nuestra infraestructura.

Preparando el entorno

Crear suscripción de AWS

Como hemos comentado anteriormente, deberemos crear una suscripción de AWS. En esta guía no abordaremos ese punto, pero puedes empezar a crearla desde aquí. Son 5 pasos sencillos que se puedes llevar a cabo sin mayor dificultad en unos minutos. Es posible, trabajando con un partner como ICM, no introducir una tarjeta visa y hacer el deploy mediante una subscripción con enterprise agreement.

Generar fichero de credenciales

El siguiente paso es descargar la aplicación Terraform, la cual ejecutaremos para que nos genere la infraestructura necesaria para que, a posteriori, el laboratorio nos funcione correctamente. Puedes descargarte Terraform desde aquí.

Una vez descargado, guarda el fichero de Terraform en un directorio creado para la ejecución de este laboratorio. Ese directorio será el mismo en el que posteriormente generaremos los ficheros .tf (Terraform) que contendrán la definición de nuestra infraestructura.

Para continuar con la preparación del entorno, generaremos un directorio dentro de nuestra home llamado  .aws que contendrá el fichero credentials (sin extensión) con el siguiente texto:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Los valores de aws_access_key_id y aws_secret_access_key deben ser modificados para incluir los identificadores que AWS te proporcionó cuando generaste la suscripción. Además, como veremos a continuación, el nombre de la sección (my-lab-project) es importante, porque para decirle a Terraform cómo conectarse a AWS deberemos agregar una referencia a este nombre. El fichero credentials podría tener las credenciales de más de una suscripción. Por eso es importante el nombre, porque diferentes proyectos de Terraform podrían apuntar a diferentes pares de aws_access_key_id y aws_secret_access_key.

Preparar main.tf

Cuando ejecutamos Terraform, lo primero que este intentará es encontrar un fichero llamado main.tf. Este fichero debe estar en el mismo nivel que el ejecutable de Terraform, puesto que este sólo buscará el fichero allí.

En el fichero main.tf introduciremos únicamente los datos generales relativos a la suscripción de AWS. Lo ejecutaremos de la siguiente manera:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Primera ejecución

Ahora ya tenemos todo lo necesario para realizar una primera ejecución de Terraform. Esta sirve básicamente para que Terraform lea las propiedades que hemos definido, se conecte a AWS y nos genere una base de datos local con el estado actual de los objetos que haya podido encontrar en AWS.

Para realizar todo lo comentado, debemos ejecutar desde un cli el binario de Terraform añadiendo el parámetro  init, que será el que le indicará a Terraform que se trata de la primera ejecución. El comando quedaría de la siguiente manera:

Si todo está correcto, esta ejecución nos originará una salida semejante a la siguiente:

Creación de un repositorio en AWS CodeCommit

Para poder guardar nuestro código en un repositorio, lo primero a hacer es crear un fichero de Terraform, que contendrá la configuración básica de nuestro repositorio Git.

Generar un repositorio de Git con Terraform en AWS es muy sencillo, ya que sólo nos va a pedir 3 datos: el nombre del repositorio, una descripción y una rama por defecto. Como en este laboratorio no vamos a trabajar con ramas, crearemos un repositorio con una única rama.

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

A continuación, aplicaremos los cambios que hemos hecho a fin de que se nos despliegue un nuevo repositorio de código en nuestra suscripción de AWS. Lo hacemos ejecutando el siguiente comando:

Este comando analizará los cambios en nuestro código de Terraform y aplicará las acciones que sean necesarias para crear nuestro repositorio.

Ahora clonaremos el repositorio para crear una copia local del mismo. Esto incluye algunos aspectos de seguridad/permisos que conviene tener presentes antes de continuar. Recomendamos la lectura del siguiente artículo para aclarar conceptos relacionados con AWS CodeCommit y el uso de Git para su acceso. Una vez tengas los conceptos claros, puedes clonar tu repositorio y crear una copia local de la siguiente manera:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Ahora tendrás una copia local de tu repositorio remoto que debería estar totalmente vacío, a excepción de los propios ficheros de control de Git ubicados en el subdirectorio oculto llamado  .git. Ya estamos en disposición de crear un proyecto de demo en el repositorio local y subir los cambios a Git remoto cuando sea necesario.

Creación de un proyecto “Hello World!”

Cuando tenemos un repositorio remoto y una copia local del mismo, podemos empezar a preparar nuestro proyecto. En nuestro caso, vamos a utilizar Visual Studio 2019 para generar un proyecto de demo. En este, le añadiremos soporte para Docker y lo dejaremos preparado para que, en el futuro, podamos utilizar las imágenes generadas en los clústers de AWS Fargate.

Así, generaremos un nuevo proyecto de tipo ASP.NET Core Web App:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Asignamos un nombre al proyecto y seleccionamos una ubicación para el mismo:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

En la siguiente pantalla, selecciona el Framework .NET 5.0, marca “ninguno” como método de autenticación y, muy importante, selecciona la opción “Habilitar Docker”. Si no lo haces ahora, podrás agregar soporte para Docker más adelante cuando el proyecto ya esté creado.

Es importante saber que, si estamos desarrollando en una máquina Windows, deberemos tener previamente instalados algunos servicios o programas para que nuestro sistema operativo sea capaz de ejecutar contenedores en un entorno virtual Linux. En nuestro caso, hemos utilizado dos aplicaciones para generar el laboratorio que seguramente te harán falta si tu entorno se asemeja al nuestro:

 

Con estas dos aplicaciones instaladas, nuestro Windows debería ser capaz de ejecutar nativamente instrucciones de Linux y de desplegar contenedores preparados para Linux sin ningún problema. De no ser así, el siguiente paso podría fallar o, incluso, no mostrar la opción “Habilitar Docker”.

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Al finalizar, nos encontraremos con nuestra solución y proyecto creados así:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Fijémonos en que uno de los ficheros generados se llama Dockerfile. Este fichero contiene las instrucciones sobre cómo se debe generar la imagen que contendrá nuestra aplicación. El fichero generado automáticamente tiene el siguiente contenido:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Se trata, como podemos intuir, de los pasos a ejecutar en orden secuencial para generar una imagen legible por Docker. Es la configuración mínima para aplicaciones MVC 5.0, necesaria para compilar el proyecto, generar la imagen e indicarle a Docker cómo debe hacer para correr nuestra aplicación a través de la propiedad ENTRYPOINT. Para entender mejor que hace cada línea de este o cualquier otro Dockerfile, es recomendable la lectura del siguiente artículo para conocer las posibilidades que ofrece un Dockerfile. Puedes ver la referencia aquí.

Si ejecutamos el proyecto, veremos que se compila y carga correctamente. Al finalizar, se debería abrir el navegador que tengamos configurado por defecto y ver la aplicación web que acabamos de crear. Esta debería tener un aspecto semejante a:

En este punto ya tenemos nuestra suscripción de AWS, configurado nuestro entorno para poder ejecutar Terraform con nuestras credenciales, configurado el entorno de Terraform, nuestro repositorio Git listo y nuestro proyecto creado en la copia local del repositorio Git. Vamos a realizar nuestra primera subida de código al repositorio de Git.

Una vez hemos creado el proyecto y comprobado que arranca sin problemas en local, estamos en disposición de subir una copia de nuestro código desde el repositorio local hasta el repositorio en AWS CodeCommit. Para hacerlo, simplemente nos colocamos en el directorio del proyecto y ejecutamos el comando así:

Desplegar una aplicación .Net con Pipeline CI/CD en AWS ECS y Fargate.

Próximos pasos

En la siguiente entrega del artículo prepararemos la infraestructura de AWS. Para que las Pipelines de CI/CD que prepararemos más adelante funcionen correctamente, necesitaremos disponer de una serie de servicios correctamente configurados en AWS. Toda esta información la explicaremos próximamente en la siguiente entrega del artículo llamada “Preparando la infraestructura”.