Monday, November 30, 2020

Despliegue de infraestructura en Azure usando Terraform

Ahora que estoy preparándome para el examen AZ-900: Azure Fundamentals y además de haber escrito algo sobre infraestructura como código, me animé a investigar en cómo desplegar infraestructura en Azure a través la herramienta Terraform.

Terraform nos permite describir nuestra infraestructura a través de scripts (práctica IaC). De esta forma nuestra infraestructura es tratada de la misma manera que cualquier otro código (versionar, ejecutar, probar).  

En esta ocasión voy a experimentar el despliegue de infraestructura (una Virtual Machine) en Azure a través de Terraform. ¡Adelante!

Requisitos

Terraform 

La instalación es sencilla, solo sigue lo que estable la documentación según su SO: https://learn.hashicorp.com/terraform/getting-started/install.html

Editor de código

Personalmente, mi editor de código preferido es Visual Studio Code. Para trabajar con Terraform puedes usar las siguientes extensiones: 
  • Terraform - Syntax highlighting, linting, formatting, and validation for Hashicorp's Terraform.
  • Azure Terraform - VS Code extension for developing with Terraform on Azure.

Una cuenta de Azure

Puedes conseguir 200 USD para la prueba gratuita de Azure a través del siguiente link: https://azure.microsoft.com/en-us/free/

Azure CLI

La interfaz de la línea de comandos de Azure (CLI de Azure) es un conjunto de comandos que se usa para crear y administrar recursos de Azure. Para instalarlo sigues los pasos del siguiente link: 

https://docs.microsoft.com/en-us/cli/azure/install-azure-cli?view=azure-cli-latest


Comandos Terraform

  • terraform init: Es el comando de partida para iniciar una nueva o ya existente configuración.
  • terraform plan: Muestra qué infraestructura se va a crear.
  • terraform apply: Crea, modifica o elimina la infraestructura definida en el archivo de configuración.
  • terraform destroy: Elimina toda la infraestructura definida en el archivo de configuración (¡Tener cuidado!)

Paso a paso

Paso 1
Iniciar sesión en Azure CLI con el comando az login en una línea de comandos. 

Paso 2
Crear nuestro archivo de configuración Terraform (extensión .tf) y definir nuestra infraestructura a crear, en nuestro caso una máquina virtual Windows.

// configurar Azure Provider
provider "azurerm" {
  version = "=2.9.0"
  features {}
}

// crear un grupo de recursos
resource "azurerm_resource_group" "main" {
  name     = "terraform-rg"
  location = "West Europe"
}

// crear red virtual donde tiene que estar la VM
resource "azurerm_virtual_network" "main" {
  name                = "rc-network"
  address_space       = ["10.0.0.0/16"]
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"
}

// crear una subred virtual 
resource "azurerm_subnet" "internal" {
  name                 = "internal"
  resource_group_name  = "${azurerm_resource_group.main.name}"
  virtual_network_name = "${azurerm_virtual_network.main.name}"
  address_prefix       = "10.0.2.0/24"
}

// crear una interfaz de red para la VM
resource "azurerm_network_interface" "main" {
  name                = "rc-nic"
  location            = "${azurerm_resource_group.main.location}"
  resource_group_name = "${azurerm_resource_group.main.name}"

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = "${azurerm_subnet.internal.id}"
    private_ip_address_allocation = "dynamic"
  }
}

// crear la máquina virtual 
resource "azurerm_virtual_machine" "main" {
  name                  = "rcdevopsvm"
  location              = "${azurerm_resource_group.main.location}"
  resource_group_name   = "${azurerm_resource_group.main.name}"
  network_interface_ids = ["${azurerm_network_interface.main.id}"]
  vm_size               = "Standard_DS1_v2"

   delete_os_disk_on_termination = true

   delete_data_disks_on_termination = true

  storage_image_reference {
    publisher = "microsoftwindowsserver"
    offer     = "WindowsServer"
    sku       = "2016-Datacenter"
    version   = "latest"
  }

  storage_os_disk {
    name              = "rcwinserver"
    caching           = "ReadWrite"
    create_option     = "FromImage"
    managed_disk_type = "Standard_LRS"
  }
  os_profile {
    computer_name  = "rcwinservervm"
    admin_username = "testadmin"
    admin_password = "Password1234!"
  }
  os_profile_windows_config {
    enable_automatic_upgrades = true
    provision_vm_agent = true
  }

}

Paso 3
Desde la terminal embebida de Visual Studio Code ejecutar el siguiente comando:
> terraform init

Paso 4
Para comprobar que infraestructura se va a desplegar ejecutar el siguiente comando:
> terraform plan

Paso 5
Para desplegar la infraestructura ejecutar el siguiente comando:
> terraform apply

Paso 6
Ir al portal de Azure y ver que la infraestructura se haya creado correctamente.


Paso 7
Para eliminar nuestra infraestructura de pruebas y así evitar gastos en Azure ejecutar el siguiente comando:
> terraform destroy

Conclusión

Con este ejemplo sencillo ahora entiendo un poco más el poder de gestionar la infraestructura a través de una herramienta como Terraform. Realmente se comprueba la hipótesis de que la práctica técnica de Infraestructura como Código contribuye a la entrega rápida de valor. 

En un siguiente articulo trataré el uso de Terraform usando pipelines de Azure DevOps. Algunos enlaces interesantes:

¡Gracias por llegar hasta aquí!

No comments:

Post a Comment

Cuando el código funciona, pero no tiene tests: ¿y ahora qué?

Seguramente te ha pasado alguna vez. Te dan acceso al repositorio de un nuevo proyecto. Lo abres con curiosidad, esperas encontrar una estru...