Automatizando con CloudFormation, primeros pasos

En la entrada anterior, “VPC: Virtual Private Cloud, tu datacenter en la nube” vimos algunos conceptos básicos sobre las VPCs y otros recursos de red. También vimos una arquitectura de ejemplo, de las muchísimas posibles y dijimos que la creación podía ser automatizada. En esta entrada vamos a ver cómo podemos construir la VPC de manera automatizada utilizando CloudFormation.

CloudFormation es un servicio que nos permite escribir scripts para desplegar infraestructura. Es lo que se conoce como Infrastructure as Code (Infraestructura como código). Esto tiene algunas ventajas muy importantes:

  • Al ser código, podemos agregarlo al codigo en nuestro git (o cualquier otro controlador de versiones) y tener muy buen control sobre la Infraestructura
  • Podemos desplegar varias veces nuestra infraestructura (por ejemplo para ambientes de desarrollo, testing, producción) asegurándonos que no habrá diferencias entre ambientes
  • Podemos actualizar la infraestructura de manera rápida y sencilla y con mínimas interrupciones
  • y muchas otras ventajas que iremos descubriendo a medida que avancemos en el tema

Los scripts de CloudFormation pueden escribirse en yaml o json y no hay diferencias en lo que se puede hacer con uno o el otro, son 100% equivalentes. Personalmente prefieron yaml ya que los scripts quedan más cortos, más claros y fáciles de entender, así que los ejemplos estarán en este lenguaje. La documentación que AWS provee sobre este tema es muy extensa y completa y todos los ejemplos están en yaml y json, por lo que si estás interasado en usar éste último, no tendrás dificultades.

La infraestructura que vamos a desplegar es la que se presento en la entrada anterior. Asumo de ahora en más que ya leíste esa entrada y estás familiarizado con la infraestructura, sino, es un buen momento para una pausa y volver a esa entrada. Tan solo para refrescar la memoria, acá va nuevamente el diagrama

Arquitectura de la VPC

La estructura básica del script

Un script de CloudFormation tiene las siguientes secciones:
1) Parameters
2) Metadata
3) Mappings
4) Conditions
5) Resources
6) Outputs

Vamos a ver las secciones más importantes a través de ejemplos que nos permitan desplegar la infraestructura anteriormente descrita.

Parameters
En esta sección podemos proveer valores de entrada al script. Estos valores pueden ser strings, numbers y algunos otros tipos más. Para nuestra VPC, lo que vamos a especificar son los rangos de IPs que queremos utilizar.

CloudFormation - Parámetros - CIDR blocks

La imágen muestra solamente los bloques de IPs para la VPC y para una de las subredes privadas. Las otras tres subredes tendrán respectivamente los bloques 10.0.2.0/24, 10.0.3.0/24 y 10.0.3.0/24.

Estos bloques de IPs deberían tener 256 IPs pero AWS reserva 5 IPs en cada una de las subnets por lo que efectivamente se disponen de 251 IPs en cada subred. Para la subred mostrada en la imágen, las IPs reservadas son 10.0.1.0, 10.0.1.1, 10.0.1.2, 10.0.1.3 y 10.0.1.255.

Espero en futuras entradas mostrar otros tipos de parametros que también son muy útiles.

Metadata
Cuando ejecutamos nuestro CloudFromation desde la consola de AWS, éste nos presenta un formulario para el ingreso de los parámetros que definimos en la sección Parameters. Este formulario es personalizable, podemos cambiar el orden en que se piden los parámetros, las etiquetas e incluso agruparlos en distintas secciones. Esta personalización se realiza en la sección Metadata. La misma no tiene ningún tipo de impacto funcional en la ejecución del script, es solo para cambiar la estética del formulario.

CloudFormation - Metadata

Al final del artículo dejo un link al script completo.

Mappings
Un mapa es una estructura que permite obtener un valor a partir de dos indices. Es muy utilizado para seleccionar valores que cambian en base a ciertos parámetros como pueden ser la región en donde estamos creando el stack, u otro parametro de entrada, como el ambiente (desarrollo, testing, producción, etc).

Un ejemplo de ello sería poder seleccionar la cantidad de servidores a desplegar para el fronteend y backend de la aplicación según el ambiente en el que nos encontramos.

CloudFormation - Mappings

Si bien es una sección de mucha utilidad, no es utilizada en el script que crea la VPC.

Resources
Esta es la sección más importante del script, tanto así que es la única sección que no es opcional. En ésta se especifican los recursos que queremos desplegar. Cada recurso de AWS tiene un snippet (en yaml o json) que permite su creación y configuración. En el ejemplo solo vamos a ver unos pocos necesarios para la creación de la VPC y sus recursos. El listado completo esta en el sitio de documentación de AWS aqui.

Es muy importante notar que todos los recursos que creamos tienen un atributo Tags en donde especificamos una o más etiquetas que serán agregadas al recurso. Las etiquetas son pares key/value y son muy utilizados en AWS para agrupar recursos, ejecutar acciones sobre ellos, etc. Si bien las etiquetas no son obligatorias, es una muy buena práctica y son muy útiles para administrar los recursos.

CloudFormation - Resources

En la imágen se muestra como es creada la VPC. El tipo del recurso es AWS::EC2::VPC, tiene varias propiedades entre la que se destaca el CidrBlock y sus Tags. El valor de la propiedad CidrBlock referencia al parametro VpcCidrBlock que definimos en nuestra sección parámetros. La funcion !Ref es una de la varias Intrinsic Functions que soporta CloudFormation y que son muy útiles para conformar los valores de las propiedades bastandonos en parámetros o valores que otros scripts de CloudFormation exportan. La referencia completa de las funciones está aquí

El script completo de CloudFormation que crea la arquitectura del ejemplo esta aquí