terraform-0.7.7 사용. 내가 더 많거나 적은 다음있어, 모범 사례의 환매 특약의 AWS 부분 :Terraform : 여러 VPC 피어링 연결에 대해 프로그래밍 방식으로 여러 라우팅 테이블 생성
https://github.com/hashicorp/best-practices/tree/master/terraform
나는 VPC의 구축을위한 일반 템플릿을 마련하려합니다. 여러 개의 하위 모듈 (vpc, private_subnet 등)이있는 network
모듈을 사용하고 다른 환경을 구축하기 위해 terraform.tfvars 파일에서 다른 변수를 연결하기 만하면됩니다.
azs = "us-west-2a,us-west-2b,us-west-2c"
private_subnets = "10.XXX.1.0/24,10.XXX.2.0/24,10.XXX.3.0/24"
네트워크/private_subnets 모듈 즐겁게 서브넷을 생성합니다 :
의 민간 서브넷의 IP 블록을 하나 개의 내가 가용 영역의 목록을 가지고 환경, 다른 목록에 대한 .tfvars 파일에 있다고 가정 해 봅시다 , 경로 테이블 및 이러한 목록을 기반으로하는 연결 :
resource "aws_subnet" "private" {
vpc_id = "${var.vpc_id}"
cidr_block = "${element(split(",", var.cidrs), count.index)}"
availability_zone = "${element(split(",", var.azs), count.index)}"
count = "${length(split(",", var.cidrs))}"
tags { Name = "${var.name}-${element(split(",", var.azs), count.index)}-private" }
lifecycle { create_before_destroy = true }
}
resource "aws_route_table" "private" {
vpc_id = "${var.vpc_id}"
count = "${length(split(",", var.cidrs))}"
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = "${element(split(",", var.nat_gateway_ids), count.index)}"
}
tags { Name = "${var.name}-${element(split(",", var.azs), count.index)}-private" }
lifecycle { create_before_destroy = true }
}
resource "aws_route_table_association" "private" {
count = "${length(split(",", var.cidrs))}"
subnet_id = "${element(aws_subnet.private.*.id, count.index)}"
route_table_id = "${element(aws_route_table.private.*.id, count.index)}"
lifecycle { create_before_destroy = true }
}
잘 작동합니다. 각 환경에 대해 서로 다른 azs
및 private_subnets
목록이 있으며 VPC가 올바르게 만들어집니다. NAT 게이트웨이는 다른 모듈에서 이전에 만들어집니다. 저는 AZ 당 하나의 NAT 게이트웨이, 하나의 개인 서브넷 및 하나의 개인 라우팅 테이블을 가지고 있습니다.
하지만 지금은 같은 방식으로 VPC 피어링 연결을 만들려고합니다.
peer_vpc_ids = "vpc-XXXXXXXX, vpc-YYYYYYYY"
peer_vpc_blocks = "10.XXX.0.0/16, 10.YYY.0.0/16"
그래서 지금은 각 VPC 어깨를 나란히 연결 경로를 민간 라우팅 테이블로 전환 및 추가 Terraform 코드를 작성해야합니다.
문제는, 내가 AZ의 목록과 피어링 연결 목록의 두 변수로 반복해야한다는 것입니다. Terraform은이를 허용하지 않는 것 같습니다. AFAICT, Terraform에서 중첩 루프를 수행 할 수 없습니다.
내가 누락 된 항목이 있습니까? 이 문제를 해결할 더 좋은 방법이 있습니까?
물론 VPC를 작성할 수있는 맞춤 스파게티 코드를 손으로 작성할 수도 있지만 목표는 코드를 구성 가능하고 유지 관리 가능하게 유지하고 속성과 로직을 분리하는 것입니다.
비슷한 요구 사항 : – Hafiz
이러한 상황에서 필자는 보통 'x * y'를 계산 한 다음'내 요소 '호출 중 하나에서 보간법으로'element (var. 목록, 바닥 (count.index/x))'. 'element'는리스트를 반복하기 때문에 중첩 된리스트만큼 깨끗하지는 않지만 대부분의 필요를 성취합니다. –