Trabajando con ciclos en Terraform

Hay ocasiones donde es necesario crear varios elementos a la vez por medio de un script de Terraform piensa en escenarios donde quieres crear múltiples máquinas virtuales. Quizá también diferentes cuentas de almacenamiento, múltiples aplicaciones de funciones, no lo sé, hay muchísimos escenarios en donde no quieres escribir lo mismo solo por una variable diferente. Para esos casos tenemos una sentencia cíclica.

For each

A partir de la versión 0.12 las sentencias cíclicas aparecieron para hacerle frente a este tipo de escenarios. Pongamos un caso muy simple pero a la vez ilustrativo. Vamos a crear una cuenta de almacenamiento que requiera cuatro contenedores de blob para fines diferentes.

Comenzaré por el script para crear la cuenta de almacenamiento, aquí tienes el archivo main.tf.

provider "azurerm" {
version = "2.5.0"
features {}
}
 
resource "azurerm_resource_group" "rg" {
name = var.resource_group_name
location = var.location
 
tags = {
environment = var.tag_env
}
}
 
resource "azurerm_storage_account" "storage" {
name = var.sta_name
resource_group_name = azurerm_resource_group.rg.name
location = azurerm_resource_group.rg.location
account_tier = "Standard"
account_replication_type = "LRS"
 
tags = {
environment = var.tag_env
}
}

Aquí es donde el reto comienza, crear cuatro contenedores dentro de la cuenta de almacenamiento implicaría crear cuatro bloques diferentes, uno para contenedor, en teoría eso es alcanzable, deja de serlo si se tratara de 50 contenedores o de escenarios más complejos.

Vamos con la sentencia cíclica en nuestro script.

resource "azurerm_storage_container" "container" {
  for_each              = toset(var.containers)
  name                  = each.value
  storage_account_name  = azurerm_storage_account.storage.name
  container_access_type = "private"
}

Como verás, lo que la sentencia for_each tomará el valor de la variable containers y asignará cada uno de sus valores directamente a la propiedad de nombre en el contenedor. La sintaxis escrita ahí es justamente la adecuada, primero escribes el ciclo y luego escribes la propiedad a la que deseas asignarle el valor.

En el caso de la variable, debes usar una de tipo list como se muestra a continuación.

variable "containers" {
  type        = list
  description = "Expected names for blob containers"
  default     = ["storagelogs", "receivedfiles", "movements", "events"]
}

Así que al colocar la cantidad de valores que quieras poner aquí tendrás un ciclo ejecutándose sin problema resultando naturalmente en algo como la siguiente imagen.

Con esto ahorrarás muchísimo tiempo de ejecución y harás las cosas mucho más flexibles.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *