En este artículo nuestro compañero Álvaro Rodríguez nos habla sobre Terraform: qué es, cómo funciona, cuándo debería utilizarse y su comparación con otras soluciones alternativas.
Dada la proliferación de proveedores cloud en estos últimos años y a consecuencia de las ventajas operativas que ofrecen con respecto a las tradicionales instalaciones on-premise, ya no sólo a nivel de costes y mantenibilidad, sino también cuando hablamos de factores como escalabilidad y seguridad, ha propiciado que las empresas en mayor o menor medida hayan diversificado su infraestructura alrededor de estos proveedores.
Debido al volumen de servicios y recursos desplegados en dichos proveedores, se hace latente la necesidad de tener una herramienta que nos ayude no sólo a llevar un control de esta diversificada infraestructura, sino a automatizar la creación de nuevos recursos bajo demanda sin necesidad del agente humano. Es en este punto donde Terraform puede aportar ese granito de arena para hacernos la vida un poco más fácil.
¿Qué es Terraform?
Terraform es una tecnología de IaC (Infrastructure as Code) que nos permite definir y mantener mediante ficheros de configuración utilizando HCL (Hashicorp Configuration Language, un lenguaje específico de dominio desarrollado por ellos) toda nuestra infraestructura desplegada a través de los distintos proveedores cloud (AWS, Azure, GCP, etc). También en instalaciones on-premise, siempre que expongamos una API a través de la cual Terraform pueda comunicarse.
¿Cómo funciona?
Como acabamos de comentar, Terraform es capaz de comunicarse y construir cualquier infraestructura siempre que exponga una API para comunicarse con él. Es por ello que detrás de nuestro script de configuración, Terraform utilizará las APIs expuestas por cada uno de los proveedores cloud para crear/modificar la infraestructura. En el ecosistema de Terraform es lo que se conoce como providers. A través de Terraform Registry podéis ver y buscar la lista completa de todos los proveedores a los que da soporte.
Para la gestión del estado Terraform generará un fichero .tfstate donde mantiene la información actual de nuestra infraestructura. De esta manera cuando nosotros vayamos a desplegar una nueva versión, Terraform “comparará” con este fichero de estado y será capaz de informarnos de los recursos que se van a modificar, eliminar y crear. Ofreciéndonos así actualizaciones incrementales de los mismos.
Podemos configurar dónde queremos guardar esta información de estado a través de los backends de Terraform. Pudiendo alojar desde en su propio SaaS Terraform Cloud (a través del cual podremos además gestionar la planificación y ejecución de las nuevas versiones de infraestructura) en un bucket de S3 o Consul entre otras.
Siempre será preferible alojar nuestra información de estado en una de estas soluciones en SaaS en vez de en nuestro sistema local, no sólo por la seguridad y fiabilidad que aportan dichos servicios, sino por tener un único estado centralizado al que todos los DevOps y desarrolladores puedan acceder y mantener.
// Inicializamos un nuevo estado en local, o nos conectamos al backend que tengamos configurado
terraform init
//Planificamos un nuevo despliegue, terraform nos informará de los recursos que se van a crear, modificar y eliminar
terraform plan
// Ejecutamos la configuración planificada con terraform plan
terraform apply
¿Cuándo utilizar Terraform?
Puesto que siempre debemos buscar la herramienta más adecuada para cada finalidad y aunque con Terraform podemos manejar infraestructura de cualquier magnitud, hay que tener en cuenta que si nuestra necesidad es crear una simple máquina en EC2, pueden no compensar los costes en tiempo y recursos de aprender Terraform. Es por ello que está más orientado a los siguientes escenarios:
- Despliegues multi-cloud: si estamos seguros de que toda nuestra infraestructura va a estar alojada en AWS. Por ejemplo, podríamos decantarnos por utilizar CloudFormation, pero en el momento que empezamos a repartir partes de esta infraestructura entre varios de estos proveedores, se convierte casi en una necesidad una herramienta común para gestionarlas todas.
- Infraestructuras hechas a medida: el hecho de que Terraform pueda comunicarse y operar con cualquier servicio que exponga una API nos da la posibilidad de crear nuestros propios providers que se ajusten exactamente a cualquier API que hayamos definido.
¿Por qué Terraform?
Cuando hablamos de herramientas alternativas, podemos decir que tiene pocos competidores.
AWS nos ofrece el servicio CloudFormation para este mismo propósito, y como en una familia de hermanos en la que uno no puede tener más que otro, en Azure tenemos ARM y GCP tiene Deployment Manager.
Pero aunque todas estas herramientas tengan la misma finalidad, utilizando estos tres servicios tendríamos toda nuestra configuración separada en cada proveedor y además necesitaríamos aprender el lenguaje específico de dominio de cada uno, en vez de tener todas las configuraciones centralizadas en un único lugar y con un único lenguaje para controlarlos a todos. Por estos motivos, en mi opinión, estos servicios específicos de cada proveedor no entrarían en la lista de competidores directos.
Sin olvidarnos de Ansible, otra herramienta IaC que nos permite igualmente definir infraestructura como código, pero que no tiene ninguna gestión de estado debido a su naturaleza imperativa. Por esto, aunque no sea la mejor alternativa para Terraform, sí que encaja muy bien en la siguiente fase después de crear la infraestructura, que es aprovisionarla.
Con esto no quiero decir que Terraform no pueda aprovisionar, de hecho sí que puede mediante el uso de lo que ellos llaman provisioners. El problema es que ellos mismos te recomiendan no excederte con su uso, ya que Terraform una vez ha construido la infraestructura no tiene visibilidad de lo que ocurre dentro de la máquina/recurso. De esta manera, aunque hubiera un error en la fase de aprovisionamiento Terraform nos indicaría que el despliegue ha sido correcto. Por eso Terraform para gestionar la infraestructura y Ansible para su posterior aprovisionamiento, hacen muy buena pareja.
Una buena alternativa a Terraform sí que podría ser Pulumi, una herramienta relativamente nueva con la misma finalidad pero con sutiles diferencias. En la siguiente tabla se destacan estas pequeñas diferencias:
Pulumi | Terraform |
Pulumi nos permite definir los scripts de configuración en lenguajes de alto nivel como Python, Go, .NET, Javascript entre otros. | Terraform utiliza un lenguaje específico de dominio denominado HCL. |
Permite la creación de test unitarios, de integración y de propiedades. | Permite crear tests de integración. |
Permite embeber código pulumi en aplicaciones como servidores web, aplicaciones de sistema. | La única manera de ejecutar Terraform es desde la CLI o desde el servicio autogestionado de Terraform Cloud. |
Estado gestionado por defecto en el SaaS Pulumi Service, opciones de auto-gestión disponibles. | Autogestionado por defecto, otras opciones de SaaS disponibles, como el suyo oficial Terraform Cloud. |
Es capaz de encriptar secretos en tránsito y en el fichero de estado. | Los secretos deben estar almacenados en otros servicios (Vault por ejemplo). |
Éstas son algunas de las diferencias más reseñables y sin duda hacen que merezca la pena que prestemos atención a su evolución.
Conclusiones
Tras este breve análisis sobre cómo gestionar nuestra infraestructura en el panorama cloud actual, se hace casi imperativo contar con una herramienta que nos permita mantener de una manera sencilla y eficiente toda su evolución a lo largo del tiempo. Terraform es la mejor candidata para ello.
Como hemos mencionado con anterioridad, debemos buscar siempre la herramienta más adecuada para solucionar cada problema específico, y Terraform no es la herramienta más eficiente para resolver la fase de aprovisionamiento debido a su nula visibilidad de los recursos una vez construidos y que en esencia, no es su propósito.
Es por eso que si a Terraform le sumamos el uso de otras herramientas específicas de aprovisionamiento como Ansible, la cual entre otras ventajas será capaz de informarnos de los errores y más información útil encontrados durante dicha fase, podemos llegar a tener una solución completa en la que automatizar todo el proceso de creación y configuración de nuevos recursos bajo demanda.
Álvaro Rodríguez Estruch
Senior FullStack Developer en decide4AI
Si quieres saber más sobre Terraform o cualquier otra herramienta de arquitectura software, contacta con nosotros y te ayudaremos. Si quieres saber más sobre decide4AI y mantenerte al tanto de futuros webinar o acciones, síguenos en las redes sociales (Linkedin, Twitter, Youtube).