Terraform Client VPN-routes met meer CIDR's dan subnetten
Associatie, route en autorisatie zijn afzonderlijke objecten. Koppel elk bestemmings-CIDR aan een geassocieerd subnet in plaats van een kortere subnetlijst te indexeren.
Een laptop maakt verbinding met het Client VPN-eindpunt, en terraform apply mislukt nog steeds op een routebron. De configuratie heeft meestal meer bestemmings-CIDR's dan geassocieerde subnetten, en het routeblok kiest een doel met een index. Dat veronderstelt dat de twee verzamelingen parallel zijn. Dat zijn ze niet, en de fout komt bij het toepassen naar voren in plaats van bij de beoordeling.
Benoem het object dat faalt
Drie resources zijn betrokken en elk beantwoordt een andere vraag. De associatie plaatst de netwerkinterface van het eindpunt in een subnet. De route zegt welk bestemmingsprefix aan een doelsubnet wordt geleverd. De autorisatieregel zegt welke gebruikers welk prefix mogen bereiken. Een route die naar een subnet wijst dat nooit is geassocieerd, faalt zelfs als beide objecten bestaan, omdat het doel bij dit eindpunt moet horen.
Noem eerst de associaties: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.
Onthoud de lokale route van de VPC
De eerste associatie voegt een lokale route toe voor de hele VPC, dus elk subnet in die VPC is al bereikbaar zonder routebron. Extra routes bestaan voor peered VPC's, Transit Gateway-koppelingen en on-premises prefixen die de VPC niet bezit. Daarom kan een eindpunt met drie associaties legitiem zeven bestemmingsitems dragen.
Tel de bestemmingen buiten de VPC voordat je routes toevoegt. Als dat aantal kleiner is dan de CIDR-lijst, beschrijft de lijst subnetten die helemaal geen route nodig hebben.
Vervang de index door een kaart
De index in een modulo-operator wikkelen sust de fout en houdt de modelleringsfout. Een bestemming die via het gekozen doel niet bereikbaar is, draagt nog steeds geen verkeer, hoe schoon het plan ook wordt toegepast. Bewaar in plaats daarvan de relatie, en laat Terraform die controleren voordat er iets wordt aangemaakt. Het blok hieronder is illustratief en gebruikt de eindpunt-routeargumenten van de provider.
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."
}
}
}
Als de kaart naast de associatielijst staat, dwingt het toevoegen van een bestemming een beslissing af over welk subnet die draagt. Dat is het gesprek dat de index verborgen hield.
Een andere fout levert onzinnige waarden op in plaats van een indexfout. Een constructie op laag niveau doorgeven waar een interface op hoger niveau wordt verwacht, laat de velden die de API leest ongevuld, en het resulterende CIDR is onbruikbaar. Terraform toont dezelfde vorm wanneer een tekenreeks aankomt waar een object wordt verwacht. Controleer het schema van de provider voor het argumenttype.
Bewijs het vanaf een client
Voer terraform validate uit en een plan tegen de echte staat voordat je toepast. Vergelijk daarna de doellijst van het eindpunt met de kaart in plaats van een geslaagde apply te vertrouwen.
De acceptatietest is een verbonden client die elk bedoeld prefix bereikt.
De autorisatieregel is waar veel opstellingen vroeg stoppen. Die is beperkt tot een bestemmings-CIDR en een groep, en een route zonder bijpassende autorisatie levert een verbonden client die het prefix niet kan bereiken. Controleer beide objecten voor elk prefix, want een apply die de route aanmaakt en de regel vergeet, lijkt compleet. Test met één gebruiker binnen de groep en één erbuiten.
Wanneer één prefix faalt, vergelijk de routevermelding met de autorisatieregel. Een ontbrekende autorisatie en een ontbrekende route lijken op elkaar in het clientlog en worden in verschillende resources hersteld.