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:
- Configuración inicial: Instalación de Terraform y configuración del entorno de desarrollo.
- Creación de recursos en DigitalOcean: Provisionamiento de droplets, redes, almacenamiento y otros recursos en DigitalOcean utilizando Terraform.
- 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.
- 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
- Tener Terraform Instalado
- Tener cuenta de Digitalocean. Si no tienes una aun, puedes crearla usando este enlace: Crea tu cuenta de DigitalOcean
- Instalar Plugin de terraform de Hashicorp en Visual Studio Code
- Conocimientos básicos de infraestructura en la nube y conceptos de infraestructura como código.
¡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