Workspaces i Gestió d'Entorns
7. Workspaces i Gestió d'Entorns
Un dels reptes més comuns quan utilitzes Terraform és gestionar múltiples entorns (desenvolupament, staging, producció) que són similars però no idèntics.
El Problema dels Múltiples Entorns
Imagina que tens una aplicació web que vols desplegar en tres entorns:
- Development: 1 servidor petit, base de dades petita, sense alta disponibilitat
- Staging: Configuració similar a producció per fer proves finals
- Production: 3 servidors mitjans, base de dades gran amb replicació, alta disponibilitat
Com gestiones això amb Terraform? Hi ha diverses aproximacions, cadascuna amb els seus pros i contres.
Aproximació 1: Directoris Separats
La manera més simple és tenir un directori separat per cada entorn:
terraform/
├── development/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars
├── staging/
│ ├── main.tf
│ ├── variables.tf
│ └── terraform.tfvars
└── production/
├── main.tf
├── variables.tf
└── terraform.tfvars
Cada directori és una configuració completament independent amb el seu propi state. Això és simple però té desavantatges: molt codi duplicat, difícil mantenir consistència entre entorns, i més dificultat per compartir configuració comuna.
Aproximació 2: Terraform Workspaces
Els workspaces de Terraform permeten tenir múltiples instàncies d'estat en el mateix directori de configuració:
# Crear i canviar a un nou workspace
terraform workspace new development
terraform workspace new staging
terraform workspace new production
# Llistar workspaces
terraform workspace list
# Canviar entre workspaces
terraform workspace select production
Cada workspace té el seu propi state, però comparteix el mateix codi. Pots utilitzar la variable terraform.workspace per fer la configuració dinàmica:
locals {
# Configuració específica per entorn
environment_config = {
development = {
instance_type = "t3.micro"
instance_count = 1
db_instance_class = "db.t3.micro"
enable_multi_az = false
}
staging = {
instance_type = "t3.small"
instance_count = 2
db_instance_class = "db.t3.small"
enable_multi_az = false
}
production = {
instance_type = "t3.medium"
instance_count = 3
db_instance_class = "db.t3.large"
enable_multi_az = true
}
}
# Obtenir la configuració de l'entorn actual
env = local.environment_config[terraform.workspace]
}
resource "aws_instance" "web" {
count = local.env.instance_count
ami = data.aws_ami.ubuntu.id
instance_type = local.env.instance_type
tags = {
Name = "web-${terraform.workspace}-${count.index + 1}"
Environment = terraform.workspace
}
}
resource "aws_db_instance" "main" {
instance_class = local.env.db_instance_class
multi_az = local.env.enable_multi_az
tags = {
Name = "db-${terraform.workspace}"
Environment = terraform.workspace
}
}
Amb aquesta aproximació, el mateix codi funciona per a tots els entorns, però amb configuracions diferents segons el workspace actiu.
Aproximació 3: Terragrunt (Eina Complementària)
Terragrunt és una eina complementària que fa més fàcil mantenir configuracions DRY (Don't Repeat Yourself) quan tens múltiples entorns. Permet definir configuració comuna en un lloc i només especificar les diferències per cada entorn.
Estructura amb Terragrunt:
infrastructure/
├── terragrunt.hcl # Configuració comuna
├── modules/
│ └── webserver/ # Mòduls reutilitzables
├── development/
│ └── terragrunt.hcl # Configuració específica de dev
├── staging/
│ └── terragrunt.hcl # Configuració específica de staging
└── production/
└── terragrunt.hcl # Configuració específica de production
Referència: Pots aprendre més sobre Terragrunt a: https://terragrunt.gruntwork.io/
Quin Approach Utilitzar?
Directoris separats: Millor quan els entorns són molt diferents entre ells, o quan vols màxim aïllament (per exemple, per complir requisits de seguretat).
Workspaces: Millor quan els entorns són variacions del mateix design bàsic, i vols mantenir un sol conjunt de fitxers de configuració.
Terragrunt: Millor per a organitzacions grans amb molts entorns i molt codi compartit.
En la pràctica, moltes organitzacions utilitzen una combinació: directoris separats per a entorns molt diferents (per exemple, producció vs infraestructura compartida), i workspaces dins de cada directori per variacions menors.