Con Terraform 1.5 y versiones posteriores, puedes utilizar el bloque import
para gestionar la importación de recursos directamente en tu configuración. Esta característica simplifica el proceso de importar infraestructuras existentes al estado de Terraform, eliminando la necesidad de un comando CLI separado terraform import
.
En este artículo, explicamos el bloque de importación y cómo utilizarlo para importar diferentes recursos.
¿Qué es un bloque de importación de Terraform?
El bloque de import
de Terraform introducido en Terraform v1.5.0 proporciona un enfoque declarativo para importar recursos de infraestructura existentes en un archivo de estado de Terraform. Permite que las importaciones de recursos se conviertan en una parte integral del proceso de planificación de Terraform, similar a otros recursos gestionados, en lugar de ser tratados como una operación directa de estado.
Como resultado, el bloque de import
mejora la transparencia y alinea las importaciones de recursos con los principios fundamentales de la infraestructura como código (IaC), permitiendo a los usuarios gestionar su infraestructura de manera más efectiva y predecible.
La sintaxis de un bloque de import
en Terraform es la siguiente:
import {
to = <resource_address>
id = <resource_identifier>
}
to
: Especifica la dirección del recurso en tu configuración donde se mapeará el recurso importado.id
: Define el identificador único del recurso existente en la API del proveedor. Asegúrate de que tu proveedor de Terraform esté correctamente configurado para acceder al recurso que se está importando.
Ten en cuenta que algunos tipos de recursos pueden tener requisitos o restricciones adicionales para la importación.
Bloque de Importación vs. Comando de Importación de Terraform
Un bloque de import
en Terraform te permite definir recursos directamente en tu archivo de configuración, simplificando la gestión de la infraestructura existente.
En contraste, cuando se utiliza el comando terraform import
sin un bloque de import
, vincula un recurso existente al estado de Terraform, pero no genera automáticamente la configuración correspondiente en tu código. Debes agregar manualmente esta configuración después. El comando de importación es particularmente útil para importaciones únicas o para la transición de infraestructura a la gestión de Terraform.
Ambos métodos requieren un manejo cuidadoso para asegurar la consistencia entre el estado de Terraform y la infraestructura real. Los bloques de Import
son generalmente más adecuados para la gestión continua de recursos, mientras que el comando independiente funciona bien para importaciones ocasionales.
Ejemplo 1: Usando el Bloque de Importación de Terraform para Importar un Bucket de S3
Supongamos que tenemos un bucket AWS S3 existente (my-existing-bucket
) que deseas gestionar con Terraform.
El bloque resource
especifica el bucket de S3 (aws_s3_bucket.example
) y el atributo bucket
define el nombre del bucket existente:
resource "aws_s3_bucket" "example" {
bucket = "my-existing-bucket"
}
import {
to = aws_s3_bucket.example
id = "my-existing-bucket"
}
El bloque import
vincula el bucket de S3 existente al recurso de Terraform.
to
: Mapea el recurso importado a la dirección del bloqueresource
(aws_s3_bucket.example
)id
: Especifica el ID único del bucket (my-existing-bucket
).
Cuando ejecutas terraform plan
, Terraform lee el bloque import
, verifica el estado del bucket de S3 existente y muestra una vista previa de los cambios que hará en el archivo de estado. Luego, después de ejecutar terraform apply
, Terraform actualiza el archivo de estado para incluir el bucket existente, mapeándolo al recurso aws_s3_bucket.example
.
Después de ejecutar terraform apply
e importar con éxito el recurso, es una buena práctica eliminar el bloque import
. Mantenerlo no causará ningún daño, pero eliminarlo ayuda a mantener una configuración limpia y minimiza la confusión potencial durante la gestión futura del estado.
Ejemplo 2: Uso del Bloque de Importación de Terraform para Importar una Instancia EC2
Consideremos otro ejemplo: tenemos una instancia EC2 existente con el ID i-1234567890abcdef0
y queremos ponerla bajo el manejo de Terraform.
Definimos el recurso aws_instance
que queremos que Terraform administre en el bloque resource
. Asegúrate de que los atributos (por ejemplo, ami
, instance_type
) coincidan con la configuración de la instancia existente:
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Replace with the actual AMI ID
instance_type = "t2.micro"
}
import {
to = aws_instance.example
id = "i-1234567890abcdef0"
}
En el bloque import
:
to
: Mapea el recurso en tu configuración (aws_instance.ejemplo
) al recurso existente.id
: Especifica el ID único de la instancia EC2 que estás importando.
Una vez que agregues el bloque de recurso y la declaración de importación a tu archivo de configuración de Terraform, ejecuta terraform plan
para previsualizar los cambios. Luego, ejecuta terraform apply
para importar el recurso al archivo de estado de Terraform.
Después de la importación, Terraform administrará la instancia EC2 existente, asegurando que su configuración permanezca declarativa.
Ejemplo 3: Usando el Bloque de Importación de Terraform para Importar un Grupo de Recursos de Azure
En el siguiente ejemplo, importaremos un grupo de recursos de Azure.
Tenemos un grupo de recursos de Azure existente llamado example-resource-group
en la región East US
, y queremos gestionarlo con Terraform.
Primero, en el bloque resource
, definimos el recurso azurerm_resource_group
que Terraform gestionará:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "East US"
}
import {
to = azurerm_resource_group.example
id = "/subscriptions/<subscription_id>/resourceGroups/example-resource-group"
}
El bloque de importación:
to
: Mapea el recurso en tu configuración (azurerm_resource_group.example
) al recurso de Azure existente.id
: Especifica el ID de recurso de Azure completamente calificado del grupo de recursos. Recuerda reemplazar<subscription_id>
con tu ID de suscripción actual.
Agrega el recurso y el bloque de importación a tu archivo de configuración de Terraform. A continuación, ejecuta el comando terraform plan
para previsualizar los cambios y ejecuta terraform apply
para aplicar los cambios e importar el recurso en el archivo de estado de Terraform.
¿Puedes usar el Bloque de Importación de Terraform de manera condicional?
El bloque de importación de Terraform está diseñado para ser declarativo y requiere valores específicos conocidos en el momento de la planificación. Por lo tanto, no se puede usar condicionalmente dentro de tu código de Terraform.
El bloque de importación no admite expresiones dinámicas o variables para determinar el ID de importación basado en condiciones. Los intentos de usar construcciones como count o variables dentro del bloque de importación resultarán en errores, ya que Terraform no permite dichos argumentos en este contexto.
Puntos Clave
La introducción del bloque de importación en Terraform 1.5+ simplifica la gestión de recursos al permitir la importación y definición directa de recursos dentro de los archivos de configuración. Se alinea con los principios de IaC al reducir la complejidad y facilitar la integración de la infraestructura existente en las configuraciones de Terraform.
Source:
https://dzone.com/articles/how-to-use-terraform-import-block