Terraform

Infraestructura como Codigo - aprovisionar recursos cloud en AWS, Azure, GCP con gestion de estado

TL;DR

Qué: Una herramienta de infrastructure as code para aprovisionar recursos en la nube.

Por qué: Sintaxis declarativa, multi-cloud, gestión de estado, infraestructura reproducible.

Quick Start

Instalar:

brew install terraform  # macOS
# or download from terraform.io

Create main.tf:

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 5.0"
    }
  }
}

provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "example-instance"
  }
}

Ejecutar:

terraform init
terraform plan
terraform apply

Cheatsheet

ComandoDescripción
terraform initInicializar directorio de trabajo
terraform planPrevisualizar cambios
terraform applyAplicar cambios
terraform destroyDestruir infraestructura
terraform fmtFormatear código
terraform validateValidar configuración
terraform outputMostrar outputs
terraform state listListar recursos en el estado

Gotchas

Variables

# variables.tf
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t2.micro"
}

# main.tf
resource "aws_instance" "example" {
  instance_type = var.instance_type
}

# terraform.tfvars
instance_type = "t3.small"

Outputs

output "instance_ip" {
  value       = aws_instance.example.public_ip
  description = "Public IP of the instance"
}

Data sources

data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name   = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*"]
  }
  owners = ["099720109477"]
}

resource "aws_instance" "example" {
  ami = data.aws_ami.ubuntu.id
}

Modules

module "vpc" {
  source  = "terraform-aws-modules/vpc/aws"
  version = "5.0.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
}

Next Steps