我正在设置 terraform 模块来创建我的 AWS 资源,我需要从相同的模块模板创建多个资源。在 main.tf 中使用
for_each
创建了 2 个 sg,需要将它们传递到另一个模块以创建 2 个 ec2 实例并映射其值。
main.tf
module "sg" {
for_each = toset(var.Name)
source = "./modules/ec2_sg"
App_Name = "${each.value}"
}
module "ec2" {
count = length(var.Name)
depends_on = [
module.sg
]
source = "./modules/ec2"
Name = var.Name[count.index]
EC2_SG_ID = module.sg.sg_id
安全组
output.tf
output "sg_id" {
value = aws_security_group.sg.*.id
}
这只适用于单个资源的情况。两个资源名称作为字符串列表传递到
terraform.tfvars
。我需要将多个值传递到 ec2 模块,并且需要将第一个 sg 映射到第一个 ec2 实例和第二个实例到第二个 ec2 实例。
您不能在
depends_on = [module.sg]
中使用 main.tf
,因为 depends_on
仅适用于单个资源,而不适用于整个模块。 Terraform 根据资源引用自动推断依赖关系,因此在大多数情况下,不需要显式 depends_on
。
因此需要将多个安全组ID传递给EC2模块,并将其映射到对应的EC2实例。
output.tf
调整安全组 tomap
以创建名称和 ID 映射:output "sg_map" {
value = tomap({
for k, v in aws_security_group.sg : k => v.id
})
}
sg_map
迭代 EC2 模块中的 for_each
,为每个条目创建一个 EC2 实例:module "ec2" {
for_each = module.sg.sg_map
source = "./modules/ec2"
Name = each.key
EC2_SG_ID = each.value
}