Nešiojamasis kompiuteris prisijungia prie Client VPN galinio taško, o terraform apply vis dar nepavyksta maršruto ištekliuje. Konfigūracijoje paprastai būna daugiau paskirties CIDR nei susietų potinklių, o maršruto blokas pasirenka tikslą pagal indeksą. Tai daro prielaidą, kad abi kolekcijos yra lygiagrečios. Jos nėra, o klaida pasireiškia taikymo metu, o ne peržiūros metu.

Įvardykite objektą, kuris nepavyksta

Dalyvauja trys ištekliai ir kiekvienas atsako į skirtingą klausimą. Susiejimas įdeda galinio taško tinklo sąsają į potinklį. Maršrutas nurodo, kuris paskirties prefiksas pristatomas tiksliniam potinkliui. Autorizacijos taisyklė nurodo, kurie naudotojai gali pasiekti kurį prefiksą. Maršrutas, nurodantis į potinklį, kuris niekada nebuvo susietas, nepavyksta net kai abu objektai egzistuoja, nes tikslas turi priklausyti šiam galiniam taškui.

Pirmiausia išvardykite susiejimus: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.

Prisiminkite vietinį VPC maršrutą

Pirmasis susiejimas prideda vietinį maršrutą visam VPC, todėl kiekvienas to VPC potinklis jau pasiekiamas be maršruto ištekliaus. Papildomi maršrutai egzistuoja susietiems VPC, Transit Gateway prijungimams ir on-premises prefiksams, kurių VPC neturi. Štai kodėl galinis taškas su trimis susiejimais gali teisėtai turėti septynis paskirties įrašus.

Prieš pridėdami maršrutus, suskaičiuokite paskirties vietas, esančias už VPC ribų. Jei šis skaičius mažesnis už CIDR sąrašą, sąrašas aprašo potinklius, kuriems maršruto visai nereikia.

Pakeiskite indeksą žemėlapiu

Indekso įvyniojimas į modulio operatorių nutildo klaidą ir išsaugo modeliavimo klaidą. Paskirties vieta, kurios neįmanoma pasiekti per pasirinktą tikslą, vis tiek neveža jokio srauto, kad ir kaip švariai planas būtų taikomas. Vietoj to saugokite ryšį ir leiskite Terraform jį patikrinti prieš ką nors kuriant. Toliau pateiktas blokas yra iliustracinis ir naudoja tiekėjo galinio taško maršruto argumentus.

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

Kai žemėlapis yra šalia susiejimų sąrašo, paskirties vietos pridėjimas verčia nuspręsti, kuris potinklis ją veža. Tai pokalbis, kurį indeksas slėpė.

Kita klaida sukuria beprasmes reikšmes vietoj indekso klaidos. Perdavus žemo lygio konstrukciją ten, kur tikimasi aukštesnio lygio sąsajos, API skaitomi laukai lieka neužpildyti, o gautas CIDR yra netinkamas naudoti. Terraform rodo tą pačią formą, kai eilutė atvyksta ten, kur tikimasi objekto. Patikrinkite tiekėjo schemą argumento tipui.

Įrodykite tai iš kliento

Prieš taikydami paleiskite terraform validate ir planą tikros būsenos atžvilgiu. Tada palyginkite galinio taško tikslinių tinklų sąrašą su žemėlapiu, o ne pasitikėkite sėkmingu apply.

Priėmimo testas yra prisijungęs klientas, pasiekiantis kiekvieną numatytą prefiksą.

Autorizacijos taisyklė yra vieta, kur daugelis konfigūracijų sustoja anksti. Ji apribota paskirties CIDR ir grupe, o maršrutas be atitinkamos autorizacijos sukuria prisijungusį klientą, kuris negali pasiekti prefikso. Patikrinkite abu objektus kiekvienam prefiksui, nes apply, kuris sukuria maršrutą ir pamiršta taisyklę, atrodo baigtas. Išbandykite su vienu naudotoju grupėje ir vienu už jos ribų.

Kai vienas prefiksas nepavyksta, palyginkite jo maršruto įrašą su autorizacijos taisykle. Trūkstama autorizacija ir trūkstamas maršrutas kliento žurnale atrodo panašiai ir taisomi skirtinguose ištekliuose.

Susiję straipsniai