Por Naoufal E., Squad Experts
«Trucos para ahorrar tiempo al programar e implementar fácilmente tu archivo de configuración de Terraform»
Como arquitecto de software o desarrollador FullStack (alguien con experiencia en desarrollo), siempre me ha dado miedo la sintaxis de las configuraciones de Terraform (HashiCorp Configuration Language: HCL).
Cada vez que leía un ejemplo de un archivo con esta sintaxis, no entendía nada y no sabía por qué.
Sin embargo, descubrí el motivo: «era porque mi mente estaba condicionada o programada para pensar en cómo diseñar software, cómo crear un algoritmo para resolver un problema, etc… Y nada más», así que intenté entender el archivo de configuración de Terraform con esa mentalidad y acabé complicándome la comprensión de un lenguaje de configuración sencillo (HCL),
Escribí este artículo para compartir contigo algunos consejos y trucos que te ayudarán a comprender mejor y a implementar Terraform mediante la aplicación del patrón S3M que describí anteriormente.
Para comprender mejor el ejemplo que se ha implementado, consulta mi artículo anterior
Requisito previo:
→ Cuenta de AWS
→Cuenta de AWScon acceso programático y permisos de administrador
→AWS CLI configurada en tu ordenador portátil(si quieres gestionar tu infraestructura desde tu ordenador portátil (~/.aws/config))
→ Una mejor comprensión del patrón S3M
Terraform: ¿Qué? ¿Por qué? ¿Cómo?
¿Qué es Terraform?
¿Es una herramienta de software de IaC? 😲 → Herramienta de software de Infra as Code 😳 → Un software que nos permite programar nuestra infraestructura 😜.
La programación de infraestructuras puede realizarse mediante dos métodos: imperativo (cómo) o declarativo (qué), o ambos juntos.
Imperativo:
- Se centra en cómo debe construirse la infraestructura
- Define los comandos específicos que deben ejecutarse en el orden adecuado para llegar al resultado deseado
Declarativa :
- Céntrate en cuál debería ser la configuración final
- Define el estado deseado y el sistema ejecuta lo necesario para alcanzar ese estado deseado
Y Terraform es declarativo, así que ahora ya sabes por qué, como arquitecto de software, complicaba las cosas: mi mente siempre se centraba en el «cómo» (siempre diseñando el «cómo»), pero si quieres entender Terraform fácilmente, deberías cambiar tu enfoque al «qué» y todo te resultará muy sencillo 😉
¿Por qué deberíamos utilizarlo?
Terraform es una herramienta excelente en lo que respecta a DevOps y la portabilidad. Estas son las razones por las que deberías considerar Terraform como una de tus herramientas de IaC:
- Portabilidad: Este es el gran problema que resuelve Terraform: facilita la duplicación de la infraestructura en diferentes entornos (DEV, PRE, PROD) dentro del mismo proveedor de nube. Además, dado que Terraform es totalmente independiente de la plataforma, facilita la adaptación de los recursos de código al nuevo proveedor de nube si la empresa decide cambiarlo.
- Terraform te permite definir la infraestructura en un archivo de configuración y te facilitará el seguimiento de los cambios en la infraestructura al mantener tu código en un sistema de control de versiones (Git), compilarlo e implementarlo.
- Terraform cuenta con una comunidad muy activa y es de código abierto, por lo que se está creando una comunidad enorme en torno a esta herramienta. Mucha gente ya la utiliza, y es más fácil encontrar personas que sepan cómo usarla, así como complementos, extensiones, asistencia profesional, etc. Esto también significa que Terraform está evolucionando a un ritmo mucho más rápido. Publican nuevas versiones con mucha frecuencia.
- La velocidad y el funcionamiento de Terraform son excepcionales. Una de las ventajas de Terraform es que su comando «plan» te permite ver los cambios que vas a aplicar antes de ejecutarlos.
¿Cómo se usa?
- Descarga la última versión e instálala
- Elige una carpeta, crea un archivo con la extensión .tf y escribe este sencillo ejemplo:
# Declara el proveedor de Wish que deseas utilizar
provider "aws" {
region = "us-east-2"
}
# Declara una VPC
resource "aws_vpc" "s3m-vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = {
"project" = "S3M"
"tuto"="medium"
}
}En la misma carpeta, abre un terminal y ejecuta estos comandos
terraform initEste comando sirve para descargar todas las dependencias de tu proveedor de servicios en la nube (como «npm install» o «dotnet restore» para los desarrolladores, jeje).
plan de Terraform Este comando sirve para crear un plan de ejecución. Terraform realiza una actualización, a menos que se desactive explícitamente, y a continuación determina qué acciones son necesarias para alcanzar el estado deseado especificado en los archivos de configuración.
Puedes saltarte este comando y aplicar directamente tu IaC, pero se recomienda que revises lo que tienes en tu plan y corrijas los errores o fallos antes de aplicar tu infraestructura.
terraform apply
El
terraform applyEl comando se utiliza para aplicar los cambios necesarios para alcanzar el estado deseado de la configuración, o el conjunto predeterminado de acciones generado por unplan de Terraformplan de ejecución.
- Ahora puedes acceder a tu cuenta y comprobar si se ha creado la VPC en laregión us-east-2
- Y, por último, para eliminar lo que has creado, puedes ejecutar este comando:
terraform destroyConsejos para implementar Terraform en arquitecturas complejas
En esta sección, te daré algunosconsejos y trucospara ahorrar tiempo a la hora de programar la infraestructura de unaarquitectura compleja.
A modo de ejemplo, tomaremos el patrón S3M que escribí anteriormente. A modo de recordatorio, esta es la arquitectura:

Consejo 1: Tareas pendientes Lista de Lo queremos😜:
Como puedes ver, para estepatrón necesitamosestosbloques:
- VPC contressubredes (dosprivadas yunapública)
- APIGatewayconenlace VPC
- Autorizador (Lambda yAPI Gateway)
- Clúster ECS FargatconTaskDefinition yService
- NLB (Equilibrador de carga de red con ungrupo de destino)
- S3 parael alojamiento de sitios web estáticos
Consejo 2: Crea un *.tf para cada bloque😄:
- vpc.tf
- api-gateway.tf
- authorizer.tf
- cluster.tf
- load-balancer.tf
- s3.tf
- Para organizar adecuadamente nuestro código, también podemos crear una carpeta para las diferentes políticas (archivos JSON)
Consejo 3: El Magia del copiar y pegar 😅
- Abre la documentación de Terraform para AWS
- Para cada archivo:copia y pegala configuración y adáptala tal y como se muestra en la imagen siguiente:

Así, por ejemplo, elarchivo vpc.tftendrá este aspecto si lo implementamos con elpatrón S3M:
# Declarar una VPC
resource "aws_vpc" "s3m-vpc" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = true
tags = {
"project" = "S3M"
"tuto" = "medium"
}
}
# Declarar todas las zonas de disponibilidad.
# Declarar la primera zona de disponibilidad
resource "aws_subnet" "s3m-public" {
vpc_id = aws_vpc.s3m-vpc.id
cidr_block = "10.0.1.0/24"
availability_zone = var.availability_zone_1
tags = {
"name"="s3m-public"
"project" = "S3M"
"tuto"="medium"
}
}
# Declarar la segunda zona de disponibilidad
resource "aws_subnet" "s3m-private-1" {
vpc_id = aws_vpc.s3m-vpc.id
cidr_block = "10.0.2.0/24"
availability_zone = var.availability_zone_2
tags = {
"name"="s3m-private"
"project" = "S3M"
"tuto"="medium"
}
}
# Declarar la tercera zona de disponibilidad
resource "aws_subnet" "s3m-private-2" {
vpc_id = aws_vpc.s3m-vpc.id
cidr_block = "10.0.3.0/24"
availability_zone = var.availability_zone_3
tags = {
"name"="s3m-private"
"project" = "S3M"
"tuto"="medium"
}
}
# Declarar la puerta de enlace de Internet
resource "aws_internet_gateway" "s3m-igw" {
vpc_id = aws_vpc.s3m-vpc.id
}
# Declarar la IP elástica para la puerta de enlace NAT
resource "aws_eip" "s3m-eip_nat_gateway" {
vpc = true
}
# Declarar la puerta de enlace NAT
resource "aws_nat_gateway" "s3m-ngw" {
allocation_id = aws_eip.s3m-eip_nat_gateway.id
subnet_id = aws_subnet.s3m-public.id
tags = {
"project" = "S3M"
"tuto"="medium"
}
}
# Actualizar la tabla de rutas predeterminada
resource "aws_default_route_table" "s3m-rt-public" {
default_route_table_id = aws_vpc.s3m-vpc.default_route_table_id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.s3m-igw.id
}
}
# Declarar una tabla de rutas privada para redes privadas
resource "aws_route_table" "s3m-rt-private" {
vpc_id = aws_vpc.s3m-vpc.id
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.s3m-ngw.id
}
}
# Declarar la asociación entre subredes privadas y la tabla de rutas privada
# Primera subred privada
resource "aws_route_table_association" "s3m-rta-private-1" {
subnet_id = aws_subnet.s3m-private-1.id
route_table_id = aws_route_table.s3m-rt-private.id
}
# Segunda subred privada
resource "aws_route_table_association" "s3m-rta-private-2" {
subnet_id = aws_subnet.s3m-private-2.id
route_table_id = aws_route_table.s3m-rt-private.id
}Si te estás preguntando: ¿qué hay del orden de implementación? ¿Deberíamos empezar por VPC, ECS, API Gateway o…?
Respuesta: No es tu problema 😝, no tienes que preocuparte por eso 😃, tu trabajo es describir, y el de Terraform es definir la mejor forma de ejecutar tu trabajo 😉
Filosofía DevOps
Definición
¿Qué es realmente DevOps?DevOps no es un puesto de trabajo 😠, sino un conjunto de prácticas que combina el desarrollo de software (Dev) y las operaciones de TI (Ops).
Las iniciativas de DevOps pueden generar cambios culturales en las empresas mediante:
- Transformando la forma en que los equipos de operaciones, los desarrolladores y los evaluadores colaboran durante losprocesosde desarrollo yentrega😃.
- Lograr que estos grupos trabajen de forma coordinada es un reto fundamental en la adopción de DevOps en las empresas 😃.
- DevOps tiene que ver tanto con la cultura como con el conjunto de herramientas.
Así que, cuando algunas empresas buscan un ingeniero de DevOps para sus procesos de trabajo, eso significa que no están preparadas para cambiar su filosofía y su cultura, y esto puede acabar agravando la desconexión entre los desarrolladores y los equipos operativos 😅.
Cadenas de herramientas
Las herramientas de DevOps se enmarcan en una o varias actividades que respaldaniniciativas específicasde DevOps: planificar, crear, verificar, empaquetar, lanzar, configurar, supervisar y controlar versiones. Para obtener más información, haz clicaquí
En este artículo voy a simplificar las cosas centrándome en estas herramientas:Crear (código),Empaquetar (artefacto),Publicar (implementar),Configurar (IaC) y Control de versiones.
Automatízalo todo con GitHub Actions: (Ponte manos a la obra)
Ahora que ya sabesenqué consistenTerraform yDevOps, vamos a automatizarel empaquetado,la publicación yla configuración delproceso de entrega del backend, el frontend y la infraestructura como código (IaC) conGitHub Actions.
GitHub Actionsfacilita la automatización de todos nuestros flujos de trabajo de software conCI/CD. Lo utilizaremos paraempaquetar,publicar yconfigurarnuestro código directamente desdeGitHub.
Requisitos previos:
→ Cuenta de GitHub: necesitarás una cuenta de GitHub para clonar los ejemplos de mi repositorio en el tuyo y así automatizar y crear flujos de trabajo
→ Cuenta gratuita de Terraform: se explica en el repositorio IAC que aparece a continuación
Para la automatización, he creado tres procesos, uno para cada repositorio:
Como puedes ver, para cada repositorio tengo un archivoYAMLubicado en/.github/workflows. Este archivo será interpretado por elflujo de trabajo de GitHub paraejecutar un pipeline que compila y despliega.
Todos los archivos YAML están bien comentados para facilitar su comprensión 😃
- Para IaC: El proceso simplemente aplicará nuestra infraestructura
- Para la API: El procesode integración automatizada creará unaimagen de Dockerconnuestropaquete y la subirá aECR Repo
- Para el sitio web estático: el proceso decompilación creará nuestroproyecto Angularylo implementaráenel alojamiento web estático de S3
Repositorio de IaC:
Para automatizar la implementación de tu código de infraestructura como código (IaC) de Terraform, primero debes crear una cuenta gratuita en Terraform y seguir estos pasos.
1- Crea tu organización

Una vez creada la organización, es el momento de crear el flujo de trabajo
2- Crear el flujo de trabajo
Para ello, haz clic en «Flujo de trabajo basado en API», tal y como se muestra en la imagen siguiente, y crea tu flujo de trabajo

Ponle un nombre a tu espacio de trabajo y créalo

Una vez creado el espacio de trabajo, Terraform generará este código para que lo utilices en tu archivo de configuración principal (main.tf)que se encuentra en tu repositorio.
Así que copia y pega este código (puedes encontrar un ejemplo completoen mi repositorio)
terraform {
backend "remote" {
organization = "nombre de tu organización"
workspaces {
name = "nombre de tu espacio de trabajo"
}
}
}3- Generar un token de API de usuario de Terraform Cloud:
- Ve a:https://app.terraform.io/app/settings/tokensy haz clic en«Crear un token de API»

- Añádele una descripción que te ayude a identificar este token más adelante y haz clic en«Crear token de API»

- Copia el token generado

4- Guarda el token generado como un secreto de GitHub en el repositorio de IaC:

Puedes consultar ladocumentación de GitHub aquí.
5- Almacena las claves de AWS en las variables de entorno de Terraform Cloud:
Tenemos que guardar nuestraclave de accesoynuestra clave secretade AWSenuna variable de entorno de Terraform, de modo que, cuando se ejecute el pipeline de GitHub, utilice estas credenciales paraplanificar yaplicar nuestra infraestructuraa lacuenta de AWS.
Para ello, entra enhttps://learn.hashicorp.com/tutorials/terraform/cloud-workspace-configurey sigue los pasos que se indican a continuación
- Añadir variables de entorno

- Crea estas dos variables de entorno y configúralas comoconfidenciales:

Para obtener más información sobre la gestión de secretos en Terraform, puedes consultar esteblog
6- Ejecuta tu pipeline en GitHub

Repositorio de API:
Tras la implementación de nuestra infraestructura, ahora es el momento de implementar nuestra API; de lo contrario, el pipeline se limitará a enviar una imagen de Docker a ECR (y eso es todo 😄)
No olvides añadirAWS_ACCESS_KEY_ID yAWS_SECRET_ACCESS_KEY enlos secretos de turepositorio de API, y ejecuta el pipeline a través de lapestaña GitHub Actions.
El ejemplo completo se puede encontrar aquí

Repositorio de sitios web estáticos:
Dado que no hemos asociado un nombre de dominio personalizado a nuestraAPI Gateway, debemos copiar elpunto final generadopor nuestra implementación de IaC y pegarlo en la variable de entorno delsitio web estático
Otra opción, algo más complicada, es almacenar la variable de entorno en un gestor de configuración (como AWS Secrets Manager) o utilizar herramientas independientes de la nube, comoSOPS.
1- Ve alpanel de control deAPIGateway, haz clic en laAPI creada, ve a«Stages» ycopia elpunto final

2- Ve alrepositorio de tusitio web estático, actualiza el archivo de entorno y realiza una confirmación

3 - Ejecuta tu pipeline (no olvides añadirAWS_ACCESS_KEY_ID y AWS_SECRET_ACCESS_KEY enlos secretos de tu repositorio de API, y ejecuta el pipeline a través de la pestaña GitHub Actions)
4 - Comprueba si todo funciona correctamente accediendo alpunto de conexión de tusitio web estático de S3, copiando el enlace, pegándolo en tu navegador y haciendo clic en el botón«Obtener el tiempo»


¡Genial! Todo se automatizó y funcionó de maravilla 😄
Conclusión
En la vida real,programar ygestionar elcódigo fuente de lainfraestructura esalgo fantástico, ya que permite alarquitecto de la empresa realizar unseguimientodetodoslos conjuntos de cambios yaplicar únicamente los cambios necesarios sin alterar toda la arquitectura de la infraestructura.
En la vida real,programar ygestionar elcódigofuente de la infraestructuraes algo fantástico, ya que permite alarquitecto de la empresa estar aldía de todos los cambios y aplicar solo lasactualizaciones necesarias sinafectar al conjunto del sistema.
La filosofíadeIaC tambiénfacilita laportabilidad delasinfraestructuras:
- Entrediferentes proveedores de servicios en la nube
- Entre diferentesentornos delmismoproveedor de serviciosen la nube
Al combinar IaC conla verdadera filosofía DevOps, ahorramos mucho más tiempo enla ejecución delos procesosy, al mismo tiempo,mantenemos unamejorcalidad delcódigo.
Si eres nuevo en estas tecnologías(AWS, IaC, DevOps), este blog te ayudará a comprender la secuencia de los diferentes componentes(AWS, IaC,DevOps)y te evitará tener que seguir un montón de tutoriales y dispersarte en todas direcciones.
Por cierto, quiero dar las gracias a Soufian Belehrache por su asesoramiento técnico.
Si tienes algún comentario o hay algo que no te queda claro, deja un comentario o ponte en contacto conmigo a través de mipágina de Facebook,Twitter omi sitio web.
Por último, tengo un reto para ti:
- Crea una cuenta de GitHub si aún no tienes una
- Crea una cuenta gratuita de Terraform
- Pon en práctica lo que has aprendido en esta historia «Sección Automatizarlo todo con GitHub Actions: (Ponte manos a la obra)»
- Buena suerte
Nos vemos en la próxima historia ✌️.
