Cómo crear Infraestructura como Código en AWS con Terraform

published on 18 March 2024

Crear infraestructura en AWS con Terraform te permite gestionar tus recursos en la nube de manera eficiente y automatizada. Terraform utiliza la Infraestructura como Código (IaC) para facilitar la creación, actualización y mantenimiento de tus sistemas. Aquí te mostraremos cómo empezar, desde los conceptos básicos hasta consejos avanzados:

  • Conceptos Básicos: Terraform te permite versionar tu infraestructura, desplegarla rápidamente y garantizar su consistencia.
  • Preparación: Necesitarás conocimientos básicos en nube, AWS, programación y manejo de sistemas. Además, es esencial tener una cuenta de AWS y AWS CLI instalado.
  • Instalación de Terraform: Disponible para Linux, Windows y macOS. Te enseñamos cómo instalarlo en cada sistema operativo.
  • Configuración de Credenciales de AWS: Cómo usar IAM para crear un usuario para Terraform y configurar sus credenciales.
  • Archivos de Configuración: Crea archivos .tf usando el lenguaje HCL para describir tu infraestructura.
  • Flujo de Trabajo de Terraform: Pasos básicos para desplegar tu infraestructura: terraform init, terraform plan, terraform apply y terraform destroy.
  • Módulos en Terraform: Aprovecha los módulos para reutilizar configuraciones comunes.
  • Manejo del Estado de Terraform: Importancia de gestionar correctamente el estado de Terraform para evitar inconsistencias.
  • Consejos y Mejores Prácticas: Recomendaciones para estructurar tus archivos, seguridad y más.
  • Recursos Adicionales: Dónde aprender más sobre Terraform y profundizar tus conocimientos.

Con estos pasos y consejos, estarás listo para comenzar a usar Terraform para gestionar tu infraestructura en AWS de manera eficaz y eficiente.

Conocimientos Básicos

Es útil saber algo sobre:

  • La nube y AWS: Entender qué es una VPC, subnets, security groups, etc., te ayudará mucho.
  • Programación: No necesitas ser un experto, pero si sabes algo de Python, Go o Ruby, te será más fácil agarrarle el truco a Terraform.
  • Manejo de sistemas Linux y Windows: Cosas como instalar programas y manejar servicios te serán útiles.

No te preocupes si no eres un experto en estos temas. Con tener una idea general ya estás bien para empezar.

Cuenta en AWS

Para poder usar Terraform con AWS, necesitas una cuenta en Amazon Web Services. Si no tienes una, puedes registrarte para obtener una cuenta gratuita que te da acceso limitado a algunos recursos por 12 meses. También hay opciones de pago si necesitas más recursos.

AWS CLI

La interfaz de línea de comandos de AWS es una herramienta que te permite manejar los servicios y recursos de AWS desde la terminal. Aunque no es obligatorio tenerla, te puede facilitar la vida para algunas tareas, como crear usuarios para Terraform o encontrar IDs de recursos. Te recomendamos tenerla instalada y lista para usar antes de empezar con Terraform.

¿Qué es Terraform?

Terraform

Terraform es una herramienta gratuita que te ayuda a configurar y administrar tu infraestructura de tecnología. Piensa en ello como un asistente que organiza y pone en marcha todo lo que necesitas para que tus aplicaciones en la nube, como las de Amazon Web Services (AWS), funcionen sin problemas.

Con Terraform, en lugar de hacer clics y más clics en una interfaz de usuario o escribir comandos complicados, simplemente describes en un archivo de texto cómo quieres que sea tu infraestructura. Terraform luego toma ese archivo, entiende lo que quieres hacer y lo hace realidad.

Características clave

Aquí hay algunas cosas geniales sobre Terraform:

  • Infraestructura como código: Escribes lo que necesitas en un archivo de texto usando un lenguaje fácil de entender. Esto hace que sea más sencillo hacer cambios y mantener todo organizado.
  • Planes de ejecución: Terraform te muestra qué va a hacer antes de hacerlo. Esto te ayuda a evitar sorpresas o errores.
  • Gráficos de recursos: Terraform entiende cómo se relacionan tus servicios y recursos entre sí, así que puede hacer las cosas en el orden correcto y rápido.
  • Cambios incrementales: Terraform solo actualiza lo que ha cambiado desde la última vez que lo usaste, lo que significa que las cosas se hacen más rápido.

Ventajas sobre otras herramientas

Comparado con otras herramientas como CloudFormation de AWS o scripts en Bash, Terraform tiene algunas ventajas:

  • Puedes usarlo con muchos proveedores de servicios en la nube, no solo con uno. Esto es genial si usas servicios de diferentes compañías.
  • Te da un plan de lo que va a hacer antes de hacerlo, te muestra cómo se conectan tus recursos y solo cambia lo que necesita cambiar. Esto te da más control.
  • Es fácil de usar en cualquier computadora porque viene en un solo paquete sin necesidad de instalar otras cosas.
  • Tiene un lenguaje sencillo y claro que hace más fácil trabajar en equipo y reutilizar lo que ya has hecho.

En resumen, Terraform te facilita mucho la vida cuando se trata de configurar y manejar tu infraestructura en la nube, haciéndolo una opción muy buena para trabajar con Infraestructura como Código.

Cómo instalar Terraform

En Linux

Si usas Linux, como Ubuntu, Debian o CentOS, lo mejor es usar el administrador de paquetes propio de tu sistema.

Ubuntu / Debian

Para instalar Terraform, simplemente abre la terminal y escribe:

sudo apt update
sudo apt install terraform

CentOS / RHEL

En estos sistemas, los comandos son un poco diferentes:

sudo yum update
sudo yum install terraform

Si prefieres, puedes descargar Terraform directamente de su página web y hacer la instalación manualmente:

curl -O https://releases.hashicorp.com/terraform/X.X.X/terraform_X.X.X_linux_amd64.zip
unzip terraform_X.X.X_linux_amd64.zip
sudo mv terraform /usr/local/bin/

En Windows

Para los que usan Windows, la opción más fácil es usar Chocolatey:

choco install terraform

O descargar el instalador .exe desde la página de descargas y seguir las instrucciones.

En macOS

Si tienes macOS, puedes usar Homebrew para instalar Terraform fácilmente:

brew install terraform 

O, si prefieres, descarga el archivo .zip desde la página de descargas, descomprímelo y colócalo en un lugar que tu computadora pueda encontrar.

Cómo saber si se instaló bien

Para estar seguro de que Terraform se instaló correctamente, abre la terminal y escribe:

terraform --version

Si ves un número de versión, significa que todo está listo para usar.

Configuración de credenciales para AWS

Para que Terraform pueda hablar con AWS y crear o modificar cosas allí, necesita saber quién eres. Esto se hace usando unas claves especiales llamadas credenciales. Aquí te explicamos cómo preparar todo:

Crear usuarios de IAM

Lo más seguro es crear un usuario especial solo para Terraform en IAM, que es como el departamento de seguridad de AWS. A este usuario le das solo los permisos que necesita para hacer su trabajo y nada más. Aquí van los pasos:

  • Entra a la consola de IAM en AWS
  • Ve a la sección de Usuarios y elige "Agregar usuario"
  • Ponle un nombre y marca la opción de "Acceso programático"
  • Después, crea un grupo para este usuario y selecciona los permisos que necesita
  • Antes de terminar, revisa todo y dale a "Crear usuario"
  • Importante: apunta bien el access key ID y secret access key que te dan

Variables de entorno

Con las claves del usuario de IAM, ponlas como variables de entorno en tu computadora. Esto es como dejarle una nota a Terraform diciéndole cómo entrar a AWS:

export AWS_ACCESS_KEY_ID=\"TU_ACCESS_KEY\"
export AWS_SECRET_ACCESS_KEY=\"TU_SECRET_KEY\" 

Así, Terraform puede usar estas claves cada vez que necesita hacer algo en AWS.

Archivo de configuración

Otra opción es escribir las claves en un archivo especial llamado .aws/credentials, que se guarda en tu computadora. Aquí es donde lo pones:

[default]
aws_access_key_id = TU_ACCESS_KEY
aws_secret_access_key = TU_SECRET_KEY 

Archivos de configuración de Terraform

Los archivos de configuración de Terraform son los documentos donde se describe qué es lo que quieres que Terraform haga en tu infraestructura en la nube, como en AWS. Estos archivos terminan en .tf y están escritos en un lenguaje especial llamado HCL, que es bastante sencillo de entender.

Formato

  • Terminan en .tf
  • Son declarativos, es decir, tú dices qué quieres lograr
  • Puedes poner comentarios con #
  • Son fáciles de leer

Estructura

En estos archivos puedes incluir distintas partes:

  • terraform: ajustes generales de Terraform
  • provider: aquí se pone con qué servicio en la nube estás trabajando, como AWS
  • resource: son los elementos que quieres crear, como servidores o espacios de almacenamiento
  • data: información sobre recursos que ya existen
  • module: piezas de código que puedes reusar
  • output: información que Terraform te da después de hacer su trabajo

Sintaxis

La manera de escribir en estos archivos es simple:

resource "tipo_recurso" "nombre" {
  atributo1 = "valor"
  atributo2 = "valor" 
}

Por ejemplo, para una máquina virtual en AWS sería algo así:

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

O para un espacio de almacenamiento S3:

resource "aws_s3_bucket" "mi_bucket" {
  bucket = "nombre-bucket-unico"
  acl    = "private" 
}

Así puedes describir cualquier recurso de AWS que quieras usar.

Flujo de trabajo de Terraform

El proceso para usar Terraform con AWS se divide en pasos claros:

terraform init

Este primer paso prepara tu proyecto. Cuando ejecutas terraform init, Terraform se pone listo descargando lo necesario para trabajar con AWS. Piensa en ello como preparar tu caja de herramientas antes de empezar un proyecto.

Lo que hace este comando incluye:

  • Baja e instala lo necesario para que Terraform y AWS puedan comunicarse.
  • Revisa que los archivos de tu proyecto estén escritos correctamente.
  • Prepara un archivo donde guarda información de tu infraestructura.

Es el punto de partida para cualquier cosa que quieras hacer con Terraform.

terraform plan

Con terraform plan, Terraform te muestra un resumen de lo que va a hacer antes de hacerlo. Esto te permite revisar que los cambios que se van a aplicar son realmente los que quieres.

En este resumen puedes ver:

  • Cuáles recursos se van a añadir, cambiar o quitar.
  • El orden en que Terraform va a hacer los cambios.
  • Si los cambios propuestos exceden algún límite de AWS.

Es como darle un vistazo al plano antes de construir algo, para asegurarte de que todo esté correcto.

terraform apply

Si el plan se ve bien, el siguiente paso es terraform apply. Este comando hace todos los cambios que Terraform te mostró en el plan. Crea, cambia o elimina recursos en AWS para que tu infraestructura sea exactamente como la definiste en tus archivos.

Después de aplicar los cambios, Terraform actualiza su archivo de información para recordar qué hizo. Así, tu proyecto de AWS está al día con tus archivos de Terraform.

terraform destroy

Finalmente, cuando ya no necesitas los recursos que Terraform creó, puedes usar terraform destroy. Este comando elimina todo lo que Terraform había configurado, dejando limpio tu espacio en AWS.

Es útil para cuando estás experimentando o terminaste un proyecto y no quieres dejar cosas sin usar que te podrían costar dinero.

En resumen, Terraform te ayuda a gestionar tu infraestructura en AWS de una manera organizada, paso a paso, desde la preparación hasta la limpieza final.

sbb-itb-03dc61e

Ejemplo: Desplegando un servidor web en AWS

Archivos de configuración

Para poner en marcha un servidor web en AWS usando Terraform, primero debemos definir qué queremos construir en unos archivos de texto llamados archivos de configuración.

Vamos a necesitar varios recursos como:

  • Una red privada virtual (VPC) y subredes
  • Un grupo de seguridad
  • Una máquina virtual EC2 con el servidor web Apache

Podemos organizar el código en diferentes archivos .tf. Por ejemplo:

vpc.tf

resource "aws_vpc" "mi_vpc" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_subnet" "mi_subnet" {
  vpc_id = aws_vpc.mi_vpc.id
  cidr_block = "10.0.1.0/24"
}

servidor.tf

resource "aws_instance" "mi_servidor" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  
  # Para instalar Apache
  user_data = <<-EOF
              #!/bin/bash
              yum update -y
              yum install -y httpd
              systemctl start httpd
              EOF

  vpc_security_group_ids = [aws_security_group.sg_web.id]
  
  subnet_id = aws_subnet.mi_subnet.id
  
  tags = {
    Name = "Mi servidor web"
  }
}

Inicialización

Una vez que tenemos todo listo, preparamos Terraform con:

terraform init

Esto prepara el terreno para trabajar con AWS.

Planificación

Después, creamos un plan para ver qué cambios se harán:

terraform plan

Nos aseguramos de que todo esté correcto.

Aplicación

Si estamos de acuerdo con el plan, lo ponemos en marcha:

terraform apply

Terraform nos mostrará cómo va creando los recursos en AWS.

Actualización

Si queremos mejorar nuestro servidor, por ejemplo, cambiarlo a uno más grande, modificamos servidor.tf:

resource "aws_instance" "mi_servidor" {

  # otras configuraciones...

  instance_type = "t2.large" # Cambiamos a una instancia más grande

}

Y repetimos el proceso de planificación y aplicación:

terraform plan # Para revisar los cambios
terraform apply # Para hacer el cambio

Limpieza

Al final, si queremos eliminar todo, usamos:

terraform destroy

Así, dejamos AWS sin los recursos que habíamos creado.

Módulos en Terraform

Los módulos en Terraform son como cajas de herramientas que agrupan configuraciones que puedes usar más de una vez. Esto ayuda a mantener tu código ordenado y facilita compartir configuraciones útiles.

Creando módulos

Si tienes una parte de tu configuración de Terraform que piensas usar en varios lugares, puedes convertirla en un módulo. Por ejemplo, si tienes un grupo de seguridad que quieres reutilizar, puedes hacerlo así:

module "security_group" {
  source = "./security_group"
  vpc_id = aws_vpc.main.id

  ingress_rules = [{
    port        = 443
    description = "Permitir tráfico HTTPS"
  }]
}

Y defines el módulo en ./security_group:

variable "vpc_id" {}

variable "ingress_rules" {
  type = list(object({
    port        = number
    description = string  
  }))
}

resource "aws_security_group" "this" {
  vpc_id = var.vpc_id

  dynamic "ingress" {
    for_each = var.ingress_rules
    
    content {
      description = ingress.value.description
      from_port   = ingress.value.port
      to_port     = ingress.value.port
      protocol    = "tcp"
    }
  }
}

De esta forma, puedes reusar esta configuración sin tener que escribirla de nuevo.

Consumiendo módulos

Terraform tiene un lugar donde la gente comparte módulos que han hecho, llamado registro público de módulos. Aquí puedes encontrar módulos para cosas como poner en marcha un clúster EKS en AWS:

module "eks" {
  source  = "terraform-aws-modules/eks/aws"
  version = "18.0.4"

  cluster_name    = "mi-cluster"
  cluster_version = "1.21"

  vpc_id  = "vpc-1234556abcdef"
  
  subnet_ids = [
    "subnet-abcde012",
    "subnet-bcde012a" 
  ]

  node_groups = {
    example = {
      desired_capacity = 2
      max_capacity     = 10
      min_capacity     = 1

      instance_types = ["t3.medium"]
    }
  }
}

Esto te ahorra mucho tiempo porque no tienes que configurar todo desde cero.

Mejores prácticas

Cuando creas tus propios módulos, es importante:

  • Documentar bien lo que hace cada parte
  • Mantener un código limpio y ordenado
  • Probar bien antes de usarlos en proyectos importantes

Y si decides compartir tus módulos:

  • Escoge una licencia que permita a otros usarlos libremente
  • Proporciona una buena documentación
  • Usa versiones de forma clara
  • Automatiza pruebas y actualizaciones

Así, no solo te beneficias tú, sino que también ayudas a otros.

Estado de Terraform

Manejar bien el estado es super importante para que Terraform haga su trabajo correctamente. El estado es básicamente un archivo que guarda información sobre los recursos que tienes en tu infraestructura y cómo están configurados. Aquí te explicamos algunas formas de manejar el estado:

Almacenamiento local

Normalmente, Terraform guarda el estado en un archivo en tu computadora llamado terraform.tfstate. Esto está bien para proyectos pequeños o de prueba, pero tiene sus problemas cuando trabajas en equipo:

  • El estado solo se guarda en tu máquina, así que no lo pueden ver los demás.
  • Hay riesgo de que los datos se mezclen o se pierdan si varias personas intentan hacer cambios al mismo tiempo.

Backend remoto

Una mejor idea es usar un backend remoto para guardar el estado. Esto tiene varias ventajas:

  • Compartir el estado para que todos en el equipo puedan acceder a la misma información.
  • Ejecutar Terraform desde diferentes lugares sin problemas con el estado.
  • Guardar el estado en un lugar seguro como S3 para evitar perderlo.

Configurar esto es sencillo, solo tienes que añadir un bloque backend en tu configuración de Terraform:

terraform {
  backend "s3" {
    bucket = "mi-bucket-terraform"
    key    = "estado/mi-app.tfstate"
    region = "us-east-1" 
  }
}

Bloqueo de estado

Si en tu equipo varias personas pueden hacer cambios al mismo tiempo, es buena idea usar el bloqueo de estado.

Esto previene que los datos se dañen porque alguien más está haciendo cambios mientras tú trabajas. Terraform puede "bloquear" el estado mientras se hacen cambios para que nadie más pueda modificarlo al mismo tiempo.

Para activarlo, solo usa la opción -lock=true:

terraform apply -lock=true

En resumen, manejar bien el estado de Terraform ayuda a que todo funcione de manera consistente, segura y facilita el trabajo en equipo.

Consejos y mejores prácticas

Estructura de archivos

Para que sea más fácil manejar tus archivos de Terraform, te sugerimos lo siguiente:

  • Organiza los archivos según su propósito, como vpc.tf para la red virtual, servidores.tf para las máquinas virtuales, y bases_de_datos.tf para las bases de datos.
  • Elige nombres que expliquen claramente qué contiene cada archivo o recurso. Por ejemplo, usa servidor_web.tf en vez de solo instancia.tf.
  • Mantén un archivo variables.tf donde declares todas las variables que utilices en tu proyecto.
  • Guarda los módulos reutilizables en una carpeta separada llamada modulos/.

Esto te ayudará a saber dónde está cada cosa y a facilitar el entendimiento del proyecto a otras personas.

Formateo

Para que tus archivos sean fáciles de leer y entender:

  • Usa espacios (2 o 4) para hacer sangrías en el código, evita los tabuladores.
  • Si tienes líneas muy largas, divídelas para que sean más fáciles de leer.
  • Escribe comentarios para explicar qué hace cada recurso o sección importante.
  • Usa espacios y saltos de línea para separar diferentes secciones del código.

Con estos consejos, cualquiera podrá entender tu código más rápidamente.

Seguridad

Aquí van algunos tips para mantener tus proyectos seguros:

  • Evita poner contraseñas directamente en los archivos. Mejor usa variables de entorno o los secretos de AWS.
  • Dale a tus recursos solo los permisos que realmente necesiten para funcionar.
  • Si puedes, encripta los discos y volúmenes para proteger los datos.
  • Prefiere usar roles y políticas de IAM antes que claves de acceso directas.

Siguiendo estos pasos, minimizarás los riesgos de que alguien no autorizado acceda a tu infraestructura o de que se filtren datos sensibles.

Preguntas Relacionadas

¿Qué es AWS Terraform?

Terraform es una herramienta que te permite manejar tu infraestructura de tecnología con archivos de texto. Imagina que puedes escribir en un documento cómo quieres que sea tu sistema en la nube, y Terraform lo hace realidad. Funciona con AWS (Amazon Web Services) y otros proveedores de nube, permitiéndote hacer cambios de manera segura y colaborar con tu equipo.

¿Cómo sabe Terraform lo que tiene que hacer con mi infraestructura?

Terraform lleva un registro de todo lo que maneja en un archivo especial llamado "estado". Este archivo le dice a Terraform cómo está configurado todo en la nube. Cuando quieres hacer un cambio, Terraform mira este archivo para saber desde dónde empezar y qué necesita actualizar. Esto ayuda a que los cambios sean precisos y a que varias personas puedan trabajar juntas sin problemas.

¿Qué tipo de lenguaje utiliza Terraform?

Terraform usa un lenguaje llamado HCL, que es bastante fácil de entender. Con este lenguaje, describes lo que quieres hacer en la nube, como crear una máquina virtual o un espacio de almacenamiento, usando bloques de texto simples. Por ejemplo, para hacer una máquina virtual en AWS, escribirías algo así:

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

Esto hace que trabajar con infraestructura compleja sea mucho más sencillo.

¿Cómo implementar Terraform?

Aquí tienes algunos consejos para usar Terraform de manera efectiva:

  • Divide tu configuración en módulos que puedas usar más de una vez.
  • Usa nombres claros y descriptivos para todo.
  • Solo usa las variables necesarias y no más.
  • Comparte información importante usando salidas.
  • Usa fuentes de datos para obtener detalles de la infraestructura existente.
  • Trata de no usar scripts personalizados a menos que sea absolutamente necesario.
  • Mantén cualquier script adicional bien organizado y separado.

Siguiendo estos pasos, te aseguras de que tu configuración sea fácil de manejar, entender y compartir con otros.

Related posts

Read more