无法为模块内的子网引用 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,因为您试图在单独的模块中引用资源。那是行不通的,因为

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

所以在 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 怎么办。我如何在保持循环的同时做到这一点

以上是关于无法为模块内的子网引用 vpc_id的主要内容,如果未能解决你的问题,请参考以下文章

EC2 实例的输出子网

如何在子模块中使用远程状态数据源

terraform - 将 vpc_id 参数从不同的 VPC 传递到多个子网

python如何引用其他模块中类的方法中的变量?

Terraform For_Each:如何引用创建的资源 ID

如何从 Terraform 输出中传递值而不将其放入 tfvars 文件中