Terraboard: Gestionando estados de Terrafom visualmente
Gestionar múltiples estados de terraform de forma remota puede convertirse en una tarea bastante compleja. Además, inspeccionar los recursos de cada estado con el CLI de terraform no es especialmente intuitivo o visual😅. En este post se presenta Terraboard, una herramienta de código abierto desarrollada por Camptocamp que se encarga de resolver estos problemas.
Terraboard despliega un interfaz web que incorpora una herramienta para comparar diferentes versiones de los recursos. Actualmente soporta estados remotos tanto en buckets S3 de AWS como en Terraform Cloud.
Pruébalo en local 💻
Terraboard se distribuye como un CLI escrito en Go, junto con un interfaz web escrito en AngularJS, y requiere una base de datos Postgres para funcionar. Hay varias formas de desplegarlo y probarlo, como podrás ver el repo de GitHub de Terraboard. En este artículo utilizaremos la imagen Docker de Terraboard. Además se ha desarrollado un script sencillo que hace más fácil correr Terraboard de forma local.
Para poder ejecutar el script es necesario que Docker esté instalado en tu máquina. Puedes obtener la versión específica par tu SO aquí. Ejecuta los siguientes comandos para descargar el script y poder invocarlo desde la línea de comandos.
En este ejemplo, se utilizará un bucket AWS S3 como backend para almacenar los estados de Terraform, por lo que necesitarás un par de access key y secret key de AWS. Si no tienes uno, puedes crearlo en la consola de IAM de AWS, Échale un vistazo a la documentación oficial como referencia si lo necesitas.
Ten en cuenta que el usuario de IAM asociado a las claves debe tener los siguientes permisos sobre el bucket s3 en el que se encuentren los estados:
- s3:GetObject
- s3:ListBucket
- s3:ListBucketVersions
- s3:GetObjectVersion
Si quieres limitar el alcance del usuario programático asociado al par de claves para que exclusivamente tenga acceso al bucket en cuestión, puedes utilizar la siguiente política de IAM añadiendo el nombre del bucket que contiene los estados.
Recuerda que el bucket debe tener el versionado activado para que Terraboard pueda comparar las diferentes versiones de los estados.
Una vez que dispongas de las claves y los permisos adecuados, exporta las claves así como la región y el bucket de estado como variables de entorno.
Lanza el script de arranque de Terraboard y espera que complete su ejecución.
Si todo ha ido bien y te conectas a localhost en el puerto 8080 utilizando un navegador, podrás acceder al interfaz web de Terraboard. En este caso (la siguiente imagen) se muestran los diferentes estados presentes en el bucket. Tómate tu tiempo para probar el interfaz y la utilidad de búsqueda, que permite filtrar los recursos utilizando diferentes criterios como la versión de Terraform o el tipo de recurso.
Si examinas un estado específico, puedes listar sus diferentes recursos y los módulos empleados para generarlos, así como obtener información detallada y los parámetros asociados a los recursos.
Como se comentó anteriormente, Terraboard permite comparar diferentes versiones de los estados, lo cual puede ser especialmente útil para detectar cambios en el código que hayan podido afectar a la infraestructura de forma inesperada.
Como puede verse en la siguiente imagen, la utilidad de comparación integrada en Terraboard utiliza una sintaxis similar a la de git para mostrar las diferencias entre los estados.
Cuando termines de jugar con Terraboard, puedes eliminar sus contenedores corriendo en tu máquina y el resto de recursos con el siguiente comando.
Desplegando Terraboard en Kubernetes ☸️
Para que Terraboard sea accesible para tu equipo u otros colaboradores, es posible desplegarlo en un clúster de Kubernetes. Se ha desarrollado un chart de Helm bastante sencillo para ello. Para desplegarlo , ejecuta los siguientes comandos indicando tus credenciales, la región y el bucket como valores extra.
NOTA: este chart de Helm asume que hay un ingress controller de Nginx desplegado en el clúster. Si no es así, puedes instalarlo con el siguiente comando.