Skip to main content

3 consejos para gestionar las desviaciones por cambios manuales en Terraform

Escrito por
Headshot of Stephane Jourdan

Stephane Jourdan

feature synk iac terraform magenta

22 de mayo de 2020

0 minutos de lectura

Nota del editor: Esta publicación apareció originalmente en CloudSkiff.com. CloudSkiff se unió a Snyk en octubre de 2021.‹

¿Cómo se gestionan las desviaciones causadas por cambios manuales en Terraform? Si alguien cambia algo manualmente en la infraestructura, ¿cómo lo manejas en Terraform y cómo ejecutas Terraform plan la próxima vez? Hay distintas formas de gestionar las desviaciones causadas por cambios manuales en tu infraestructura de Terraform, según el caso.

Estas son 3 opciones:

  • Cambia el código manualmente para actualizar tu estado

  • Usa una herramienta para aplicar ingeniería inversa con Terraform al nuevo entorno existente

  • Importa partes específicas de tu código nuevo con el subcomando terraform import

1. Cambia el código manualmente para actualizar tu estado

Siempre es más fácil empezar con un ejemplo. Supongamos que uno de los miembros de tu equipo cambió manualmente un grupo de seguridad, por ejemplo, abrió un puerto HTTP para una subred específica, y lo descubres en el siguiente terraform apply. (Este es un caso sencillo).

Después de esta acción, encontrarás una diferencia en tu terraform output (ya sea en CI o en tu laptop). Eso significa que puedes agregar esta diferencia como un fragmento directamente en tu código de Terraform y aplicarlo. En esencia, tendrás que agregar el código manualmente después del despliegue. La próxima vez que ejecutes terraform apply, Terraform notará que el estado no incluye este elemento nuevo (en nuestro ejemplo, permitir HTTP para una subred) y le pedirá a tu proveedor de nube (por ejemplo, AWS) que lo cree. AWS responderá: «Ya lo tengo».

En este caso sencillo, la diferencia solo aparece en el archivo TFstate y resolviste el problema manualmente. Es un poco como resolver un conflicto durante una fusión de Git.

Estos son los pasos clave:

  • Escribe el código que falta

  • Haz push

  • Aplícalo

  • La diferencia desaparece

  • Y el estado final se actualiza en el archivo de estado

2. Aplica ingeniería inversa con Terraform al nuevo entorno existente

Si tienes un caso mucho más complejo, como una VM completa o, peor aún, un clúster de Kubernetes completo con 10,000 nodos desplegado manualmente, obviamente no intentarás escribir el código a mano como hice en el caso tan sencillo. Te recomiendo usar una herramienta como Terraformer o Terraforming.

Este tipo de herramienta analiza las cuentas de tu proveedor de nube para encontrar recursos y parámetros. Una vez que la herramienta recopila todos los parámetros (por ejemplo, en una VM: disco duro, dirección IP, tipo de sistema operativo, etc.), convierte esos elementos en código válido de Terraform y crea un TFState a partir del código.

Terraformer se originó en el equipo de SRE de Waze en Google, en Tel Aviv. Hará alrededor del 80 % del trabajo y solo tendrás que adaptar algunos detalles.

Al usar esta herramienta, obtendrás 3 elementos:

  • El código que acabas de extraer

  • Un despliegue manual existente

  • Un archivo de estado

El problema ahora es que estos elementos no están realmente integrados en tu repositorio de infraestructura existente. Ese es el tema del siguiente punto: elegir qué importar.

3. Importa partes específicas de tu código nuevo con el subcomando terraform import

Una vez que tengas el código, puedes importarlo con el terraform importsubcomando para elegir con precisión qué importar.

Supongamos, por ejemplo, que hay una dirección IP específica que configuraste manualmente para un balanceador de carga antiguo, pero que producción necesita conservar y quieres asegurarte de que esté bajo el control de Terraform. Puedes escribir el código de Terraform correspondiente e importar el ID correspondiente en AWS.

Es bastante diferente de simplemente hacer push y aplicar código para comprobar si «funciona» del otro lado. Tienes este código y sabes que, si lo ejecutas ahora mismo, se duplicará (en este ejemplo específico, porque puedes tener cientos de direcciones IP con un nombre; no ocurría así en el ejemplo anterior del grupo de seguridad, donde solo puedes tener un puerto 80 abierto).

En este ejemplo, definiría esta dirección IP específica con una herramienta de importación como Terraformer y la copiaría y pegaría en mi código existente. Luego, no la aplicaría directamente, sino que la importaría con el subcomando terraform import.

Así se ve un ejemplo del comando terraform import.

Captura de pantalla de una terminal que muestra el comando `import --help` de Terraform y las opciones disponibles.
comando `import --help`
Terminal ampliada que muestra el texto de ayuda de Terraform import y los comandos para importar infraestructura existente al estado.
Ampliado

Conclusiones sobre la gestión de desviaciones por cambios manuales en Terraform

Según la situación, estas son las tres formas que recomiendo para gestionar los cambios manuales en tu infraestructura con Terraform:

  1. Escribe el código y aplícalo para cambios pequeños que no sea necesario volver a importar, y deja que se reconcilie automáticamente con el archivo de estado.

  2. Importa tu nuevo entorno y aplica ingeniería inversa con Terraform usando una herramienta como Terraformer.

  3. Y/o importa manualmente elementos muy específicos con el subcomando Terraform import.

Protege tu código de Terraform

Snyk IaC protege tus configuraciones de Terraform (¡y tus plantillas de Kubernetes, CloudFormation y ARM!) mientras escribes código, con correcciones guiadas para que puedas hacer merge y seguir adelante. Puedes probar mientras escribes, monitorear los cambios en tus repositorios de Git y automatizar las pruebas en tus pipelines de compilación antes del despliegue. Empezar con un plan gratuito toma solo unos minutos, mientras que una brecha causada por una configuración incorrecta de IaC puede provocar daños que duren toda la vida. Regístrate y empieza a proteger tus configuraciones. Consulta este artículo para obtener más información sobre cómo detectar y prevenir las desviaciones de configuración.

Protege la infraestructura desde el origen

Snyk automatiza la seguridad y el cumplimiento de IaC en los flujos de trabajo, y detecta recursos con desviaciones de configuración y recursos faltantes.