서브넷보다 CIDR 이 많은 Terraform Client VPN 라우트
연결, 라우트, 권한 부여는 별도 객체입니다. 더 짧은 서브넷 목록을 인덱싱하는 대신 각 대상 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 연결, VPC 가 소유하지 않은 on-premises 접두사에 존재합니다. 그래서 연결이 세 개인 엔드포인트가 일곱 개의 대상 항목을 합법적으로 가질 수 있습니다.
라우트를 추가하기 전에 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 는 완성된 것처럼 보이므로 모든 접두사에 대해 두 객체를 확인하세요. 그룹 안의 사용자 하나와 그룹 밖의 사용자 하나로 테스트하세요.
한 접두사가 실패하면, 그 라우트 항목을 권한 부여 규칙과 비교하세요. 권한 부여 누락과 라우트 누락은 클라이언트 로그에서 비슷하게 보이고 서로 다른 리소스에서 고칩니다.