terraform { required_version = ">= 1.5" required_providers { aws = { source = "hashicorp/aws", version = "~> 5.0" } random = { source = "hashicorp/random", version = "~> 3.6" } } } provider "aws" { region = var.region default_tags { tags = { Project = "kf-gwlb-lab" ManagedBy = "terraform" Owner = "csegovia" } } } variable "region" { type = string default = "us-east-1" } variable "vpc_cidr" { description = "Verificado libre contra la tabla de rutas del PA-410." type = string default = "10.20.0.0/16" } variable "azs" { type = list(string) default = ["us-east-1a", "us-east-1b"] } # Cinco subnets por AZ. Cada una tiene un rol distinto en el path de GENEVE. locals { az = { a = var.azs[0], b = var.azs[1] } subnets = { a = { public = "10.20.0.0/24" # NAT GW mgmt = "10.20.1.0/24" # eth0 del VM-Series fwdata = "10.20.2.0/24" # eth1, GENEVE, target del GWLB gwlbe = "10.20.3.0/24" # endpoints del GWLB app = "10.20.4.0/24" # workloads } b = { public = "10.20.10.0/24" mgmt = "10.20.11.0/24" fwdata = "10.20.12.0/24" gwlbe = "10.20.13.0/24" app = "10.20.14.0/24" } } # Rutas app -> GWLBE para cada prefijo del lab, por AZ. app_lab_routes = { for p in setproduct(keys(local.subnets), var.lab_cidrs) : "${p[0]}|${p[1]}" => { az = p[0], cidr = p[1] } } } # --- VPN / BGP --------------------------------------------------------------- variable "cgw_public_ip" { description = "IP publica del PA-410 (ethernet1/1)." type = string default = "" } variable "cgw_asn" { description = "AS local del PA-410, ya existente en el VR default." type = number default = 65000 } variable "vgw_asn" { type = number default = 64512 } variable "tunnel1_inside_cidr" { description = "169.254.100.0/30 NO se puede: la usa el peer HEX-CASA." type = string default = "169.254.200.0/30" } variable "tunnel2_inside_cidr" { type = string default = "169.254.201.0/30" } variable "lab_cidrs" { description = "Prefijos del home lab que se alcanzan por el tunel y se inspeccionan." type = list(string) default = [ "192.168.100.0/24", "192.168.106.0/24", "10.1.0.0/16", "10.142.0.0/16", ] } # --- Firewalls --------------------------------------------------------------- # Parametro publico de SSM que publica AWS Marketplace. Resuelve al AMI # correcto por region sin hardcodear IDs. # # prod- = listing "VM-Series Next-Gen Virtual Firewall # w/Advanced Threat Prevention (PAYG)" # # OJO: usar el AMI de OTRO listing hace que la instancia facture contra una # suscripcion que no tiene. El product code va atado al listing. variable "panos_ssm_parameter" { type = string default = "/aws/service/marketplace/prod-/pan-os-11.1.15" } # Override manual. Si se setea, gana sobre el parametro SSM. variable "panos_ami_id" { type = string default = "" } variable "panos_instance_type" { description = "GWLB necesita minimo 10.0.2. m5.xlarge soporta las NICs necesarias." type = string default = "m5.xlarge" } variable "key_pair_name" { type = string } # Lista, no string: la IP publica de salida del equipo desde el que se # administra NO siempre es la de ethernet1/1 del PA-410. Con un solo valor la # unica salida era agregar la IP real a mano en la consola, y como los bloques # ingress son inline, el siguiente terraform apply la revocaba en silencio. variable "admin_cidrs" { description = "CIDRs con acceso de gestion a los VM-Series (SSH, HTTPS, ICMP)." type = list(string) default = ["/32"] }