Lab 0: Prerrequisitos

Lab 0: Prerrequisitos


¿Dónde correr este workshop?

Este workshop es una experiencia volátil diseñada para empezar y concluir en el día. Por este motivo, el estado de Terraform se guarda localmente en archivos terraform.tfstate en el directorio de cada módulo, sin requerir buckets S3 ni almacenamiento remoto.

Aviso

¡Cuidado con los archivos terraform.tfstate y AWS CloudShell!
Si trabajás en AWS CloudShell, tené en cuenta que el almacenamiento es temporal y la sesión puede resetearse. Si la sesión expira o se reinicia, los archivos terraform.tfstate se perderán. Sin ellos, Terraform ya no sabrá qué recursos existen en AWS y no podrás hacer plan, apply ni destroy automáticamente, teniendo que borrarlos manualmente desde la consola.
Nunca borres los archivos terraform.tfstate ni las carpetas del workshop mientras tengas recursos desplegados.


Instalación de Terraform

Utilizá las instrucciones oficiales según tu sistema operativo o entorno:

CloudShell: Amazon Linux 2023

Aviso

Peligro de pérdida de datos: Al utilizar CloudShell, recordá respaldar o mantener activa la sesión para evitar perder los archivos terraform.tfstate al resetearse el entorno.

sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/AmazonLinux/hashicorp.repo
sudo dnf -y install terraform

macOS

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

Ubuntu

sudo apt-get update && sudo apt-get install -y gnupg software-properties-common
wget -O- https://apt.releases.hashicorp.com/gpg | \
gpg --dearmor | \
sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg > /dev/null
gpg --no-default-keyring \
--keyring /usr/share/keyrings/hashicorp-archive-keyring.gpg \
--fingerprint
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(grep -oP '(?<=UBUNTU_CODENAME=).*' /etc/os-release || lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update
sudo apt-get install terraform

Verificar versiones

terraform version
# Terraform v1.x.x

aws --version
# aws-cli/2.x.x

python3 --version
# Python 3.x.x

Paso 1: Configurar AWS CLI

Necesitás credenciales con permisos de administrador (o el conjunto de permisos del workshop):

aws configure
# AWS Access Key ID:     AKIA...
# AWS Secret Access Key: ****
# Default region name:   us-east-1
# Default output format: json

Verificar que funciona:

aws sts get-caller-identity

Si usás SSO o perfiles nombrados:

# Con perfil específico
export AWS_PROFILE=mi-perfil-aws

# Verificar
aws sts get-caller-identity

Paso 2: Directorio de trabajo

Todos los módulos Terraform viven en una carpeta de trabajo. Esto es lo que no debes perder:

mkdir -p ~/route53-arc-tf/{01_primary,02_secondary,03_arc,04_automation}
cd ~/route53-arc-tf
echo "✅ Workspace listo"

Estructura que tendrás al final del workshop:

~/route53-arc-tf/
├── global.env           Variables compartidas
├── 01_primary/
│   ├── main.tf          Configuración infraestructura sitio primario (EC2 + ALB + VPC)
│   ├── variables.tf     Definición de variables del módulo
│   ├── outputs.tf       Valores exportados (DNS ALB, Instance ID)
│   ├── userdata.sh      Script de bootstrap de Nginx y metadata
│   └── terraform.tfstate   ← NO borrar (Estado local)
├── 02_secondary/
│   ├── main.tf          Configuración sitio secundario (S3 + CloudFront)
│   ├── variables.tf     Definición de variables del módulo
│   ├── outputs.tf       Valores exportados (Dominio CloudFront, Bucket)
│   └── terraform.tfstate   ← NO borrar (Estado local)
├── 03_arc/
│   ├── main.tf          Configuración ARC Cluster, Routing Controls, Health Checks y DNS
│   ├── variables.tf     Definición de variables del módulo
│   ├── outputs.tf       Valores exportados (Endpoints ARC, ARNs Controls)
│   └── terraform.tfstate   ← NO borrar (Estado local)
└── 04_automation/
    ├── main.tf          Configuración SNS + Lambda Failover + Alarma CloudWatch
    ├── variables.tf     Definición de variables del módulo
    ├── outputs.tf       Valores exportados (ARN SNS, Nombre Lambda)
    ├── failover.zip     Paquete de código de la función Lambda
    └── terraform.tfstate   ← NO borrar (Estado local)

Paso 3: Verificar VPC Default y Crear Archivo de Variables Globales

¿Por qué creamos global.env?

Este archivo sirve para centralizar las variables de entorno compartidas por los 4 laboratorios (como la región de AWS, el ID de tu cuenta, el modo de VPC y la configuración de dominio). Al cargarlo con source global.env al inicio de cada lab, evitamos la necesidad de ingresar o modificar manualmente estos parámetros en cada paso.

Verificación de VPC Default

En AWS, cada región suele tener una VPC Default creada por defecto. Sin embargo, en algunas cuentas de producción o sandbox esta VPC puede haber sido eliminada. Para verificar si tu región actual dispone de una VPC Default antes de configurar tu entorno, ejecutá:

aws ec2 describe-vpcs --filters "Name=is-default,Values=true" --query "Vpcs[0].VpcId" --output text
  • Si devuelve un ID (ej: vpc-0a1b2c3d): Tenés una VPC Default funcional. Podés usar VPC_MODE="default".
  • Si devuelve None o nada: No tenés VPC Default. Debes usar VPC_MODE="new" para que Terraform cree automáticamente una VPC nueva con sus subredes e Internet Gateway.

Crear global.env

El siguiente bloque incluye una detección automática para asignar VPC_MODE según la disponibilidad de tu VPC Default:

DEFAULT_VPC_CHECK=$(aws ec2 describe-vpcs --filters "Name=is-default,Values=true" --query "Vpcs[0].VpcId" --output text 2>/dev/null)

if [ "$DEFAULT_VPC_CHECK" != "None" ] && [ -n "$DEFAULT_VPC_CHECK" ]; then
  AUTO_VPC_MODE="default"
  echo "VPC Default detectada: $DEFAULT_VPC_CHECK"
else
  AUTO_VPC_MODE="new"
  echo "No se encontró VPC Default. Se creará VPC nueva automáticamente."
fi

cat > ~/route53-arc-tf/global.env << EOF
export AWS_REGION="us-east-1"
export AWS_ACCOUNT_ID="$(aws sts get-caller-identity --query Account --output text)"

# VPC: "default" = reutilizar VPC default existente | "new" = crear VPC nueva
export VPC_MODE="${AUTO_VPC_MODE}"

# Dominio (opcional)
# "" = modo demo sin DNS público
# "tudominio.com" = dominio real con Public Hosted Zone en Route 53
export DOMAIN_NAME=""
export APP_SUBDOMAIN="app"
export HOSTED_ZONE_ID=""
EOF

source ~/route53-arc-tf/global.env
echo "Account: $AWS_ACCOUNT_ID | Region: $AWS_REGION | VPC_MODE: $VPC_MODE"

Agregá este source a tu .zshrc / .bashrc si querés que cargue automáticamente:

echo 'source ~/route53-arc-tf/global.env 2>/dev/null' >> ~/.zshrc

✅ Verificación del Lab 0

echo "=== Verificación Lab 0 ==="

terraform version | head -1 \
  && echo "✅ Terraform OK" || echo "❌ Terraform no instalado"

aws sts get-caller-identity --query Account --output text > /dev/null \
  && echo "✅ AWS CLI autenticado" || echo "❌ AWS CLI sin credenciales"

echo "Account: $AWS_ACCOUNT_ID | Region: $AWS_REGION | VPC_MODE: $VPC_MODE"

Siguiente paso → Lab 1: Sitio Primario