En este documento se proporcionan directrices y recomendaciones para probar módulos y configuraciones de Terraform. Google Cloud
A veces, las pruebas de módulos y configuraciones de Terraform siguen patrones y convenciones diferentes a las pruebas de código de aplicaciones. Aunque las pruebas de código de aplicación implican principalmente probar la lógica empresarial de las aplicaciones, para probar el código de infraestructura por completo es necesario implementar recursos en la nube reales para minimizar el riesgo de que se produzcan errores en producción. Hay algunas consideraciones que debes tener en cuenta al ejecutar pruebas de Terraform:
- Al ejecutar una prueba de Terraform, se crea, modifica y destruye infraestructura real, por lo que las pruebas pueden llevar mucho tiempo y ser costosas.
- No puedes hacer pruebas unitarias puras en una arquitectura de extremo a extremo. La mejor opción es dividir la arquitectura en módulos y probarlos por separado. Entre las ventajas de este enfoque se incluyen un desarrollo iterativo más rápido debido a un tiempo de ejecución de las pruebas más rápido, una reducción de los costes de cada prueba y una menor probabilidad de que las pruebas fallen por factores que no puedes controlar.
- Evita reutilizar el estado si es posible. Puede haber situaciones en las que hagas pruebas con configuraciones que compartan datos con otras configuraciones, pero lo ideal es que cada prueba sea independiente y no reutilice el estado entre pruebas.
Usar primero métodos de prueba menos costosos
Hay varios métodos que puedes usar para probar Terraform. Por orden ascendente de coste, tiempo de ejecución y profundidad, se incluyen los siguientes:
- Análisis estático: prueba la sintaxis y la estructura de tu configuración sin implementar ningún recurso. Para ello, usa herramientas como compiladores, linters y pruebas en vacío. Para hacerlo, usa
terraform validate
. - Pruebas de integración de módulos: para asegurarse de que los módulos funcionan correctamente, pruebe los módulos de forma individual. Las pruebas de integración de módulos implican implementar el módulo en un entorno de prueba y verificar que se creen los recursos esperados. Hay varios frameworks de pruebas que facilitan la escritura de pruebas, como los siguientes:
- Pruebas integrales: si amplías el enfoque de las pruebas de integración a todo un entorno, puedes confirmar que varios módulos funcionan conjuntamente. Con este enfoque, se implementan todos los módulos que componen la arquitectura en un entorno de pruebas nuevo. Lo ideal es que el entorno de prueba sea lo más parecido posible al entorno de producción. Aunque es un proceso costoso, ofrece la mayor confianza de que los cambios no afectarán al entorno de producción.
Empieza con una cantidad pequeña
Asegúrate de que las pruebas se basen unas en otras de forma iterativa. Te recomendamos que primero hagas pruebas más pequeñas y, después, pases a pruebas más complejas con un enfoque de fallo rápido.
Aleatorizar IDs de proyectos y nombres de recursos
Para evitar conflictos de nombres, asegúrate de que tus configuraciones tengan un ID de proyecto único a nivel global y nombres de recursos que no se solapen en cada proyecto. Para ello, usa espacios de nombres para tus recursos. Terraform tiene un proveedor aleatorio integrado para ello.
Usar un entorno independiente para las pruebas
Durante las pruebas, se crean y eliminan muchos recursos. Asegúrate de que el entorno esté aislado de los proyectos de desarrollo o producción para evitar eliminaciones accidentales durante la limpieza de recursos. Lo mejor es que cada prueba cree un proyecto o una carpeta nuevos. Para evitar errores de configuración, te recomendamos que crees cuentas de servicio específicas para cada ejecución de prueba.
Limpiar todos los recursos
Probar el código de infraestructura significa que estás desplegando recursos reales. Para evitar que se te cobren, considera la posibilidad de implementar un paso de limpieza.
Para destruir todos los objetos remotos gestionados por una configuración concreta, usa el comando terraform destroy
. Algunos frameworks de pruebas tienen un paso de limpieza integrado. Por ejemplo, si usas Terratest, añade defer terraform.Destroy(t, terraformOptions)
a tu prueba. Si usas Kitchen-Terraform, elimina tu espacio de trabajo con terraform kitchen delete WORKSPACE_NAME
.
Después de ejecutar el comando terraform destroy
, también debes llevar a cabo procedimientos de limpieza adicionales para eliminar los recursos que Terraform no haya podido destruir. Para ello, elimina los proyectos que hayas usado para ejecutar pruebas o utiliza una herramienta como el módulo project_cleanup
.
Optimizar el tiempo de ejecución de las pruebas
Para optimizar el tiempo de ejecución de las pruebas, utiliza los siguientes métodos:
- Ejecuta pruebas en paralelo. Algunos frameworks de pruebas permiten ejecutar varias pruebas de Terraform simultáneamente.
- Por ejemplo, con Terratest puedes hacerlo añadiendo
t.Parallel()
después de la definición de la función de prueba.
- Por ejemplo, con Terratest puedes hacerlo añadiendo
- Haz pruebas por fases. Separa las pruebas en configuraciones independientes
que se puedan probar por separado. Con este enfoque, no es necesario pasar por todas las fases al ejecutar una prueba y se acelera el ciclo de desarrollo iterativo.
- Por ejemplo, en Kitchen-Terraform, divide las pruebas en conjuntos independientes. Cuando iteres, ejecuta cada conjunto de pruebas de forma independiente.
- Del mismo modo, con Terratest, envuelve cada fase de la prueba con
stage(t, STAGE_NAME, CORRESPONDING_TESTFUNCTION)
. Define variables de entorno que indiquen qué pruebas se deben ejecutar. Por ejemplo,SKIP
STAGE_NAME="true"
. - El framework de pruebas de planos admite la ejecución por fases.
Siguientes pasos
- Consulta las prácticas recomendadas generales de estilo y estructura de Terraform en Google Cloud.
- Consulta las prácticas recomendadas para usar módulos raíz de Terraform.