Маршруты 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 уже доступна без ресурса маршрута. Дополнительные маршруты существуют для пиринговых 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, создающий маршрут и забывающий правило, выглядит завершённым. Проверьте с одним пользователем в группе и одним вне её.
Когда один префикс даёт сбой, сравните запись его маршрута с правилом авторизации. Отсутствующая авторизация и отсутствующий маршрут выглядят похоже в журнале клиента и исправляются в разных ресурсах.