Tutorial de Terraform y DigitalOcean: Gestión de Infraestructura en la Nube

¡Bienvenido al tutorial de Terraform y DigitalOcean! En este tutorial, aprenderemos cómo utilizar Terraform, una herramienta de infraestructura como código (IaC), junto con DigitalOcean, un proveedor de servicios en la nube, para automatizar la gestión de nuestra infraestructura.

¿Qué es Terraform?

Terraform es una herramienta de código abierto desarrollada por HashiCorp que permite definir y provisionar infraestructuras de manera declarativa utilizando archivos de configuración. Con Terraform, podemos describir nuestra infraestructura como código y luego implementarla de manera consistente y repetible en diferentes entornos.

¿Por qué DigitalOcean?

DigitalOcean es un popular proveedor de servicios en la nube que ofrece una variedad de servicios, incluyendo máquinas virtuales (droplets), almacenamiento, redes y más. DigitalOcean es conocido por su facilidad de uso, rendimiento confiable y precios asequibles, lo que lo convierte en una excelente opción para proyectos de todos los tamaños.

¿Qué aprenderás en este tutorial?

En este tutorial, exploraremos los siguientes temas:

  1. Configuración inicial: Instalación de Terraform y configuración del entorno de desarrollo.
  2. Creación de recursos en DigitalOcean: Provisionamiento de droplets, redes, almacenamiento y otros recursos en DigitalOcean utilizando Terraform.
  3. Gestión de infraestructura como código: Aprenderemos cómo estructurar y organizar nuestros archivos de configuración de Terraform para una gestión eficiente de la infraestructura.
  4. Despliegue de aplicaciones: Integraremos la gestión de la infraestructura con el despliegue de aplicaciones para crear un flujo de trabajo completo y automatizado.

Requerimientos

¡Estoy emocionado de comenzar este viaje de aprendizaje de Terraform y DigitalOcean contigo!

Creando archivo de configuracion de terraform

mkdir digitalocean-terraform-tutorial
cd digitalocean-terraform-tutorial 

crea un archivo main.tf

Añadiendo Digitalocean Provider

terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

# Set the variable value in *.tfvars file
# or using -var="do_token=..." CLI option
variable "do_token" {}

# Configure the DigitalOcean Provider
provider "digitalocean" {
  token = var.do_token
}

Luego ejecutaremos:

terraform init

Esto crearea un carpeta llamado .terraform y un Terraform Lock.

Creando Droplet

Crearemos un droplet añadiendo lo siguiente al archivo de configuracion:

# Create a new Web Droplet in the nyc2 region
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "nyc1"
  size   = "s-1vcpu-1gb"
}

Asegura te colocar una region valida de DigitalOcean

Obteniendo API Keys

Vamos a ir a DigitalOcean luego en la sección de API, crearemos un token.

Luego ejecutaras

terraform plan

y pegaras el token que has obtenido de digitalocean.

Si ejecutas esta configuracion digitalocean te enviara una contraseña para el usuario root, pero esto no es muy seguro, asi que mejor vamos a usar llaves SSH.

Puedes obtener tus llaves SSH, yendo en Settings > Security

resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "nyc2"
  size   = "s-1vcpu-1gb"
  ssh_keys = [ "f4:5f:67:cd:e9:b8:21:0a:be:84:ac:8c:da:ee:1a:8d" ]
}

Para comprobar lo que ejecutara terraform puedes volver a ejecutar:

terraform plan

luego

terraform apply

Añadiendo Firewall

resource "digitalocean_firewall" "web" {
  name = "only-22-80-and-443"

  droplet_ids = [digitalocean_droplet.web.id]

  inbound_rule {
    protocol         = "tcp"
    port_range       = "22"
    source_addresses = ["0.0.0.0/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "80"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "443"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "icmp"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "tcp"
    port_range            = "1-65535"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "udp"
    port_range            = "53"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "icmp"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }
}

Creación de un proyecto

Cuando se ejecuta la configuracion anterior, usara el proyecto por defecto de digitalocean, pero esto tambien se puede configurar:

resource "digitalocean_project" "playground" {
  name        = "playground"
  description = "A project to represent development resources."
  purpose     = "Web Application"
  environment = "Development"
  resources   = [digitalocean_droplet.web.urn]
}

Archivo Final de configuracion

El archivo de configuración al final estaria quedando así:

terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

# Set the variable value in *.tfvars file
# or using -var="do_token=..." CLI option
variable "do_token" {}

# Configure the DigitalOcean Provider
provider "digitalocean" {
  token = var.do_token
}

# Create a new Web Droplet in the nyc2 region
resource "digitalocean_droplet" "web" {
  image  = "ubuntu-20-04-x64"
  name   = "web-1"
  region = "nyc1"
  size   = "s-1vcpu-1gb"
  ssh_keys = [ "f4:5f:67:cd:e9:b8:21:0a:be:84:ac:9c:da:ee:9a:8d" ]
}

resource "digitalocean_firewall" "web" {
  name = "only-22-80-and-443"

  droplet_ids = [digitalocean_droplet.web.id]

  inbound_rule {
    protocol         = "tcp"
    port_range       = "22"
    source_addresses = ["0.0.0.0/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "80"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "tcp"
    port_range       = "443"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  inbound_rule {
    protocol         = "icmp"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "tcp"
    port_range            = "1-65535"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "udp"
    port_range            = "53"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "icmp"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }
}

resource "digitalocean_project" "playground" {
  name        = "playground"
  description = "A project to represent development resources."
  purpose     = "Web Application"
  environment = "Development"
  resources   = [digitalocean_droplet.web.urn]
}

Destruyendo configuracion

Finalmente si quieres destruir toda la infraestrucura que hemos creado puedes usar

terraform destroy

Más Recursos