Infrastructure as Code con Terraform

Infrastructure as Code con Terraform
Photo by Safar Safarov / Unsplash

Como lo mencioné en el post anterior durante los últimos meses me ha tocado aprender y trabajar con algunas herramientas de Infrastructure as Code, entre estas herramientas se encuentra Terraform la cual es una herramienta open-source (con servicios de paga también) desarrollada por HashiCorp y escrita en Go que nos permite construir, cambiar y versionar nuestra infraestructura de una forma segura y eficiente en diferentes proveedores.

Terraform nos permite definir nuestra infraestructura por medio de uno o más archivos de configuración escritos en HashiCorp Configuration Language o JSON y por medio de su CLI crear o actualizar nuestra infraestructura por medio de comandos.

En mi experiencia Terraform requiere un poco de tiempo para aprender la sintaxis del lenguaje y como lograr reutilizar el máximo de código a través de sus opciones de módulos y templates además del tiempo que se necesita dedicar a aprender los fundamentos y características de cada uno de los proveedores Cloud a utilizar.

Algunas de las características que me parecieron interesantes de Terraform son las siguientes:

  • Se maneja el enfoque de infraestructura declarativa en la cual se define un estado deseado y Terraform se encarga de realizar los cambios necesarios para lograrlo dentro de los proveedores.
  • Trabaja con diferentes proveedores AWS, GCP, Azure, etc.
  • Se pueden utilizar workspaces para proporcionar diferentes configuraciones dependiendo del entorno (dev, stage, prod, etc.)
  • Para evitar el uso de código repetitivo y reutilizar al máximo el código Terraform nos da acceso a módulos, templates, funciones incorporadas y meta-argumentos.
  • Relacionado con el punto anterior Terraform nos da acceso a una consola de comandos muy útil al momento de probar las funciones de terraform ya que tiene acceso a los valores definidos dentro del state.
  • Terraform lleva el seguimiento del estado de nuestra infraestructura por medio del archivo *.state
  • Terraform permite almacenar el Terraform state en alguno de los siguientes servicios:
    • AWS S3
    • Azure Storage
    • Google Cloud Storage
    • Terraform Cloud
    • Consult (HashiCorp)
  • Es necesario invertir tiempo para definir cómo se va a administrar el acceso al archivo de estado de Terraform ya que podría contener información sensible como las contraseñas de tu base de datos.
  • Cuenta con un amplio número de herramientas desarrolladas por la comunidad, les comparto el siguiente repositorio donde se encuentra un listado muy completo.

Nuestro primer script con Terraform

Para este ejemplo crearemos la infraestructura de una Azure Function te recomiendo que lo realices desde VSCode y que instales la siguiente extensión HashiCorp Terraform que te permitirá tener ayuda del intellisense y puedes probar el preview de Azure Terraform.

Primero es necesario que sigas la siguiente guía para instalar el CLI de Terraform, también es necesario que tengas instalado el CLI de Azure lo cual puedes lograr utilizando alguna de las siguientes opciones de instalación dependiendo de tu entorno. Por último, es necesario que realices alguna de las siguientes opciones para autenticarte con el proveedor Azure.

Una vez que termines de seguir las guías del párrafo anterior es tiempo de crear un folder donde almacenaremos nuestros archivos de configuración de Terraform selecciona el nombre de tu preferencia y ubícate dentro de ese path.

Crearemos el archivo providers.tf y agregaremos el siguiente script el cual le indicará a Terraform que el proveedor que deseamos utilizar es el de Azure.

terraform {
  required_providers{
      azurerm={
          source="hashicorp/azurerm"
          version="~>3.9"
      }
  }
}

provider "azurerm" {
  features {}
}

Ejecuta el siguiente comando para que Terraform descargue los módulos necesarios.

terraform init

Cuando se terminé de ejecutar el comando anterior agrega un archivo llamado main.tf y agrega el siguiente código el cual creará todos los recursos necesarios para crear una Azure Function App.

resource "azurerm_resource_group" "build_demo_rg" {
  name = "build-demo-mx"
  location = "east us"
}

resource "azurerm_storage_account" "build_demo_storage" {
  name = "builddemoapp"
  resource_group_name = azurerm_resource_group.build_demo_rg.name
  location = azurerm_resource_group.build_demo_rg.location
  account_tier = "Standard"
  account_replication_type = "LRS"
}

resource "azurerm_service_plan" "build_demo_plan" {
  name = "build-demo"
  resource_group_name = azurerm_resource_group.build_demo_rg.name
  location = azurerm_resource_group.build_demo_rg.location
  os_type = "Linux"
  sku_name = "Y1"
}

resource "azurerm_linux_function_app" "demo_build_function" {
   name                = "demo-build-function-app"
  resource_group_name = azurerm_resource_group.build_demo_rg.name
  location            = azurerm_resource_group.build_demo_rg.location

  storage_account_name = azurerm_storage_account.build_demo_storage.name
  service_plan_id      = azurerm_service_plan.build_demo_plan.id

  site_config {}
}

Ahora ejecuta el siguiente comando el cual te mostrará los recursos a crear y podrás revisar los cambios que se van a realizar en tu infraestructura previo a aplicarlos.

terraform plan -out function.tfplan

Antes de ejecutar el comando toma en cuenta que se pueden incurrir en gastos, así que toma tus precauciones :).

Por último, ejecuta el siguiente comando.

terraform apply "function.tfplan"

Podrás notar que Terraform va mostrando un estatus en la consola, en cuanto los mensajes te indiquen que el proceso ha terminado podrás utilizar los recursos de tu Azure Function App.

Como podrás notar Terraform es una herramienta bastante útil que nos permitirá crear y administrar nuestra infraestructura que además cuenta con un gran soporte de la comunidad, me despido esperando te resulte de utilidad este post ¡Happy coding! @saturpimentel.