Un portàtil es connecta al punt de connexió de Client VPN i terraform apply continua fallant en un recurs de ruta. La configuració sol tenir més CIDR de destinació que subxarxes associades, i el bloc de ruta tria un objectiu amb un índex. Això pressuposa que les dues col·leccions són paral·leles. No ho són, i la fallada apareix en el moment d'aplicar, no en la revisió.

Anomeneu l'objecte que falla

Hi intervenen tres recursos i cadascun respon una pregunta diferent. L'associació col·loca la interfície de xarxa del punt de connexió en una subxarxa. La ruta diu quin prefix de destinació es lliura a una subxarxa objectiu. La regla d'autorització diu quins usuaris poden arribar a quin prefix. Una ruta que apunta a una subxarxa que mai s'ha associat falla encara que tots dos objectes existeixin, perquè l'objectiu ha de pertànyer a aquest punt de connexió.

Primer lliste les associacions: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.

Recordeu la ruta local del VPC

La primera associació afegeix una ruta local per a tot el VPC, així que cada subxarxa d'aquell VPC ja és accessible sense un recurs de ruta. Existeixen rutes addicionals per a VPC entre iguals, connexions de Transit Gateway i prefixos on-premises que el VPC no posseeix. Per això un punt de connexió amb tres associacions pot portar legítimament set entrades de destinació.

Compteu les destinacions que queden fora del VPC abans d'afegir rutes. Si aquest recompte és menor que la llista de CIDR, la llista descriu subxarxes que no necessiten cap ruta.

Substituïu l'índex per un mapa

Embolcallar l'índex en un operador de mòdul silencia l'error i conserva l'error de modelatge. Una destinació a què no es pot arribar pel destí triat continua sense trànsit, per net que s'apliqui el pla. Guardeu la relació en el seu lloc i deixeu que Terraform la comprovi abans de crear res. El bloc següent és il·lustratiu i utilitza els arguments de ruta del punt de connexió del proveïdor.

variable "client_vpn_destinations" {
  description = "Destination CIDR mapped to an associated subnet key"
  type        = map(string)
}

resource "aws_ec2_client_vpn_route" "this" {
  for_each               = var.client_vpn_destinations
  client_vpn_endpoint_id = aws_ec2_client_vpn_endpoint.this.id
  destination_cidr_block = each.key
  target_vpc_subnet_id   = aws_subnet.private[each.value].id

  lifecycle {
    precondition {
      condition     = contains(keys(aws_subnet.private), each.value)
      error_message = "Route target must be a subnet key in the associated map."
    }
  }
}

Amb el mapa al costat de la llista d'associacions, afegir una destinació obliga a decidir quina subxarxa la porta. Aquesta és la conversa que l'índex amagava.

Una fallada diferent produeix valors absurds en lloc d'un error d'índex. Passar una construcció de nivell baix on s'espera una interfície de nivell superior deixa buits els camps que l'API llegeix, i el CIDR resultant és inutilitzable. Terraform mostra la mateixa forma quan arriba una cadena on s'espera un objecte. Comproveu l'esquema del proveïdor pel que fa al tipus d'argument.

Demostreu-ho des d'un client

Executeu terraform validate i un pla contra l'estat real abans d'aplicar. Després, compareu la llista de xarxes objectiu del punt de connexió amb el mapa en lloc de confiar en un apply correcte.

La prova d'acceptació és un client connectat que arriba a cada prefix previst.

La regla d'autorització és on moltes configuracions s'aturen aviat. Està limitada a un CIDR de destinació i a un grup, i una ruta sense una autorització corresponent produeix un client connectat que no pot arribar al prefix. Comproveu tots dos objectes per a cada prefix, perquè un apply que crea la ruta i s'oblida de la regla sembla complet. Proveu amb un usuari dins del grup i un de fora.

Quan falla un prefix, compareu la seva entrada de ruta amb la regla d'autorització. Una autorització absent i una ruta absent es veuen similars al registre del client i es corregeixen en recursos diferents.

Articles relacionats