Маршруты Terraform Client VPN з большай колькасцю CIDR, чым падсетак
Асацыяцыя, маршрут і аўтарызацыя — асобныя аб'екты. Супастаўце кожны CIDR прызначэння са звязанай падсеткай замест індэксацыі карацейшага спісу падсетак.
Ноўтбук падключаецца да канцавога пункта Client VPN, а terraform apply усё яшчэ падае на рэсурсе маршруту. Канфігурацыя звычайна мае больш CIDR прызначэння, чым звязаных падсетак, і блок маршруту выбірае мэту па індэксе. Гэта мяркуе, што два наборы паралельныя. Яны не такія, і збой праяўляецца падчас прымянення, а не падчас разгляду.
Назвіце аб'ект, які падае
Задзейнічаны тры рэсурсы, і кожны адказвае на асобнае пытанне. Асацыяцыя змяшчае сеткавы інтэрфейс канцавога пункта ў падсетку. Маршрут паказвае, які прэфікс прызначэння дастаўляецца мэтавай падсетцы. Правіла аўтарызацыі паказвае, якія карыстальнікі могуць дасягнуць якога прэфікса. Маршрут, які паказвае на падсетку, што ніколі не была звязана, падае, нават калі абодва аб'екты існуюць, бо мэта павінна належаць гэтаму канцавому пункту.
Спачатку пералічыце асацыяцыі: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.
Памятайце лакальны маршрут VPC
Першая асацыяцыя дадае лакальны маршрут для ўсяго VPC, таму кожная падсетка ў гэтым VPC ужо дасягальная без рэсурсу маршруту. Дадатковыя маршруты існуюць для peered VPC, падключэнняў Transit Gateway і on-premises прэфіксаў, якімі VPC не валодае. Вось чаму канцавы пункт з трыма асацыяцыямі можа цалкам легітымна несці сем запісаў прызначэння.
Падлічыце прызначэнні, якія знаходзяцца па-за VPC, перш чым дадаваць маршруты. Калі гэтая колькасць меншая за спіс CIDR, спіс апісвае падсеткі, якім маршрут зусім не патрэбны.
Замяніце індэкс на карту
Абгортванне індэкса ў аператар модуля заглушае памылку і захоўвае памылку мадэлявання. Прызначэнне, да якога нельга дасягнуць праз абранай мэты, па-ранейшаму не нясе трафіку, як бы чыста ні прымяняўся план. Захоўвайце залежнасць замест гэтага, і няхай Terraform праверыць яе, перш чым нешта ствараць. Блок ніжэй — ілюстрацыйны і выкарыстоўвае аргументы маршруту канцавога пункта ад пастаўшчыка.
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."
}
}
}
Калі карта стаіць побач са спісам асацыяцый, даданне прызначэння патрабуе рашэння, якая падсетка яго нясе. Гэта тая размова, якую хаваў індэкс.
Іншы збой дае бессэнсоўныя значэнні замест памылкі індэкса. Перадача нізкаўзроўневай канструкцыі туды, дзе чакаецца інтэрфейс вышэйшага ўзроўню, пакідае палі, якія чытае API, незапоўненымі, і атрыманы CIDR становіцца непрыдатным. Terraform паказвае тую ж форму, калі радок прыходзіць туды, дзе чакаецца аб'ект. Праверце схему пастаўшчыка для тыпу аргумента.
Дакажыце гэта з кліента
Запусціце terraform validate і план супраць рэальнага стану перад прымяненнем. Пасля гэтага параўнайце спіс мэтавых сетак канцавога пункта з картай, а не давярайце паспяховаму apply.
Прыёмачны тэст — гэта падключаны кліент, які дасягае кожнага меркаванага прэфікса.
Правіла аўтарызацыі — гэта месца, дзе многія ўстаноўкі спыняюцца рана. Яно абмежавана CIDR прызначэння і групай, а маршрут без адпаведнай аўтарызацыі стварае падключанага кліента, які не можа дасягнуць прэфікса. Праверце абодва аб'екты для кожнага прэфікса, бо apply, які стварае маршрут і забывае правіла, выглядае завершаным. Праверце з адным карыстальнікам у групе і адным па-за ёй.
Калі адзін прэфікс падае, параўнайце яго запіс маршруту з правілам аўтарызацыі. Адсутная аўтарызацыя і адсутны маршрут выглядаюць падобна ў журнале кліента і выпраўляюцца ў розных рэсурсах.