Ja tens la xarxa a punt (VPC, subxarxa pública, Internet Gateway i rutes). Ara posarem el protagonista: un servidor EC2 dins d'aquesta subxarxa, accessible des d'internet. Recorda tot el del Capítol 4 sobre instàncies; ara ho escrivim a Terraform.

Què afegirem

Sobre la xarxa del subcapítol anterior, afegim una instància EC2:

┌──────────── VPC (10.0.0.0/16) ────────────┐
│   ┌─ Subxarxa pública (10.0.1.0/24) ─┐       │
│   │   ┌──────────────────┐          │      │
│   │   │  Instància EC2   │ ◄── nova │      │
│   │   │   (servidor web) │          │      │
│   │   └──────────────────┘          │      │
│   └─────────────────────────────────┘      │
└────────────────────────────────────────────┘

Pas 1: Trobar la AMI (la imatge base)

Recorda que tota instància parteix d'una AMI (subcapítol 4.2). En lloc d'escriure a mà un ID d'AMI (que canvia amb el temps i segons la regió), el millor és cercar la més recent automàticament amb un bloc data:

data "aws_ami" "amazon_linux" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["al2023-ami-*-x86_64"]
  }
}

Què és un bloc data? És una novetat important: mentre resource crea alguna cosa, un bloc data (data source) consulta informació existent a AWS sense crear res. Aquí preguntem a AWS «quina és la AMI més recent d'Amazon Linux 2023?» i guardem la resposta per fer-la servir. És molt útil per no escriure valors fixos que caduquen.

Pas 2: Definir variables (bona pràctica)

Perquè el codi sigui flexible (subcapítol 10.1), definim algunes variables:

variable "tipus_instancia" {
  description = "Tipus d'instància EC2"
  type        = string
  default     = "t3.micro"     # apte per a capa gratuïta (Capítol 4)
}

variable "nom_projecte" {
  type    = string
  default = "el-meu-primer-servidor"
}

Fer servir t3.micro (subcapítol 4.1) és ideal per aprendre, perquè entra a la capa gratuïta d'AWS.

Pas 3: Crear la instància EC2

Ara el recurs principal. El col·loquem a la nostra subxarxa pública:

resource "aws_instance" "web" {
  ami                    = data.aws_ami.amazon_linux.id   # la AMI que hem cercat
  instance_type          = var.tipus_instancia            # la variable
  subnet_id              = aws_subnet.publica.id          # ← a la subxarxa pública
  vpc_security_group_ids = [aws_security_group.web.id]    # firewall (subcap. 12.3)

  tags = {
    Name = var.nom_projecte
  }
}

Analitzem les connexions:

  • ami → referència al data source del pas 1 (la AMI trobada).
  • instance_type → la variable del pas 2.
  • subnet_id → referència a la subxarxa pública del subcapítol 12.1. Això col·loca el servidor a la nostra xarxa, a la zona pública.
  • vpc_security_group_ids → referència al Security Group (el firewall), que crearem al següent subcapítol.

Cada referència crea una dependència: Terraform crearà primer la subxarxa i el Security Group, i després la instància.

Pas 4: Instal·lar programari a l'arrencada (user_data)

Sovint vols que el servidor faci alguna cosa només arrencar, com instal·lar un servidor web. Per això existeix user_data: un script que s'executa automàticament la primera vegada que la instància arrenca.

resource "aws_instance" "web" {
  ami                    = data.aws_ami.amazon_linux.id
  instance_type          = var.tipus_instancia
  subnet_id              = aws_subnet.publica.id
  vpc_security_group_ids = [aws_security_group.web.id]

  user_data = <<-EOF
    #!/bin/bash
    yum update -y
    yum install -y httpd
    systemctl start httpd
    systemctl enable httpd
    echo "<h1>Hola des del meu primer servidor a AWS amb Terraform!</h1>" > /var/www/html/index.html
  EOF

  tags = {
    Name = var.nom_projecte
  }
}

Aquest script: actualitza el sistema, instal·la el servidor web Apache (httpd), l'arrenca i crea una pàgina de benvinguda. Quan la instància estigui a punt, servirà una web amb aquest missatge.

El que acabem d'aconseguir: amb user_data, el servidor es autoconfigura en néixer. No cal connectar-s'hi per instal·lar res a mà. Això és clau per automatitzar i per a l'autoescalat (Capítol 13): cada nou servidor es prepara sol. (Per a configuracions complexes, es prefereix crear una AMI ja preparada, recorda el subcapítol 4.2, però user_data és perfecte per començar.)

L'estat actual

Ara mateix tenim:

✓ Xarxa completa (subcapítol 12.1)
✓ Una AMI trobada automàticament (data source)
✓ Una instància EC2 a la subxarxa pública
✓ Un script que instal·la un servidor web a l'arrencada
✗ Falta: el Security Group (firewall) — subcapítol 12.3
✗ Falta: una IP fixa i els outputs — subcapítols 12.3 i 12.4

Si executessis plan ara, Terraform es queixaria que falta el Security Group (aws_security_group.web) que referenciem però encara no hem creat. Això ho resolem al següent subcapítol.

El que has de recordar

  • Un bloc data (data source) consulta informació existent a AWS sense crear res (l'hem fet servir per trobar la AMI més recent automàticament, evitant IDs fixos que caduquen).
  • La instància es col·loca a la subxarxa amb subnet_id, referenciant la subxarxa pública del capítol anterior.
  • Fer servir variables (com tipus_instancia) fa el codi flexible; t3.micro és ideal per a la capa gratuïta.
  • user_data és un script que el servidor executa a l'arrencada, perfecte per autoconfigurar-se (instal·lar programari, etc.) sense intervenció manual.
  • Les referències entre recursos creen les dependències i l'ordre de creació automàtic.

Al següent subcapítol crearem el Security Group (firewall) que falta i donarem al servidor una Elastic IP fixa.

Cloud, AWS & Terraform — De zero a expert

Capítol 1 · Què és el cloud computing

Capítol 2 · El mercat cloud i els grans proveïdors

Capítol 3 · Regions, zones de disponibilitat i edge

Capítol 4 · Càlcul: EC2

Capítol 5 · Emmagatzematge: S3

Capítol 6 · Xarxes: VPC

Capítol 7 · Identitat i accés: IAM

Capítol 8 · Bases de dades gestionades

Capítol 9 · Per què Infraestructura com a Codi

Capítol 10 · HCL: el llenguatge de Terraform

Capítol 11 · Providers i estat

Capítol 12 · La teva primera infraestructura real amb Terraform

Capítol 13 · Balanceig de càrrega i autoescalat

Capítol 14 · Serverless amb Lambda

Capítol 15 · Missatgeria i esdeveniments

Capítol 16 · Lliurament de contingut i DNS

Capítol 17 · Contenidors a AWS

Capítol 18 · Mòduls: reutilització i composició

Capítol 19 · Workspaces i gestió d'entorns

Capítol 20 · Backends remots i locking

Capítol 21 · Testing d'infraestructura

Capítol 22 · Terraform en CI/CD

Capítol 23 · Seguretat en profunditat

Capítol 24 · Observabilitat: logs, mètriques i traces

Capítol 25 · Optimització de costos

Capítol 26 · Alta disponibilitat i disaster recovery

Capítol 27 · Well-Architected Framework d'AWS

Capítol 28 · Arquitectures serverless a escala

Capítol 29 · Plataformes de dades a AWS

Capítol 30 · Multi-compte i landing zones

Capítol 31 · Platform Engineering i Internal Developer Platform

Capítol 32 · Certificacions AWS rellevants

Capítol 33 · Projectes per consolidar el que s'ha après

Capítol 34 · Recursos i comunitat

© Copyright 2024. Tots els drets reservats