Uso del Modulo Data en Terraform para Importar Recursos Existentes
Resumen
¿Cómo utilizar Terraform para gestionar recursos previamente creados en Azure?
En el mundo de la infraestructura como código, no trabajamos solos. Es habitual que distintos miembros de un equipo colaboren en la creación y gestión de recursos en la nube. Aquí, exploraremos cómo podemos utilizar Terraform para acceder a recursos previamente creados por otros miembros del equipo, lo que puede ser un punto crucial para facilitar el trabajo colaborativo en un entorno de TI.
¿Cómo acceder a un recurso creado en Azure?
Cuando un recurso ya ha sido creado, podemos acceder a él en Terraform utilizando un bloque de datos. Supongamos que dentro de tu equipo alguien ya ha creado un "grupo de recursos" en Azure que necesitas para desplegar tu propia infraestructura desde Terraform. Para integrarlo en tu configuración de Terraform:
Primero, crea el recurso en el portal de Azure, como un grupo de recursos en la ubicación deseada.
Dentro de tu proyecto Terraform, crea una carpeta llamada data y un archivo llamado main.tf.
Copia el archivo del proveedor de Azure para integrarlo y poder utilizar sus servicios.
Escribe un bloque data en el archivo main.tf especificando el recurso de Azure que necesitas como azurerm_resource_group.
Ejemplo de bloque data en Terraform:
data "azurerm_resource_group""imported_rg"{name="grupo-previo"}
¿Cómo crear nuevos recursos en base a los datos importados?
Ahora que se ha importado el grupo de recursos utilizándolo como referencia, puedes crear otros recursos que dependan de este.
En el archivo main.tf, puedes definir una nueva cuenta de almacenamiento y vincularla al grupo de recursos importado:
Con esta configuración, no es necesario recrear el grupo de recursos desde cero en Terraform. Puedes aprovechar los recursos existentes para ampliar tu infraestructura de forma eficiente y efectiva.
¿Cómo se ejecutan comandos en Terraform?
Una vez que la configuración esté lista, utiliza los siguientes comandos de Terraform para inicializar y aplicar los cambios:
Cambia al directorio de trabajo donde se encuentra tu archivo main.tf:
cd data
Inicializa Terraform:
terraform init
Planifica los cambios a implementar, utilizando el parámetro out para guardar el plan de ejecución:
terraform plan -out=plan.out
Aplica los cambios almacenados en el plan:
terraform apply "plan.out"
Una vez ejecutados estos pasos, podrás verificar desde el portal de Azure que el recurso ha sido creado satisfactoriamente sin la necesidad de recrear el grupo de recursos base.
¿Qué ventajas ofrece el uso del módulo de datos?
El uso del módulo de datos en Terraform permite un alto grado de flexibilidad y colaboración entre equipos. Con esta técnica puedes:
Utilizar y reutilizar recursos preexistentes sin duplicar esfuerzos.
Mantener una estructura más limpia y organizada en tus configuraciones de infraestructura.
Aprovechar los recursos administrados por otros miembros del equipo, lo que facilita el enfoque hacia otras tareas relevantes.
Además, es especialmente útil cuando se trabaja en equipos grandes o con múltiples proyectos que requieren integración ágil y efectiva de recursos.
Este método es una estrategia robusta y eficiente para gestionar y ampliar la infraestructura, fomentando la colaboración en entornos complejos. ¡No dudes en incorporarlo en tus proyectos para optimizar el trabajo en equipo y el uso de recursos!
Para proteger un recurso existente en producción y evitar que sea eliminado y recreado al ejecutar terraform apply, puedes utilizar la propiedad lifecycle en tu configuración de Terraform. Específicamente, puedes añadir prevent_destroy = true dentro del bloque lifecycle del recurso. Esto evita que Terraform elimine el recurso incluso si la configuración sugiere que debe ser destruido.
Con esta configuración, cualquier intento de eliminar el recurso fallará, protegiéndolo de cambios inesperados.
🌐 Uso del Bloque data en Terraform para Integrar Recursos Existentes en Azure
En entornos de trabajo en equipo, no siempre eres el único responsable de crear y desplegar infraestructura en la nube. A menudo, otros compañeros o administradores ya habrán creado recursos que necesitas aprovechar. En este contexto, Terraform ofrece una herramienta clave: el bloque data, que permite consumir e integrar información de recursos ya existentes.
A continuación, exploramos paso a paso cómo hacerlo, tomando como ejemplo el caso de un grupo de recursos en Azure creado fuera de Terraform.
🚀 El desafío: Recursos creados fuera de Terraform
Cuando trabajamos en equipo, es común que:
Otro miembro del equipo haya creado un recurso (por ejemplo, un Resource Group).
Necesites usar ese recurso en tus despliegues sin recrearlo ni duplicarlo.
Esto puede generar fricción si no sabes cómo enlazar recursos existentes a tu configuración de Terraform. Aquí entra en juego el bloque data.
📦 Creación previa del recurso en Azure Portal
En el ejemplo descrito:
Se creó manualmente en el portal de Azure un grupo de recursos llamado grupo-previo, ubicado en la región Brazil South.
Este recurso no está definido en Terraform, pero se quiere utilizar como base para desplegar una cuenta de almacenamiento dentro de él.
🛠️ El bloque data en Terraform
Terraform permite importar información de recursos existentes mediante el bloque data.
Ejemplo conceptual:
Se define un data "azurerm_resource_group" apuntando al grupo de recursos existente.
Desde ahí se obtienen atributos como nombre y ubicación, reutilizándolos al crear nuevos recursos.
Caso práctico:
Se creó un archivo main.tf dentro de un folder data.
Se configuró el proveedor de Azure (provider "azurerm").
Se definió un bloque data para el grupo de recursos:
Nombre lógico: ImportedRG.
Referencia al grupo existente: grupo-previo.
A partir de ese bloque se creó una cuenta de almacenamiento (azurerm_storage_account).
resource_group_name → referenciado desde data.azurerm_resource_group.ImportedRG.name.
location → tomado de data.azurerm_resource_group.ImportedRG.location.
⚡ Ejecución de Terraform
El flujo de comandos fue el habitual:
terraform init → inicializar el proveedor y configuración.
terraform plan -out=plan.out → generar el plan y guardarlo en archivo.
terraform apply → aplicar los cambios y crear la cuenta de almacenamiento dentro del grupo previo.
Resultado:
El grupo de recursos existente se mantuvo intacto.
La nueva cuenta de almacenamiento quedó correctamente desplegada dentro de él.
📌 Escenario real: colaboración con equipos y administradores
Este patrón es especialmente útil cuando:
Un administrador de suscripción en Azure crea de antemano un grupo de recursos.
Tu equipo necesita desplegar servicios dentro de ese grupo sin gestionarlo directamente.
Se quiere mantener un único estado de Terraform limpio, evitando duplicaciones o conflictos.
Ejemplo hipotético:
Tu equipo de seguridad crea un resource group exclusivo para servicios de monitoreo.
Tú necesitas desplegar un Log Analytics Workspace dentro de ese grupo.
Con data puedes usar directamente el grupo sin redefinirlo en tu código.
✅ Conclusiones y recomendaciones
El bloque data es esencial para trabajar con recursos preexistentes en Terraform.
Facilita la integración en equipos donde no todos los recursos son creados por la misma persona o pipeline.
Evita duplicaciones y mantiene el control del estado centralizado en Terraform.
Es una práctica recomendada acostumbrarse a usar terraform plan -out=archivo.out siempre que prepares cambios, asegurando un despliegue predecible y seguro.
👉 En resumen: gracias al uso de data, puedes desplegar nueva infraestructura en Azure sin necesidad de recrear ni importar manualmente recursos ya existentes, logrando una colaboración fluida y una arquitectura más robusta.
Yo hice un ejercicio sencillo, leyendo un grupo de usuarios que ya tenia creado en AWS y asignandolo a un nuevo usuario IAM:
data "aws_iam_group""imported_group"{ group_name ="grp-developers"}resource "aws_iam_user""new_user"{ name ="${var.project_name}-${var.enviroment}-user" tags ={"project"=var.project_name"class"="05-data""created_by"=var.created_by}}resource "aws_iam_user_group_membership""add_to_group"{ user = aws_iam_user.new_user.name groups =[data.aws_iam_group.imported_group.group_name]}output "new_user_name"{ value = aws_iam_user.new_user.name}output "new_user_arn"{ value = aws_iam_user.new_user.arn}
En mi caso salía que la cuenta de almacenamiento ya estaba tomada, por lo cual tocó cambiar en nombre en resource "azurerm_storage_account" "storage_account”, para hacerlo automático con base en la fecha y el día se hizo de la siguiente manera.
name ="almprevio${formatdate("YYYYMMDDhhmm", timestamp())}"
En AWS, usamos un grupo de seguridad existente para una instancia de EC2.
data "aws_security_group""previous-security-group"{ name ="curso-security-group"}resource "aws_instance""app_server"{ ami ="ami-05b10e08d247fb927" instance_type ="t3.micro" vpc_security_group_ids =[data.aws_security_group.previous-security-group.id] tags ={Name="app-server"}}```data "aws\_security\_group""previous-security-group"{ name ="curso-udemy-security-group"}resource "aws\_instance""app\_server"{ ami ="ami-05b10e08d247fb927" instance\_type ="t3.micro" vpc\_security\_group\_ids = \[data.aws\_security\_group.previous-security-group.id] tags ={Name="app-server"}}
data "azurerm_resource_group" "imported_rg" { name = "previousGroup"}
resource "azurerm_storage_account" "imported_sa" { name = "previousstorageaccount" resource_group_name = data.azurerm_resource_group.imported_rg.name location = data.azurerm_resource_group.imported_rg.location account_tier = "Standard" account_replication_type = "GRS"