Cuando defines variables y valores en Terraform, cada uno tiene un tipo de dato: indica qué clase de información contiene (un texto, un número, una lista…). Conocer los tipos te ayuda a escribir código correcto y a entender los ejemplos que encuentres. Es un tema sencillo y muy parecido a los tipos de cualquier lenguaje de programación.

Por qué importan los tipos

Declarar el tipo de una variable tiene dos ventajas:

  1. Claridad: quien lee el código sabe qué espera cada variable.
  2. Validación: Terraform avisa si pasas un valor del tipo equivocado (por ejemplo, un texto donde se esperaba un número), evitando errores.

Los tipos se dividen en simples (un solo valor) y complejos (colecciones de valores).

Tipos simples (primitivos)

string — texto

Cualquier texto, entre comillas dobles.

variable "region" {
  type    = string
  default = "eu-west-1"
}

Ejemplos de valores: "hola", "t3.micro", "eu-west-1".

number — números

Números, enteros o decimales, sin comillas.

variable "cantidad_servidores" {
  type    = number
  default = 3
}

Ejemplos: 3, 0, 2.5, 100.

bool — verdadero o falso

Un valor lógico: true (verdadero) o false (falso). Útil para activar/desactivar cosas.

variable "habilitar_monitorizacion" {
  type    = bool
  default = true
}

Ejemplo de uso: una variable bool puede decidir si se crea un recurso o no, o si se activa una opción. Por ejemplo, «¿activar Multi-AZ en la base de datos? true/false».

Tipos complejos (colecciones)

Estos agrupan varios valores. Son muy útiles para configuraciones reales.

list — una lista ordenada de valores

Una secuencia de valores del mismo tipo, en orden, entre corchetes [ ].

variable "zonas_disponibilidad" {
  type    = list(string)
  default = ["eu-west-1a", "eu-west-1b", "eu-west-1c"]
}

Esto es una lista de textos. list(string) significa «una lista de strings». Accedes a sus elementos por posición (empezando en 0): el primero es var.zonas_disponibilidad[0].

Ejemplo real: una lista de las zonas de disponibilidad donde quieres desplegar (recuerda el Capítulo 3), o una lista de puertos a abrir.

map — pares clave-valor

Una colección de parejas «clave = valor», entre llaves { }. Como un diccionario donde buscas un valor por su clave.

variable "tipos_por_entorno" {
  type = map(string)
  default = {
    dev  = "t3.micro"
    prod = "m5.large"
  }
}

Accedes a un valor por su clave: var.tipos_por_entorno["prod"] devuelve "m5.large".

Ejemplo real: asignar un tamaño de instancia distinto a cada entorno, o un conjunto de etiquetas (tags) para tus recursos.

object — una estructura con campos definidos

Un objeto agrupa varios valores de distintos tipos bajo nombres de campo concretos. Es como una ficha con campos.

variable "config_servidor" {
  type = object({
    tipo       = string
    cantidad   = number
    monitoreo  = bool
  })
  default = {
    tipo      = "t3.micro"
    cantidad  = 2
    monitoreo = true
  }
}

Accedes a un campo con un punto: var.config_servidor.tipo devuelve "t3.micro".

Diferencia map vs object:

  • Un map tiene claves libres y todos los valores del mismo tipo.
  • Un object tiene campos predefinidos con nombres y tipos concretos (pueden ser distintos entre sí).

Tabla resumen

Tipo Qué guarda Ejemplo
string Texto "eu-west-1"
number Número 3, 2.5
bool Verdadero/falso true
list Lista ordenada, mismo tipo ["a", "b", "c"]
map Pares clave-valor, mismo tipo { dev = "t3.micro" }
object Estructura con campos definidos { tipo = "x", num = 2 }

El tipo any y la inferencia

  • Si no estás seguro del tipo, existe any (acepta cualquier tipo), pero es mejor ser específico cuando puedas.
  • Si no declaras el tipo, Terraform a menudo lo deduce del valor por defecto. Aun así, declarar el tipo es buena práctica porque documenta y valida.

Un ejemplo realista combinando tipos

variable "config_red" {
  type = object({
    cidr        = string
    azs         = list(string)
    nat_activo  = bool
    tags        = map(string)
  })
  default = {
    cidr       = "10.0.0.0/16"
    azs        = ["eu-west-1a", "eu-west-1b"]
    nat_activo = true
    tags = {
      Proyecto = "tienda"
      Entorno  = "dev"
    }
  }
}

Aquí un solo objeto describe toda la configuración de una red: su rango (string), sus zonas (list), si tiene NAT (bool) y sus etiquetas (map). Esto es muy parecido a cómo se configuran cosas en proyectos reales.

Lo que debes recordar

  • Cada valor en Terraform tiene un tipo. Declararlo aporta claridad y validación.
  • Tipos simples: string (texto), number (números), bool (true/false).
  • Tipos complejos: list (lista ordenada del mismo tipo), map (pares clave-valor del mismo tipo), object (estructura con campos definidos de distintos tipos).
  • map vs object: el map tiene claves libres y valores del mismo tipo; el object tiene campos predefinidos con tipos concretos.
  • Declarar tipos es buena práctica, aunque Terraform a veces los deduzca.

En el siguiente subcapítulo veremos cómo trabajar con estos valores mediante expresiones, referencias y funciones integradas de Terraform.

Cloud, AWS & Terraform — De cero a experto

Capítulo 1 · Qué es el cloud computing

Capítulo 2 · El mercado cloud y los grandes proveedores

Capítulo 3 · Regiones, zonas de disponibilidad y edge

Capítulo 4 · Cómputo: EC2

Capítulo 5 · Almacenamiento: S3

Capítulo 6 · Redes: VPC

Capítulo 7 · Identidad y acceso: IAM

Capítulo 8 · Bases de datos gestionadas

Capítulo 9 · Por qué Infraestructura como Código

Capítulo 10 · HCL: el lenguaje de Terraform

Capítulo 11 · Providers y estado

Capítulo 12 · Tu primera infraestructura real en Terraform

Capítulo 13 · Balanceo de carga y autoescalado

Capítulo 14 · Serverless con Lambda

Capítulo 15 · Mensajería y eventos

Capítulo 16 · Entrega de contenido y DNS

Capítulo 17 · Contenedores en AWS

Capítulo 18 · Módulos: reutilización y composición

Capítulo 19 · Workspaces y gestión de entornos

Capítulo 20 · Backends remotos y locking

Capítulo 21 · Testing de infraestructura

Capítulo 22 · Terraform en CI/CD

Capítulo 23 · Seguridad en profundidad

Capítulo 24 · Observabilidad: logs, métricas y trazas

Capítulo 25 · Optimización de costes

Capítulo 26 · Alta disponibilidad y disaster recovery

Capítulo 27 · Well-Architected Framework de AWS

Capítulo 28 · Arquitecturas serverless a escala

Capítulo 29 · Plataformas de datos en AWS

Capítulo 30 · Multi-cuenta y landing zones

Capítulo 31 · Platform Engineering e Internal Developer Platform

Capítulo 32 · Certificaciones AWS relevantes

Capítulo 33 · Proyectos para consolidar lo aprendido

Capítulo 34 · Recursos y comunidad

© Copyright 2024. Todos los derechos reservados