Terraform
En la era de la computación en la nube y el aprovisionamiento dinámico de recursos, las empresas buscan herramientas que les permitan gestionar su infraestructura de manera eficiente, reproducible y segura. Una de las soluciones más populares que ha revolucionado la forma en que construimos y desplegamos infraestructura es Terraform.
Terraform es una herramienta de código abierto desarrollada por HashiCorp y lanzada en 2014. Su propósito es permitir a los administradores de sistemas, equipos DevOps e ingenieros de nube definir, aprovisionar y gestionar infraestructura usando un lenguaje declarativo. Esta filosofía se conoce como Infraestructura como Código (IaC).
En lugar de crear manualmente recursos como instancias virtuales, redes o balanceadores de carga, Terraform permite describirlos en archivos de texto plano. Al ejecutar estos archivos, Terraform se encarga de crear o modificar la infraestructura para que coincida con el estado deseado.

Terraform vs Ansible
Terraform
Terraform es una herramienta de provisionamiento de infraestructura como código.
Su función principal es crear, cambiar y destruir infraestructura (máquinas virtuales, redes, balanceadores, etc.) en la nube o entornos locales.
- ∘ Se enfoca en declarar el estado deseado y Terraform se encarga de alcanzarlo.
- ∘ Usa archivos .tf (HCL, HashiCorp Configuration Language).
- ∘ Es idempotente (si algo ya existe como lo pediste, no lo toca).
- ∘ Ideal para: crear instancias en AWS, configurar redes, balanceadores, etc.
Ansible
Ansible es una herramienta de automatización de configuración y despliegue, desarrollada por Red Hat. Su fuerte es aplicar configuraciones sobre sistemas ya existentes: instalar software, copiar archivos, iniciar servicios, etc.
- ∘ Usa archivos YAML llamados playbooks.
- ∘ No necesita agentes instalados (usa SSH por defecto).
- ∘ También puede hacer provisionamiento (limitado), pero su fuerte es la configuración y orquestación.
Ejemplo:
- Terraform crea 10 máquinas en AWS.
- Ansible entra por SSH y les instala Docker, NGINX y configura los firewalls.

Componentes principales
Terraform se compone de varios elementos esenciales:
- ⌭
Providers: Los providers son plugins que permiten a Terraform interactuar con distintas plataformas y servicios como AWS, Azure, Google Cloud, VMware, GitHub, Kubernetes y muchos otros. Cada proveedor expone recursos que Terraform puede gestionar. - ⌭
Resources: En Terraform, los resources o recursos son los bloques fundamentales que describen los elementos de infraestructura que se quieren crear, modificar o eliminar. Cada bloque resource declara un tipo de recurso (como aws_instance, azurerm_storage_account o google_compute_network) y un nombre lógico para identificarlo dentro del proyecto. Estos recursos están ligados a proveedores (providers) y definen las propiedades necesarias para que Terraform pueda interactuar con la API del servicio correspondiente. A través de los recursos, se describe la infraestructura deseada en un lenguaje declarativo, y es Terraform quien se encarga de aplicarlo en el proveedor correspondiente. Por ejemplo, un recurso puede representar una instancia de máquina virtual, un bucket de almacenamiento o un grupo de seguridad, entre muchos otros. Al definir recursos, Terraform genera una representación del estado deseado de la infraestructura, y al aplicar los cambios, compara ese estado con el real, ajustando lo necesario para que coincidan. Esto hace posible automatizar el despliegue, mantenimiento y eliminación de componentes de forma segura y repetible. - ⌭
Modules: Los módulos son bloques reutilizables de configuración de Terraform. Permiten estructurar y reutilizar código para gestionar partes complejas de infraestructura como un clúster completo o una arquitectura multi-nivel. - ∘
main.tf: Archivo principal donde se definen los recursos. - ∘
variables.tf: Definición de variables de entrada. - ∘
outputs.tf: Definición de outputs que el módulo devolverá. - ⌭
Variables: En Terraform, las variables de entrada permiten que las configuraciones sean reutilizables y dinámicas, ya que separan la definición de los recursos de los valores concretos que estos deben utilizar. Dentro de un módulo, el archivo variables.tf se encarga de definir las variables que ese módulo necesita para funcionar, utilizando bloques variable que establecen su tipo, posibles valores por defecto o descripciones. Por otro lado, fuera del módulo, los valores concretos que se asignan a esas variables suelen estar en un archivo con extensión .tfvars, el cual sirve para parametrizar la infraestructura según el entorno deseado. - ⌭
State file (terraform.tfstate): En Terraform, el archivo de estado o state file (terraform.tfstate) es un componente fundamental que mantiene un registro de la infraestructura real que ha sido creada. Este archivo actúa como una fuente de verdad para Terraform, permitiéndole saber qué recursos existen, cuáles fueron sus valores en la última ejecución, y cómo se relacionan entre sí. Gracias a este archivo, Terraform puede hacer operaciones diferenciales: es decir, comparar el estado actual con el deseado (definido en los archivos .tf) y aplicar únicamente los cambios necesarios. El archivo de estado puede almacenarse localmente o en servicios remotos como AWS S3 o Terraform Cloud, lo cual es importante en equipos de trabajo para evitar conflictos. - ⌭
Outputs: Los outputs son valores que Terraform puede devolver al finalizar la ejecución. Son útiles para compartir información entre módulos o para mostrar datos relevantes al usuario.


En Terraform se separan los módulos reutilizables de la configuración principal (o root module). Un módulo puede ser cualquier conjunto de archivos .tf dentro de una carpeta que define recursos específicos, como una red, una instancia EC2, etc.
Dentro de un módulo:

De este modo, aunque ambos archivos están relacionados con las variables de entrada, cumplen funciones diferentes: uno define las variables, y el otro les proporciona valores específicos. Esta separación permite reutilizar módulos con diferentes configuraciones dependiendo del entorno (como desarrollo, pruebas o producción), sin necesidad de duplicar código. Los valores también pueden ser pasados desde la línea de comandos o mediante variables de entorno, lo que ofrece flexibilidad adicional para automatizar y gestionar despliegues en múltiples contextos.


Además, como el archivo puede contener datos sensibles (como IPs, contraseñas o tokens), es fundamental gestionarlo con cuidado, aplicando cifrado y control de acceso cuando se almacena de forma remota. El state file no solo permite a Terraform tener memoria de lo que ha hecho, sino que también garantiza consistencia, automatización y precisión en la gestión de la infraestructura.


¿Cómo funciona?
Terraform sigue un flujo muy específico de trabajo:
- ⍚
Escritura: Se define el estado deseado de la infraestructura en archivos .tf usando el lenguaje HCL (HashiCorp Configuration Language). - ⍚
Planificación: Terraform analiza las configuraciones y muestra los cambios que aplicaría sin hacerlos aún. - ⍚
Aplicación: Ejecuta los cambios necesarios para que la infraestructura coincida con lo definido. - ⍚
Seguimiento: El archivo terraform.tfstate se actualiza con la información actual de los recursos. - ⍚
Destrucción: Borra todos los recursos creados, si se desea desmontar la infraestructura.

Casos típicos de uso
Terraform es extremadamente versátil. Algunos ejemplos reales de su aplicación son:
- ∘
Provisionamiento en la nube: Crear instancias EC2, balanceadores y VPCs en AWS con solo un archivo de configuración. - ∘
Gestión multi-cloud: Controlar infraestructura en varios proveedores (como AWS + GCP) desde un solo conjunto de archivos. - ∘
CI/CD en infraestructura: Integrar Terraform en pipelines para desplegar infraestructuras automáticamente cuando hay cambios en la configuración. - ∘
Kubernetes y contenedores: Automatizar la creación de clústeres Kubernetes y sus configuraciones de red, almacenamiento, etc. - ∘
Laboratorios de pruebas: Levantar entornos temporales para pruebas automatizadas y destruirlos al finalizar.

Configuración
Instalar Terraform en Windows
Para descargar Terraform en Windows de 64 bits, dirígete a la página oficial de descargas de Terraform. Una vez allí, localiza la sección correspondiente a Windows y haz clic en la opción de descarga para la versión de 64 bits, lo que iniciará la descarga del archivo
Una vez descargado el archivo
Para que puedas ejecutar Terraform desde cualquier línea de comandos en tu sistema Windows, es necesario agregar la ubicación del ejecutable
Instalar AWS CLI en Windows
Para descargar el instalador de la AWS CLI versión 2 en Windows, dirígete a AWS. En esa página, localiza y descarga el archivo con extensión
Una vez que hayas descargado el archivo de la AWS CLI v2, localízalo en tu sistema y haz doble clic sobre él para iniciar el asistente de instalación. Sigue las instrucciones que aparecerán en pantalla para completar el proceso de instalación de la AWS CLI en tu computadora.
- ∘ AWS Access Key ID
- ∘ AWS Secret Access Key
- ∘ Región por defecto (ej. us-east-1)
- ∘ Formato de salida (ej. json)

Configurar el Acceso a AWS
Para crear una cuenta de AWS, el primer paso es dirigirte a AWS y hacer clic en el botón "Crear una cuenta de AWS" o similar. Deberás proporcionar una dirección de correo electrónico, crear una contraseña y seguir las instrucciones para completar el registro, que incluye proporcionar información de contacto y un método de pago.
Una vez que tengas tu cuenta de AWS, para crear un par de claves de acceso que Terraform pueda usar, sigue estos pasos:
Inicia sesión en la Consola de Administración de AWS: Ve a la consola de AWS (Consola de AWS) e inicia sesión con las credenciales de tu cuenta.Busca el servicio IAM: En la barra de búsqueda, escribe "IAM" y selecciona el servicio "IAM" (Identity and Access Management).Usuarios: En el panel de navegación izquierdo, haz clic en "Personas" (Users).Añadir usuario: Haz clic en el botón "Crear persona" (Add Users).Nombre de usuario: Ingresa un nombre para el usuario (por ejemplo, "terraform-user").Permisos: Define los permisos que este usuario tendrá. Para Terraform, lo ideal es crear un grupo con los permisos necesarios (por ejemplo, para crear y gestionar recursos de EC2, S3, etc.) y añadir el usuario a ese grupo.Selecciona el usuario: Haz clic en el nombre del usuario para el que deseas crear las claves de acceso (por ejemplo, "terraform-user"). Esto te llevará a la página de detalles de ese usuario.Crear clave de acceso: Dentro de la página de detalles del usuario de IAM, localiza y haz clic en la pestaña o sección denominada "Credenciales de seguridad", luego desplázate hacia abajo hasta encontrar la sección "Claves de acceso (clave de acceso e ID secreto)" y haz clic en el botón "Crear clave de acceso". En la siguiente pantalla, AWS te preguntará sobre el caso de uso; para Terraform (que utiliza la AWS CLI por debajo), selecciona la opción "Interfaz de línea de comandos (CLI)", marca la casilla de verificación para confirmar el acuerdo con las prácticas recomendadas y luego puedes ingresar una etiqueta opcional para la clave, como "clave-terraform", en el campo de "Descripción (opcional)". Finalmente, haz clic en "Crear clave de acceso" para generar el ID de clave de acceso y la clave secreta de acceso. Asegúrate de descargar el archivo .csv haciendo clic en "Descargar archivo .csv" o copiar ambas claves y guardarlas en un lugar seguro de inmediato, ya que no podrás acceder a la clave secreta nuevamente.Configura Terraform: Utiliza el "ID de clave de acceso" y la "clave secreta de acceso" en tu configuración de Terraform para la autenticación en AWS.
Para crear un grupo de permisos en IAM, haz clic en el botón "Crear grupo" e ingresa un nombre descriptivo, como "terraform-administrators", en el campo correspondiente. Luego, en la sección "Adjuntar políticas de permisos", busca y selecciona la política "AdministratorAccess" marcando la casilla junto a ella, teniendo en cuenta que esta política otorga permisos administrativos completos y debe usarse con precaución, aunque puede ser conveniente para entornos de aprendizaje o personales. Finalmente, revisa la información del grupo y haz clic en el botón "Crear grupo" para completar el proceso.
Y asegúrate de añadir al usuario que estás creando a este grupo después de finalizar el asistente.

Comandos Básicos
Obtener el Subnet ID (identificador único de una subred) para AWS
Aquí te explico cómo sería el flujo para crear la subred y luego obtener su ID:
Navega al servicio VPC (Virtual Private Cloud): Busca "VPC" en la barra de búsqueda o encuéntralo en la sección "Redes y contenido".Crear VPC: En la página "Tus VPC", haz clic en el botón "Crear VPC". Y para una configuración básica, selecciona "VPC solamente".Configura la VPC: - ∘ Ingresa un nombre descriptivo para tu VPC (ejemplo: terraform-vpc).
- ∘ Define el rango de direcciones IP privadas para tu VPC (ejemplo: 10.0.0.0/24). Elige un rango que se ajuste a tus necesidades y que no se superponga con otras redes.
- ∘ Tenencia puedes dejarlo en "Predeterminado".
Haz clic en "Subredes": En el panel de navegación izquierdo, selecciona "Subredes".Crea la subred: Haz clic en el botón "Crear subred".Configura la subred: En la página de creación de la subred, deberás especificar la siguiente información:- ∘ Nombre de la subred (opcional).
- ∘ ID de la VPC (selecciona la VPC donde deseas crear la subred). En este caso terraform-vpc.
- ∘ Elige la zona de disponibilidad en la que quieres que resida la subred (ejemplo: us-east-2a).
- ∘ Define el rango de direcciones IP privadas para tu subred (ejemplo: 10.0.0.0/28). Asegúrate de que este rango no se superponga con otros rangos de CIDR en tu VPC.
Haz clic en "Crear subred": Una vez que hayas configurado los detalles de tu nueva subred, haz clic en el botón "Crear subred" en la parte inferior de la página.Localiza la subred creada y obtén su ID: Después de crear la subred, volverás a la lista de subredes. Busca la subred que acabas de crear por su nombre o el rango CIDR que especificaste. La columna "ID de subred" ahora mostrará el identificador único asignado a esta nueva subred (por ejemplo, subnet-xxxxxxxxxxxxxxxxx). Este es el ID que necesitas obtener.

Crear una instancia EC2 con Terraform
Amazon Web Services (AWS) ofrece una capa gratuita que permite a los nuevos usuarios utilizar ciertos servicios sin costo durante 12 meses. Uno de estos servicios es la instancia EC2 t2.micro, una pequeña máquina virtual ideal para hacer pruebas, aprender, y levantar pequeños servidores. En esta guía, veremos cómo usar Terraform para crear automáticamente una de estas instancias, aprovechando esa capa gratuita.
Con este proyecto, se desplegará una máquina virtual EC2 dentro de AWS. Esta máquina tendrá un sistema operativo (Ubuntu Server 24.04 LTS) y estará alojada en una región específica, lista para recibir conexiones por SSH si así se configura. Todo el proceso es automatizado gracias a Terraform, una herramienta de infraestructura como código.
Para visualizar las AMIs (Amazon Machine Images) elegibles para la capa gratuita sin necesidad de crear una instancia EC2, navega al servicio EC2 dentro de la Consola de Administración de AWS, haz clic en "Instances" en el menú de la izquierda y luego selecciona el botón "Launch instance"; en la página "Choose an Amazon Machine Image (AMI)", examina la lista de AMIs básicas como Amazon Linux, Ubuntu o Windows Server, buscando la etiqueta "Free tier eligible" que indica su elegibilidad para la capa gratuita, la cual suele aparecer justo debajo del nombre de la AMI o en una columna adyacente.
Puedes ver los detalles de la capa gratuita de AWS (AWS Free Tier) directamente en la página oficial de Amazon Web Services.
❏ Crea un archivo llamado
Abre una ventana de terminal o símbolo del sistema y navega hasta el directorio donde guardaste tu archivo de configuración principal de Terraform, usualmente llamado main.tf. Una vez dentro de esa carpeta, podrás ejecutar los comandos de Terraform.
Este ejemplo crea una instancia básica sin una clave SSH ni grupo de seguridad específico. Si quieres acceder por SSH o exponer puertos como el 22 o el 80, deberías definir un key_name y un security_group también con Terraform. Y aunque t2.micro es gratis durante los primeros 12 meses, si olvidas destruir la instancia, podrías empezar a generar cargos si cambias de tipo o pasa el año gratuito.

Crear una instancia EC2 con Terraform de Cero
Con Terraform podemos crear una infraestructura completa desde cero, incluyendo una red virtual (VPC), subredes, reglas de firewall (grupos de seguridad), y finalmente una instancia EC2 gratuita.
A continuación, se muestra la estructura de los archivos para crear los siguientes recursos en AWS: una VPC personalizada con el rango de red 10.0.0.0/16, una subred pública dentro de esta VPC, un Internet Gateway y una tabla de ruteo configurada para permitir la salida a internet. Adicionalmente, se provisionará un grupo de seguridad que habilitará conexiones SSH a través del puerto 22 y, finalmente, una instancia EC2 de tipo t2.micro será lanzada dentro de la subred pública con acceso desde internet. Si se desea habilitar el acceso SSH a la instancia mediante una clave, se puede especificar el key_name de una clave SSH existente en AWS. Es crucial marcar las claves de acceso de AWS (como aws_access_key y aws_secret_key) como sensitive dentro de la configuración de Terraform para evitar que se muestren en los logs o la salida de la consola, protegiendo así información confidencial.
❏ Crea un archivo llamado
❏ Crea un archivo llamado
❏ Crea un archivo llamado
❏ Crea un archivo llamado

Ejemplo Avanzado
Funciones de Terraform
Las funciones en Terraform se utilizan principalmente dentro de las expresiones de configuración para manipular valores, realizar cálculos, transformar datos y tomar decisiones dinámicas al definir la infraestructura.
- ✧
Funciones comunes: - ∘
file(path): Lee el contenido de un archivo local. - ∘
length(list): Retorna el número de elementos en una lista. - ∘
concat(list1, list2): Une dos listas en una sola. - ∘
join(separator, list): Une los elementos de una lista con un separador. - ∘
split(separator, string): Divide un string en una lista usando un separador. - ∘
lookup(map, key, default): Busca un valor en un mapa; si no existe, devuelve un valor por defecto. - ∘
element(list, index): Devuelve el elemento de una lista en una posición específica. - ∘
cidrsubnet(cidr, newbits, netnum): Calcula subredes a partir de un CIDR base. - ∘
basename(path): Extrae el nombre del archivo de una ruta. - ∘
format(format_string, values...): Formatea un string como con printf. - ✧
Funciones de manipulación de cadenas: - ∘
join(delimiter, list): Concatena los elementos de una lista de cadenas en una sola cadena, utilizando un delimitador especificado. - ∘
split(delimiter, string): Divide una cadena en una lista de subcadenas utilizando un delimitador especificado. - ∘
lower(string): Convierte una cadena a minúsculas. - ∘
upper(string): Convierte una cadena a mayúsculas. - ∘
replace(string, substring, replacement): Reemplaza todas las ocurrencias de una subcadena dentro de una cadena con otra subcadena. - ∘
substring(string, offset, length): Extrae una subcadena de una cadena dada. - ∘
trim(string, chars): Elimina los caracteres especificados del inicio y del final de una cadena. - ✧
Funciones numéricas: - ∘
abs(number): Devuelve el valor absoluto de un número. - ∘
ceil(number): Devuelve el entero menor o igual al número dado. - ∘
floor(number): Devuelve el entero mayor o igual al número dado. - ∘
max(numbers...): Devuelve el valor más grande de un conjunto de números. - ∘
min(numbers...): Devuelve el valor más pequeño de un conjunto de números. - ∘
round(number): Redondea un número al entero más cercano. - ✧
Funciones de colección (listas y mapas): - ∘
length(collection): Devuelve el número de elementos en una lista o el número de claves en un mapa. - ∘
element(list, index): Devuelve el elemento en el índice especificado de una lista. - ∘
slice(list, start, end): Devuelve una porción de una lista. - ∘
keys(map): Devuelve una lista de las claves de un mapa. - ∘
values(map): Devuelve una lista de los valores de un mapa. - ∘
merge(map1, map2, ...): Combina varios mapas en uno solo. - ∘
tolist(set): Convierte un conjunto en una lista. - ∘
toset(list): Convierte una lista en un conjunto (eliminando duplicados). - ✧
Funciones de lógica y comparación: - ∘
contains(collection, value): Indica si una colección contiene un valor específico. - ∘
startswith(string, prefix): Indica si una cadena comienza con un prefijo específico. - ∘
endswith(string, suffix): Indica si una cadena termina con un sufijo específico. - ∘
equal(a, b): Compara si dos valores son iguales. - ∘
not_equal(a, b): Compara si dos valores no son iguales. - ✧
Funciones de codificación: - ∘
base64encode(string): Codifica una cadena en Base64. - ∘
base64decode(string): Decodifica una cadena desde Base64. - ∘
jsonencode(value): Codifica un valor en formato JSON. - ∘
jsondecode(string): Decodifica una cadena JSON en un valor de Terraform. - ✧
Funciones de fecha y tiempo: - ∘
timestamp(): Devuelve la hora actual en formato RFC3339. - ∘
formatdate(format, timestamp): Formatea una marca de tiempo en un formato específico. - ✧
Otras funciones importantes: - ∘
lookup(map, key, default): Busca un valor en un mapa usando una clave. Si la clave no existe, devuelve un valor predeterminado (si se proporciona). - ∘
default(value, default_value): Devuelve el valor dado si no es nulo ni una cadena vacía; de lo contrario, devuelve el valor predeterminado. - ∘
file(path): Lee el contenido de un archivo local. - ∘
filebase64(path): Lee el contenido de un archivo local y lo codifica en Base64. - ∘
cidrsubnet(ip_range, new_bits, netnum): Calcula una subred dentro de un rango CIDR dado. - ∘
cidrhost(ip_range, hostnum): Calcula una dirección IP dentro de un rango CIDR dado. - ∘
uuid(): Genera un identificador único universal (UUID).
Todas las funciones están bien explicadas en la documentación oficial.
Despliegue de infraestructura en AWS
Terraform creará múltiples instancias EC2 basadas en una lista de nombres de servicios, cada una con una IP pública, en una red virtual (VPC) con subredes públicas y un grupo de seguridad que permite tráfico HTTPS. Se usan variables para manejar credenciales de forma segura y se configuran etiquetas y grupos de logs en CloudWatch para cada instancia. Además, se definen módulos externos para gestionar la red (VPC) y los grupos de seguridad, y se genera una salida con las IPs privadas de las instancias, todo organizado de forma modular y reutilizable.
❏ Crea un archivo llamado
❏ Crea un archivo llamado
❏ Crea un archivo llamado
❏ Crea un archivo llamado
¿Qué es un módulo en Terraform?
Un módulo en Terraform es simplemente un conjunto de archivos .tf organizados en una carpeta, que encapsulan recursos reutilizables. Es como una función en programación: define lógica que puedes reutilizar muchas veces con diferentes parámetros.
Terraform ya tiene muchos módulos oficiales y comunitarios publicados en Terraform Registry.
❏ Crea un archivo llamado

Backend y Workspace
En Terraform, el backend es el componente que define dónde y cómo se guarda el estado de la infraestructura (el archivo terraform.tfstate). Por defecto, Terraform lo guarda localmente, pero puedes configurar un backend remoto (como S3, Consul, o Terraform Cloud) para compartir el estado entre equipos, habilitar bloqueo de estado y mejorar la colaboración.
Por otro lado, los workspaces permiten tener múltiples versiones del estado dentro del mismo backend, lo que es útil, por ejemplo, para gestionar distintos entornos como dev, staging y prod sin duplicar código. Cada workspace mantiene su propio estado, por lo que puedes aplicar la misma configuración pero con recursos separados según el entorno.
