无法为模块内的子网引用 vpc_id
Posted
技术标签:
【中文标题】无法为模块内的子网引用 vpc_id【英文标题】:Unable to reference vpc_id for a subnet within modules 【发布时间】: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)" 但没有帮助 【参考方案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"
【讨论】:
谢谢@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 怎么办。我如何在保持循环的同时做到这一点以上是关于无法为模块内的子网引用 vpc_id的主要内容,如果未能解决你的问题,请参考以下文章
terraform - 将 vpc_id 参数从不同的 VPC 传递到多个子网