Tal como hablamos en el articulo anterior, una de las formas de deployar nuestras aplicaciones en AWS es mediante el uso de CloudFormation. Para esto es necesario un template, ya sea en formato JSON o YAML, con todos los recursos que necesitamos y luego mediante el uso de la consola o la linea de comando realizar el despliegue de la infraestructura.

Lo mas probable es que en este punto tu template se vea muy parecido a esto:

Nuestro archivo template.yaml completamente en blanco

Y es que arrancar un template desde 0 es bastante complicado si no conocemos toda la estructura requerida, tanto para el template en si mismo como para cada uno de los recursos que queremos crear.

Entonces, ¿Como puedo escribir mi primer template?

Existen distintas opciones que podemos elegir dependiendo de nuestro gusto personal o experiencia, pero no son caminos excluyentes sino que pueden complementarse y ser soluciones para distintos problemas. A su vez estas herramientas nos pueden ayudar a reducir la curva de aprendizaje y permitirnos generar nuestros templates con mayor agilidad.

AWS Application Composer:

Hace ya algún tiempo AWS nos ofrece una herramienta gráfica para poder crear nuestro template de una manera visual, seleccionando bloques que representan los servicios disponibles y dejándonos conectarlos con otros, facilitando de esta forma dar los primeros pasos de nuestro template.

Para utilizar esta herramienta tenemos 2 opciones:

AWS Application Composer en VSCode

Una vez dentro del Application Composer debemos ir seleccionando los recursos que necesitamos arrastrándolos hasta el tablero de diseño y, de ser necesario, ir vinculándolos entre si. A su vez esta aplicación nos va a permitir editar los detalles de cada uno de los componentes según los requisitos de nuestro proyecto y los mismos se irán viendo reflejados en nuestro archivo de template, en el caso de VSCode, o bien en la solapa “template” de la aplicación online. Por otra parte, el Application Composer nos ira mostrando los errores en tiempo real sobre aquellas operaciones no permitidas en CloudFormation evitando que nos encontremos con conflictos al momento de deployar nuestra infraestructura.

Application Composer online alertando un error

“Inspirarnos” en otros templates:

Para poder iniciar nuestro template podemos basarnos en alguno de los multiples recursos que AWS y la comunidad ponen a disposición para este fin. Tanto en la documentación oficial como en este repositorio vamos a encontrar una serie de templates para desplegar algunos servicios o soluciones pre-armadas.

Si bien la cantidad de templates que existen es bastante amplia, lo es también el numero de soluciones distintas que podemos crear, por lo que es muy probable que estos templates no satisfagan nuestra necesidad al 100% y debamos adaptarlos a nuestra aplicación.

Hay que tener en cuenta que este camino no nos va a salvar de tener que revisar la documentación de CloudFormation, pero nos va a dar un excelente punto de partida para empezar a investigar, conocer la estructura del template.

Generar un template en base a una infraestructura ya creada:

En este 2024 una de las novedades por parte de AWS es una nueva herramienta llamada “IaC Generator” y como podemos deducir de su nombre nos permite generar un template de CloudFormation en base a recursos que ya tengamos creados en nuestra cuenta.

El primer paso para generar un template es realizar un escaneo de los recursos de la cuenta, este proceso puede tardar desde algunos segundos hasta varios minutos dependiendo la cantidad de recursos y servicios que estemos utilizando ya que no solamente revisa los recursos en si mismos sino la relación con otros. Por ejemplo en caso de seleccionar una función lambda o un EC2 el IaC Generator nos va a mostrar los roles asociados a esos recursos para poder tenerlos también en nuestro template o bien no agregarlo en caso que consideremos que no es aplicable o necesario al template que estamos generando.

en IaC Generator seleccionamos una función y nos muestra su rol como recurso asociado

Una vez seleccionados los recursos que necesitamos vamos pedirle a AWS crear nuestro template y nos va a devolver toda la estructura del mismo. Por defecto este template esta en formato YAML pero podemos optar por verlo o descargarlo en formato JSON. Si bien esta opción es bastante practica, es probable que el template generado requiera una revision de los parámetros y configuraciones para confirmar que podamos deployarlo, sea en la misma cuenta o en otra, sin tener conflictos de nombres de los recursos, como el nombre de un bucket, u otros recursos.

El Camino del Héroe:

Al principio puede que tratemos de evitarlo, que busquemos salidas fáciles como el Application Composer o usar algún template que encontremos por ahi y se parezca a lo que necesitamos hacer, pero en el fondo sabemos que es inevitable, que en algún momento tenemos que enfrentarnos a la adversidad documentación y entender como están estructurados los templates de CloudFormation.

Y es que si bien las herramientas que vimos antes son excelentes no nos van a evitar al 100% que, en algunas circunstancias, debamos modificar nuestro template a mano.

Estructura de un template de CloudFormation:

Los templates de CloudFormation tienen una estructura predefinida que debemos respetar para que el archivo sea valido. Dentro de esta estructura algunas de las secciones son obligatorias y otras son opcionales, en la siguiente tabla podremos observar estos detalles y una breve descripción de la sección

Sección Obligatorio Descripción Documentación
FormatVersion No Version del formato de CloudFormation, si no esta definido toma por defecto la ultima disponible. LINK
Description No Cadena de texto que describe el template, debe estar siempre luego de la sección “AWSTemplateFormatVersion” LINK
Metadata No Sección destinada a información relevante, en formato JSON o YAML, como detalles de implementación u otros elementos. LINK
Parameters No En esta sección podemos cargar variables para configurar nuestros recursos al momento de la creación o actualización. LINK
Rules No Set de reglas para validar los parámetros de nuestro template antes de crear o actualizar los recursos. LINK
Mappings No En mappings podemos configurar multiples objectos key-value donde value es un array de valores LINK
Conditions No En esta sección podemos definir condiciones especiales para resolver si un recurso debe ser creado o actualizado dependiendo de ciertos parámetros. LINK
Transform No Macros personalizados o definidos por AWS para interpretar o procesar el template. Es usado por ejemplo por AWS Serverless Application Model. LINK
Resources SI Unica sección obligatoria. Contiene la configuración de todos los recursos que contiene el template. LINK
Outputs No Valores de respuesta que pueden ser utilizados en referencias cruzadas con otros stack o visualizar en la consola luego de la ejecución. LINK

Como comentaba en el articulo anterior esta cantidad de secciones y configuraciones posibles hace que la curva de aprendizaje de CloudFormation sea bastante elevada pero no es necesario conocerlas todas para poder comenzar a trabajar en nuestro template ya que como vemos la unica sección obligatoria es la de “Resources”. El resto de las secciones las iremos usando a medida que nuestra aplicación, y por tanto nuestro template, vaya creciendo y por tanto siendo mas complejo, o bien a medida que nuestro proceso de despliegue lo vaya requiriendo.

Antes de ver la segunda parte de este articulo, donde comenzaremos a crear un template de 0 para una aplicación serverless, te recomiendo revisar en la tabla anterior los links a la documentación de cada una de las secciones para ir familiarizándote con la misma y usarla de referencia en caso de dudas especificas sobre cada una.