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 који створи руту и заборави правило изгледа довршено. Тестирајте са једним корисником унутар групе и једним изван ње.
Када један префикс не успе, упоредите његов унос руте са правилом ауторизације. Недостајућа ауторизација и недостајућа рута изгледају слично у дневнику клијента и поправљају се у различитим ресурсима.