无法为模块内的子网引用vpc_id

时间:2018-09-26 00:37:40

标签: terraform

具有模块/网络/ testvpc和模块/网络/子网模块配置。

mainfolder / modules / network / testvpc / main.tf

    variable "vpccidr" {type="list"}
    variable "vpcname" {type="list"}

   resource "aws_vpc" "customVpc" {
   count = "${length(var.vpccidr)}"
   cidr_block = "${element(var.vpccidr,count.index)}"

    tags {
    Name = "${element(var.vpcname,count.index)}"
    }

mainfolder / modules / network / subnet / main.tf

variable "subcidr" {type="list"}
variable "subname" {type="list"}

resource "aws_subnet" "subnet" {
count = "${length(var.subcidr)}"
vpc_id = "${element(aws_vpc.customVpc.*.id, count.index)}"
cidr_block = "${element(var.subcidr, count.index)}"

tags {

Name = "${element(var.subname, count.index)}"
}
 }

mainfolder / main.tf

module "testvpc" {
source = "./modules/network/testvpc"
vpccidr="${var.vpccidr}"
vpcname="${var.vpcname}"
}

module "subnet" {
source = "./modules/network/subnet"
subcidr = "${var.subcidr}"
subname = "${var.subname}"
} 

mainfolder / var.tf

  variable "vpccidr" {type="list"}
  variable "vpcname" {type="list"}
  variable "subcidr" {type="list"}
  variable "subname" {type="list"}

mainfolder / terraform.tfvars

 - vpccidr=["10.1.0.0/16","10.2.0.0/16","10.3.0.0/16"]   
   vpcname=["vpc-shared","vpc-sand","vpc-preprod"]   
   subcidr=["10.1.1.0/24","10.2.1.0/24","10.3.1.0/24"]   
   subname=["sub-shared","sub-sand","sub-preprod"]
 - 

在运行terraform时,验证-var-file = terraform.tfvars会出现以下错误

            Error: resource 'aws_subnet.subnet' config: unknown 
           resource 'data.aws_vpc.customVpc' referenced in variable 
           data.aws_vpc.customVpc.*.id

是不是因为aws_subnet无法找到vpc_id,因为没有创建资源aws_vpc。我在mainfolder / main.tf中将testvpc和子网都称为模块。我想念的是什么。

第二个是aws_vpc和aws_subnet中的适当的循环。它应创建vpc共享的10.1.0.0/16,并在该vpc中进行子共享,依此类推

1 个答案:

答案 0 :(得分:1)

您需要使用module outputs,因为您试图在单独的模块中引用资源。那是行不通的,因为

  

模块封装其资源。一个模块中的资源不能直接依赖其他模块中的资源或属性,除非这些资源或属性是通过输出导出的。

因此,在 mainfolder / modules / network / testvpc / main.tf 中,添加这样的输出

output "vpc_ids" { value=["${aws_vpc.customVpc.*.id}"] }

然后在 mainfolder / modules / network / subnet / main.tf 中添加一个变量

variable "vpc_ids" {type="list"}

并在该模块中使用它(而不是尝试直接引用 /testvpc/main.tf 模块中的资源)

resource "aws_subnet" "subnet" {
  count = "${length(var.subcidr)}"
  vpc_id = "${element(var.vpc_ids, count.index)}"

  etc, etc

}

,最后从您的 mainfolder / main.tf

module "testvpc" {
  source = "./modules/network/testvpc"
  vpccidr="${var.vpccidr}"
  vpcname="${var.vpcname}"
}

module "subnet" {
  source = "./modules/network/subnet"
  subcidr = "${var.subcidr}"
  subname = "${var.subname}"
  vpc_ids = "${module.testvpc.vpc_ids}"
}