Sobes.tech
Middle

¿Qué enfoque utiliza Terraform al volver a crear recursos?

sobes.tech AI

Respuesta de la IA

Terraform utiliza un enfoque de "destruir y crear" (destroy and create).

En caso de que sea necesario actualizar o modificar completamente un recurso que no se puede actualizar en el lugar (actualización in-place), Terraform realiza los siguientes pasos:

  1. Destrucción del recurso existente: Terraform elimina el recurso de la infraestructura mediante la llamada a la API correspondiente del proveedor.
  2. Creación de un nuevo recurso: Después de eliminarlo con éxito, Terraform crea una nueva instancia del recurso con los nuevos parámetros.

Esto sucede cuando los cambios en la configuración de Terraform requieren una sustitución completa del recurso. Por ejemplo, cambiar el tipo de subred en la nube (de pública a privada), lo cual no es compatible con una actualización in-place del proveedor. Terraform determina la necesidad de este enfoque al ejecutar el comando terraform plan. En la salida del plan se indicará claramente que el recurso será destruido y recreado.

// Ejemplo de recurso que puede ser reconstruido al cambiar ciertos atributos
resource "aws_instance" "example" {
  ami           = "ami-0abcdef1234567890" # Cambiar la AMI generalmente requiere reconstrucción
  instance_type = "t2.micro"           # Cambiar el tipo de instancia también puede requerir reconstrucción
  subnet_id     = "subnet-0123456789abcdef0" // Cambiar el ID de Subnet casi siempre requiere reconstrucción

  tags = {
    Name = "ExampleInstance"
  }
}

Ejemplo de salida de terraform plan que indica una reconstrucción:

Plan: 1 to add, 0 to change, 1 to destroy.

Terraform realizará las siguientes acciones:

  # aws_instance.example será destruido
  - resource "aws_instance" "example" {
      - ami                    = "ami-old-id" -> null
      - arn                    = "arn:aws:ec2:..." -> null
      ... (otros atributos)
    }

  # aws_instance.example será creado
  + resource "aws_instance" "example" {
      + ami           = "ami-new-id"
      + instance_type = "t2.micro"
      + subnet_id     = "subnet-0123456789abcdef0"
      ... (otros atributos)
    }