2016-10-28 1 views
1

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 } 
} 

잘 작동합니다. 각 환경에 대해 서로 다른 azsprivate_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를 작성할 수있는 맞춤 스파게티 코드를 손으로 작성할 수도 있지만 목표는 코드를 구성 가능하고 유지 관리 가능하게 유지하고 속성과 로직을 분리하는 것입니다.

+0

비슷한 요구 사항 : – Hafiz

+0

이러한 상황에서 필자는 보통 'x * y'를 계산 한 다음'내 요소 '호출 중 하나에서 보간법으로'element (var. 목록, 바닥 (count.index/x))'. 'element'는리스트를 반복하기 때문에 중첩 된리스트만큼 깨끗하지는 않지만 대부분의 필요를 성취합니다. –

답변

1

하면 잠재적 element 보간법 일부 수학 이것을 달성 할 수

resource "aws_vpc_peering_connection" { 
    peer_vpc_ids = "${element(var.vpc_ids, count.index)}" 
    peer_vpc_blocks = "${element(var.vpc_blocks,floor(count.index/length(var.vpc_ids))}" 
    count = "${length(var.vpc_ids) * length(var.vpc_blocks)}" 
} 

구체적 element(var.vpc_blocks,floor(count.index/length(var.vpc_ids)) 호출 VPC 블록이 var.vpc_ids 값마다 1 증가 할 것이다.

관련 문제