Các tuyến Terraform Client VPN với nhiều CIDR hơn subnet
Liên kết, tuyến và phân quyền là các đối tượng riêng. Ánh xạ từng CIDR đích tới một subnet đã liên kết thay vì đánh chỉ mục một danh sách subnet ngắn hơn.
Một laptop kết nối tới điểm cuối Client VPN, và terraform apply vẫn thất bại trên một tài nguyên tuyến. Cấu hình thường có nhiều CIDR đích hơn subnet đã liên kết, và khối tuyến chọn mục tiêu bằng chỉ mục. Điều đó giả định hai tập hợp song song với nhau. Chúng không song song, và lỗi xuất hiện lúc áp dụng thay vì lúc xem xét.
Gọi tên đối tượng thất bại
Ba tài nguyên tham gia và mỗi tài nguyên trả lời một câu hỏi khác. Liên kết đặt giao diện mạng của điểm cuối vào một subnet. Tuyến cho biết tiền tố đích nào được chuyển tới subnet đích. Quy tắc phân quyền cho biết người dùng nào có thể tiếp cận tiền tố nào. Một tuyến trỏ tới subnet chưa từng được liên kết sẽ thất bại ngay cả khi cả hai đối tượng tồn tại, vì mục tiêu phải thuộc điểm cuối này.
Trước tiên hãy liệt kê các liên kết: aws ec2 describe-client-vpn-target-networks --client-vpn-endpoint-id cvpn-endpoint-0123456789abcdef0.
Hãy nhớ tuyến cục bộ của VPC
Liên kết đầu tiên thêm một tuyến cục bộ cho toàn bộ VPC, nên mọi subnet trong VPC đó đã có thể tiếp cận mà không cần tài nguyên tuyến. Có thêm các tuyến cho VPC ngang hàng, kết nối Transit Gateway và tiền tố on-premises mà VPC không sở hữu. Đó là lý do một điểm cuối có ba liên kết có thể mang hợp lệ bảy mục đích.
Đếm các đích nằm ngoài VPC trước khi thêm tuyến. Nếu con số đó nhỏ hơn danh sách CIDR, danh sách đang mô tả những subnet không cần tuyến nào cả.
Thay chỉ mục bằng một ánh xạ
Bọc chỉ mục trong toán tử modulo làm lỗi im lặng và giữ lại sai sót mô hình hóa. Một đích không thể tiếp cận qua mục tiêu đã chọn vẫn không mang lưu lượng, dù kế hoạch được áp dụng sạch đến đâu. Thay vào đó hãy lưu quan hệ, và để Terraform kiểm tra trước khi tạo bất cứ thứ gì. Khối bên dưới là ví dụ và dùng các đối số tuyến của điểm cuối từ nhà cung cấp.
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."
}
}
}
Khi ánh xạ nằm cạnh danh sách liên kết, việc thêm một đích buộc phải quyết định subnet nào mang nó. Đó là cuộc trò chuyện mà chỉ mục đã che giấu.
Một lỗi khác tạo ra giá trị vô nghĩa thay vì lỗi chỉ mục. Truyền một cấu trúc cấp thấp vào nơi mong đợi giao diện cấp cao hơn khiến các trường API đọc bị bỏ trống, và CIDR tạo ra không dùng được. Terraform hiển thị cùng hình dạng khi một chuỗi đến nơi mong đợi đối tượng. Kiểm tra lược đồ của nhà cung cấp cho kiểu đối số.
Chứng minh điều đó từ một máy khách
Chạy terraform validate và một kế hoạch so với trạng thái thật trước khi áp dụng. Sau đó so sánh danh sách mạng đích của điểm cuối với ánh xạ thay vì tin vào một apply thành công.
Bài kiểm tra chấp nhận là một máy khách đã kết nối tiếp cận được từng tiền tố dự kiến.
Quy tắc phân quyền là nơi nhiều cấu hình dừng lại sớm. Nó được giới hạn theo CIDR đích và một nhóm, và một tuyến không có phân quyền tương ứng tạo ra máy khách đã kết nối không thể tiếp cận tiền tố. Kiểm tra cả hai đối tượng cho từng tiền tố, vì một apply tạo tuyến mà quên quy tắc trông có vẻ hoàn chỉnh. Hãy thử với một người dùng trong nhóm và một người ngoài nhóm.
Khi một tiền tố thất bại, so sánh mục tuyến của nó với quy tắc phân quyền. Thiếu phân quyền và thiếu tuyến trông giống nhau trong nhật ký máy khách và được sửa ở các tài nguyên khác nhau.