Terraform:如何传递多个值作为输出并映射到另一个模块的变量

问题描述 投票:0回答:1

我正在设置 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 实例。

amazon-web-services amazon-ec2 terraform aws-security-group
1个回答
0
投票

您不能在

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
}
© www.soinside.com 2019 - 2024. All rights reserved.