【问题标题】:Unable to reference vpc_id for a subnet within modules无法为模块内的子网引用 vpc_id
【发布时间】:2019-03-01 16:16:18
【问题描述】:

有一个 modules/network/testvpc 和 modules/network/subnet 模块配置。

主文件夹/模块/网络/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)}"
    }

主文件夹/模块/网络/子网/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)}"
}
 }

主文件夹/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}"
} 

主文件夹/var.tf

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

主文件夹/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 validate -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 不是创建它。我将 testvpc 和子网都称为 mainfolder/main.tf 中的模块。我错过了什么。

其次是 aws_vpc 和 aws_subnet 中的循环。它应该创建 vpc-shared 10.1.0.0/16 并在该 vpc 内进行子共享,依此类推

【问题讨论】:

  • 还尝试提及“data” vpc_id = "${element(data.aws_vpc.customVpc.*.id, count.index)}" 但没有帮助

标签: terraform


【解决方案1】:

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

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

所以在 ma​​infolder/modules/network/testvpc/main.tf 中,添加这样的输出

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

然后像这样在ma​​infolder/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

}

现在终于从你的 ma​​infolder/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}"
} 

【讨论】:

  • 谢谢@rwisch45。让我试试。此外,当我通过模块增加资源(路由表、互联网 gw 等)时,我需要在所有这些 main.tf 文件中提及 vpc_id。有没有更好的方法,比如全局变量(一站式),用于 mainfolder 和 modules 中引用的所有变量值。从管理的角度来看变得更容易维护
  • @kathir 不这么认为,但这又回到了我们在您的 other terraform question 上进行的讨论
  • 能够指定输出并且有效。感谢@rwisch45。在循环上下文中创建互联网 gw 并分配 vpc_id 变量时,gw 已附加到 10.1.0.0/16 vpc 。这是什么逻辑。创建的最后一个 VPC 是 vpc0 ?所以我想知道如果我想将 gw 附加到两个 vpc 怎么办。我如何在保持循环的同时做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-30
  • 2016-08-11
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多