大师!
我正在开发Terraform模块,为生产和非生产环境提供NAT资源。有两个存储库,一个用于Terraform模块,另一个用于每个帐户的实时环境(例如:dev、stage、prod.(
访问network/nat
模块的输出变量时出现问题。这让我很累。请参阅下文。
- 用于Terraform模块(sre-iac模块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模块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-live/dev/services/wink/network/main.tf
我无法访问名为module.wink_nat.eip_ids
的输出变量。当我运行terraform plan
或terraform 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
的代码片段
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
的代码片段
resource "aws_eip" "for_nat" {
count = length(var.target_subnets)
vpc = true
}
最后,这里是main.tf
的代码片段。(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]
}
我在这个问题上纠结了一天。我需要地形大师的帮助。
请给我你的好建议。事先非常感谢。
干杯!
您的production
模块具有count
元属性。要引用模块,您必须使用索引,如:
value = module.production[0].eip_ids