Meta-Argumentos en Terraform

Argumentos Meta en Terraform

  • count Crear recursos similares
  • for_each Crear recusros similares
  • depends_on Definir dependencias
  • provider Opciones de proveedor
  • lifecycle Comportamiento de ciclo de vida
Argumento Ámbito Notas
count recurso, módulo Crea múltiples recursos similares usando count.index como referencia
for_each recurso, módulo Acepta set(string) o map(string)
depends_on recurso, módulo Gestiona dependencias no inferidas automáticamente
provider recurso, módulo Especifica proveedores personalizados
lifecycle recurso, módulo Controla comportameinto de ciclo de vida

Crear réplicas con count

# versión.tf
terraform {
  required_version = ">=1.2.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "4.25.0"
    }
  }
}

# Configurar proveedor
provider "aws" {
  region     = "us-east-1"
  access_key = "clave_acceso"
  secret_key = "clave_secreta"
}

# recursos.tf
locals {
  dominios = ["servidor1", "servidor2", "servidor3"]
}

resource "aws_route53_record" "registro" {
  count   = length(local.dominios)
  zone_id = "Z123456789"
  name    = "${local.dominios[count.index]}.dominioejemplo.com"
  type    = "A"
  ttl     = 300
  records = ["192.168.1.10"]
}

Crear réplicas con for_each

locals {
  dominios = toset(["servidor1", "servidor3"])
}

resource "aws_route53_record" "registro_each" {
  for_each = local.dominios
  zone_id  = "Z123456789"
  name     = "${each.value}.dominioejemplo.com"
  type     = "A"
  ttl      = 300
  records  = ["192.168.1.10"]
}

Bloques dinámicos

locals {
  reglas_seguridad = [
    { puerto = 8080, protocolo = "tcp" },
    { puerto = 443, protocolo = "tcp" }
  ]
}

resource "aws_security_group" "ejemplo" {
  name = "grupo-seguridad"

  dynamic "ingress" {
    for_each = local.reglas_seguridad
    content {
      from_port   = ingress.value.puerto
      to_port     = ingress.value.puerto
      protocol    = ingress.value.protocolo
      cidr_blocks = ["0.0.0.0/0"]
    }
  }
}

Gestionar dependencias

resource "aws_s3_bucket" "almacenamiento" {
  bucket = "bucket-ejemplo"
}

resource "aws_s3_bucket_object" "archivo" {
  bucket = aws_s3_bucket.almacenamiento.bucket
  key    = "archivo.txt"
  source = "ruta/archivo.txt"
  
  depends_on = [aws_s3_bucket.almacenamiento]
}

Proveedores personalizados

provider "aws" {
  alias  = "europa"
  region = "eu-west-1"
}

resource "aws_instance" "servidor_eu" {
  provider = aws.europa
  ami      = "ami-123456"
  instance_type = "t2.micro"
}

Configuración de ciclo de vida

resource "aws_db_instance" "basedatos" {
  engine         = "mysql"
  instance_class = "db.t2.micro"
  
  lifecycle {
    prevent_destroy = true
    ignore_changes  = [engine_version]
  }
}

Etiquetas: Terraform count for_each dynamic_blocks aws_route53

Publicado el 8-12 04:39