Prijenosnik se povezuje na Client VPN endpoint, a terraform apply i dalje pada na resursu rute. Konfiguracija obično ima više odredišnih CIDR-ova nego povezanih podmreža, a blok rute odabire cilj pomoću indeksa. To pretpostavlja da su dvije kolekcije paralelne. Nisu, a greška se pojavljuje pri primjeni, a ne pri pregledu.

Imenujte objekt koji pada

Uključena su tri resursa i svaki odgovara na drugo pitanje. Povezivanje smješta mrežno sučelje endpointa u podmrežu. Ruta kaže koji se odredišni prefiks isporučuje ciljnoj podmreži. Pravilo autorizacije kaže koji korisnici mogu dosegnuti koji prefiks. Ruta koja pokazuje na podmrežu koja nikada nije povezana pada čak i kada oba objekta postoje, jer cilj mora pripadati ovom endpointu.

Prvo navedite povezivanja: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.

Zapamtite lokalnu rutu VPC-a

Prvo povezivanje dodaje lokalnu rutu za cijeli VPC, pa je svaka podmreža u tom VPC-u već dostupna bez resursa rute. Dodatne rute postoje za peered VPC-ove, Transit Gateway privitke i on-premises prefikse koje VPC ne posjeduje. Zato endpoint s tri povezivanja može legitimno nositi sedam odredišnih unosa.

Prebrojite odredišta izvan VPC-a prije dodavanja ruta. Ako je taj broj manji od liste CIDR-ova, lista opisuje podmreže kojima ruta uopće nije potrebna.

Zamijenite indeks mapom

Omotavanje indeksa u modulo operator utišava grešku i zadržava grešku u modeliranju. Odredište do kojeg se ne može doći kroz odabrani cilj i dalje ne nosi promet, ma kako čisto plan bio primijenjen. Umjesto toga pohranite odnos i pustite Terraform da ga provjeri prije nego što išta stvori. Blok ispod je ilustrativan i koristi argumente rute endpointa od pružatelja.

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."
    }
  }
}

Kada je mapa uz listu povezivanja, dodavanje odredišta prisiljava na odluku koja podmreža ga nosi. To je razgovor koji je indeks skrivao.

Druga vrsta kvara proizvodi besmislene vrijednosti umjesto greške indeksa. Prosljeđivanje niskorazinske konstrukcije tamo gdje se očekuje sučelje više razine ostavlja polja koja API čita nepopunjenima, a rezultirajući CIDR je neupotrebljiv. Terraform pokazuje isti oblik kada niz stigne tamo gdje se očekuje objekt. Provjerite shemu pružatelja za tip argumenta.

Dokažite to s klijenta

Pokrenite terraform validate i plan prema stvarnom stanju prije primjene. Nakon toga usporedite listu ciljnih mreža endpointa s mapom umjesto da vjerujete uspješnom apply-u.

Prihvatni test je povezani klijent koji doseže svaki predviđeni prefiks.

Pravilo autorizacije mjesto je gdje mnoge postavke prerano staju. Ono je ograničeno na odredišni CIDR i grupu, a ruta bez odgovarajuće autorizacije stvara povezanog klijenta koji ne može dosegnuti prefiks. Provjerite oba objekta za svaki prefiks, jer apply koji stvori rutu i zaboravi pravilo izgleda dovršeno. Testirajte s jednim korisnikom unutar grupe i jednim izvan nje.

Kada jedan prefiks padne, usporedite njegov unos rute s pravilom autorizacije. Nedostajuća autorizacija i nedostajuća ruta izgledaju slično u klijentskom dnevniku i popravljaju se u različitim resursima.

Povezani članci