terraform - 使用 for_each 表达式时在 terraform 中出现不受支持的属性错误

标签 terraform

使用 for_each Terraform v0.12.6 中的表达式以动态生成 vnet 子网 (Azure) 的内联块。我定义了列表变量“子网”,有两个子网“sub1”和“sub2”,如下所示

variable "subnets" {
  default = [
    {
      name   = "sub1"
      prefix = "1.1.1.1/32"
    },
    {
      name   = "sub2"
      prefix = "2.2.2.2/32"
    },
  ]
}

然后迭代“azurerm_virtual_network”块内的列表变量以创建子网的动态块
dynamic "subnet" {
    for_each = [for s in var.subnets  : { 
        name   = s.name
        prefix = s.prefix
    }]

    content {
      name           = subnet.name
      address_prefix = subnet.prefix
    }   
  }
}

获取即第一个是 错误:不支持的属性

在 main.tf 第 42 行,在资源“azurerm_virtual_network”“vnet”中:
42:名称=子网.名称

该对象没有名为“name”的属性。

最佳答案

dynamic 创建的迭代器对象块有两个属性:

  • key :当前元素的映射键或列表索引
  • value :当前元素的值

  • 在这种情况下,用于重复的集合是一个对象列表,所以 subnet.key将是整数索引 0, 1, ... 和 subnet.value将是与该索引关联的对象。

    要获得您想要的结果,您需要访问 subnet.value 上的对象属性。反而:
    dynamic "subnet" {
        for_each = [for s in var.subnets  : { 
            name   = s.name
            prefix = s.prefix
        }]
    
        content {
          name           = subnet.value.name
          address_prefix = subnet.value.prefix
        }   
      }
    }
    

    好像var.subnets已经与对象结构兼容 content块期望,因此可以通过直接访问它来进一步简化它:
    dynamic "subnet" {
        for_each = var.subnets
    
        content {
          name           = subnet.value.name
          address_prefix = subnet.value.prefix
        }   
      }
    }
    

    只要var.subnets已经是一个对象列表,这应该会产生相同的结果。

    关于terraform - 使用 for_each 表达式时在 terraform 中出现不受支持的属性错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57431301/

    相关文章:

    terraform - 如何从 Terraform 中的文件加载输入数据?

    amazon-web-services - Aurora 无服务器兼容版本

    azure - 如何生成多个名称/使用结果输出?

    amazon-web-services - 在 AWS 中使用 Terraform 模块导入 Terraform

    google-cloud-platform - 使用 Terraformer\Terraform 克隆 GCP 项目

    amazon-web-services - Terraform 上的 AWS - 如何避免 'forces new resource'

    azure - Terraform Destroy 不适用于 terraform.tfvars 中的 Azure Devops 变量

    terraform - 为什么terraform计划锁定状态?

    kubernetes - 如何通过 Terraform 管理多个 kubernetes 集群?

    amazon-s3 - 如何授予 lambda 权限将文件上传到 `terraform` 中的 s3 存储桶?