Volver al Blog
Herramientas para Desarrolladores 25 de mayo de 2026 5 min read

OpenTofu 1.12: prevent_destroy dinámico y la funcionalidad que Terraform nunca entregó en 10 años

OpenTofu 1.12.0 incorpora prevent_destroy dinámico —vinculando el meta-argumento lifecycle a variables de entrada—, una funcionalidad que los usuarios de Terraform llevan solicitando desde la versión 0.7 en 2016. La versión también añade instalación de proveedores en paralelo, el flag -json-into para salida en doble formato y población automática del archivo de bloqueo con tofu init.

OpenTofu 1.12: prevent_destroy dinámico y la funcionalidad que Terraform nunca entregó en 10 años

OpenTofu 1.12.0 se lanzó el 14 de mayo de 2026, y su característica estrella es precisamente la que HashiCorp se negó a implementar durante una década. El prevent_destroy dinámico permite vincular el meta-argumento lifecycle a una variable de entrada:

resource "aws_rds_instance" "main" {
  lifecycle {
    prevent_destroy = var.protect_db
  }
}

Puede parecer un detalle menor. No lo es. Durante diez años, los usuarios de Terraform que intentaban escribir un único módulo desplegable en entornos de desarrollo, staging y producción chocaban contra el mismo error: Variables may not be used here. This value does not accept expressions. La solución alternativa era duplicar el módulo completo y cambiar el flag manualmente —una pesadilla de mantenimiento que ha causado incidentes de eliminación accidental en producción cuando alguien olvidaba actualizar la copia correcta.

OpenTofu 1.12 lo resuelve de forma limpia. Se define un único módulo, se pasa protect_db = true para producción y protect_db = false para desarrollo, y el motor de estado lo aplica correctamente. Este es el caso de uso canónico de IaC en múltiples entornos y ha sido una solicitud de funcionalidad documentada desde Terraform 0.7 en 2016.

La segunda adición importante es -json-into=FILENAME. Al ejecutar tofu plan o tofu apply, el flag escribe la salida legible por máquina en formato JSON en el archivo especificado mientras mantiene la salida formateada para humanos en el terminal. Antes de esto, obtener salida JSON requería redirigir stdout y perder el formato del terminal, o realizar dos invocaciones separadas. Los equipos de ingeniería de plataformas que construyen dashboards de CI personalizados, sistemas de auditoría o pipelines de notificaciones se benefician directamente.

tofu init en 1.12 ahora rellena automáticamente el archivo de bloqueo de dependencias con checksums para todas las plataformas —tanto en formato zh: (SHA-256 del zip) como h1: (hash de árbol)—. Anteriormente, inicializar en una plataforma (macOS) dejaba el archivo de bloqueo incompleto para los runners de CI en Linux, lo que requería un paso adicional de tofu providers lock -platform=linux_amd64. Ese paso ya no es necesario.

La instalación de proveedores es ahora paralela. Si tu proyecto depende de 10 o más proveedores, tofu init los descargaba anteriormente de forma secuencial. La versión 1.12 los descarga todos en paralelo, lo que reduce significativamente el tiempo de inicialización en workspaces grandes.

Dos adiciones menores pero útiles: destroy = false en el bloque lifecycle elimina un recurso del estado sin destruir el objeto remoto —útil cuando se quiere transferir un recurso a otro workspace o importarlo en otro lugar—. Y el bloque moved ahora soporta el traslado entre módulos con distintas versiones de schema, algo que antes no era posible.

Cambios a tener en cuenta: el soporte del provisioner WinRM queda obsoleto (eliminación en 1.13), y las compilaciones oficiales de 32 bits (386/arm) también están en proceso de obsolescencia. Si distribuyes OpenTofu para objetivos de 32 bits, planifica la migración.

OpenTofu sigue siendo un reemplazo directo de Terraform: la sintaxis HCL no cambia, el registro de proveedores es compatible y los archivos de estado migran sin conversión. Si estás en Terraform 1.x y has topado con la limitación de prevent_destroy, la versión 1.12 es una razón concreta para cambiar.

opentofu terraform infrastructure-as-code open-source