【问题标题】:Terraform "Unsupported attribute" error when access output variable of sub-module访问子模块的输出变量时,Terraform“不支持的属性”错误
【发布时间】:2022-08-19 20:48:13
【问题描述】:

大师!

我正在开发 Terraform 模块,以为生产和非生产环境提供 NAT 资源。有两个存储库,一个用于 Terraform 模块,另一个用于每个帐户的实时环境(例如:dev、stage、prod..)

访问network/nat 模块的输出变量时出现问题。 这让我很累。请参考下文。

  • 用于 Terraform 模块 (sre-iac-module repo)
❯ tree sre-iac-modules/network/nat/
sre-iac-modules/network/nat/
├── main.tf
├── non_production
│   └── main.tf
├── outputs.tf
├── production
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
└── variables.tf

  • 用于实时环境(sre-iac-modules repo)
❯ tree sre-iac-modules/network/nat/
sre-iac-modules/network/nat/
├── main.tf
├── non_production
│   └── main.tf
├── outputs.tf
├── production
│   ├── main.tf
│   ├── outputs.tf
│   └── variables.tf
└── variables.tf

在主代码sn-p中,sre-iac-live/dev/services/wink/network/main.tf 我无法访问名为module.wink_nat.eip_ids 的输出变量。 当我运行terraform planterraform console 时,我总是遇到以下错误.

│ Error: Unsupported attribute
│
│   on ../../../../../sre-iac-modules/network/nat/outputs.tf line 2, in output \"eip_ids\":
│    2:     value = module.production.eip_ids
│     ├────────────────
│     │ module.production is tuple with 1 element
│
│ This value does not have any attributes.
╵

这是../../../../../sre-iac-modules/network/nat/outputs.tf and main.tf

output \"eip_ids\" {
    value = module.production.eip_ids
#    value = [\"a\", \"b\", \"c\"]
}

----
main.tf


module \"production\" {
  source = \"./production\"
  count = var.is_production ? 1 : 0
  env    = \"\"
  region_id = \"\"
  service_code = \"\"
  target_route_tables = []
  target_subnets = var.target_subnets
}


module \"non_production\" {
  source = \"./non_production\"

  count = var.is_production ? 0 : 1
}

但是,如果我使用value = [\"a\", \"b\", \"c\"],那么效果很好! 我不知道是什么问题。

下面是./sre-iac-modules/network/nat/production/outputs.tf的代码sn-p

output \"eip_ids\" {
    value = aws_eip.for_nat[*].id
#    value = [aws_eip.nat-gw-eip.*.id]
#    value = aws_eip.for_nat.id
#    value = [\"a\", \"b\", \"c\"]
}

下面是./sre-iac-modules/network/nat/production/main.tf的代码sn-p

resource \"aws_eip\" \"for_nat\" {
  count = length(var.target_subnets)
  vpc      = true
}


最后,这里是main.tf 代码 sn-p。 (sre-iac-live/dev/services/wink/network/main.tf)


module \"wink_vpc\" {
  .... skip ....
}



module \"wink_nat\" {

  # Relative path references
  source = \"../../../../../sre-iac-modules/network/nat\"

  region_id = \"${var.region_id}\"
  env = \"${var.env}\"
  service_code = \"${var.service_code}\"
  
  target_subnets = module.wink_vpc.protected_subnet_ids

  is_production = true

  depends_on = [module.wink_vpc]
  
 
}

我在这个问题上停留了一天。 我需要 Terraform Guru 的帮助。

请给我你的好建议。 非常感谢你。

干杯!

  • 您的 production 模块具有 count 属性。请尝试:value = module.production[0].eip_ids
  • @MarkB,哦...谢谢你教我。我还不熟悉 Terraform。您的 cmets 对我帮助很大。现在效果很好!
  • @MarkB 请留下您的评论作为答案。我会选择你的答案:) 再次感谢你。

标签: amazon-web-services terraform devops


【解决方案1】:

您的 production 模块有一个 count 元属性。要引用模块,您必须使用索引,例如:

value = module.production[0].eip_ids

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 2021-05-06
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2021-11-11
    • 2019-12-17
    • 2019-01-02
    • 1970-01-01
    相关资源
    最近更新 更多