首页 > 解决方案 > Terraform 动态块缺少参数或块定义

问题描述

我正在尝试使用一个dynamic块在一个资源中定义多个 ip_rules 和 virtual_network 异常。出于某种原因,当我尝试将变量用作for_each循环时,它会显示以下错误。

variable "vnet_subnet_ids" {
  description = "List of strings that are VNet Subnet IDs to whitelist."
  type        = list(string)
  default     = [
"/subscriptions/${subscription_id}/resourceGroups/${rg_name}/providers/Microsoft.Network/virtualNetworks/nonprod-vnet-gp-kubernetes/subnets/pods_pub_subnet_01",
"/subscriptions/${subscription_id}/resourceGroups/${rg_name}/providers/Microsoft.Network/virtualNetworks/nonprod-vnet-gp-kubernetes/subnets/pods_pub_subnet_02",
  ]
  sensitive   = false
}

resource "azurerm_container_registry" "devops" {
  name                     = var.acr_name
  resource_group_name      = var.rg_name
  location                 = var.rg_location
  sku                      = var.acr_sku
  admin_enabled            = false
  georeplication_locations = var.acr_geo_rep_locations

  network_rule_set {
    default_action = "Deny"

    dynamic "ip_rule" {
      for_each = [1]
      content {
        action = "Allow"
        ip_range = "xxx.xxx.xxx.xxx/32"
      }
    }
    #dynamic "ip_rule" {
    #  for_each = var.acr_ip_rules
    #  content {
    #    action = "Allow"
    #    ip_range = ip_rule.value
    #  }
    #}

    dynamic "virtual_network" {
      for_each = var.vnet_subnet_ids
      content {
        action = "Allow"
        subnet_id = virtual_network.value
    }
  }

  tags = var.company_tags
}

但是,我收到以下错误:

│ Error: Argument or block definition required
│ 
│ On ../../modules/azure/acr/main.tf line 41: An argument or block definition is required here.
╵

ip_rule作品的部分,但virtual_network没有的部分。我不懂为什么。

标签: terraformterraform-provider-azure

解决方案


似乎有一个与此相关的开放错误。我目前无法对此进行测试,但请查看此变体是否适合您:

variable "acr_name" { default = "acr_name" }
variable "rg_location" { default = "rg_location" }
variable "acr_sku" { default = "acr_sku" }
variable "subscription_id" { default = "subscription_id" }
variable "rg_name" { default = "rg_name" }
variable "acr_geo_rep_locations" { default = "acr_geo_rep_locations" }
variable "company_tags" { default = "company_tags" }
variable "acr_ip_rules" { default = ["1", "2"]}
variable "vnet_subnet_ids" { default = ["1", "2"]}

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "=2.79.1"
    }
  }
}
provider "azurerm" {
  features {}
}

locals {
  allowed_ips = [for ip in var.acr_ip_rules : {
    action    = "Allow",
    ip_range = ip
  }]
  allowed_virtual_networks = [for sub in var.vnet_subnet_ids : {
    action    = "Allow",
    subnet_id = sub
  }]
}

resource "azurerm_container_registry" "devops" {
  name                     = var.acr_name
  resource_group_name      = var.rg_name
  location                 = var.rg_location
  sku                      = var.acr_sku
  admin_enabled            = false
  georeplication_locations = var.acr_geo_rep_locations
  network_rule_set {
    default_action = "Deny"
    ip_rule = local.allowed_ips
    virtual_network = local.allowed_virtual_networks
  }
  tags = var.company_tags
}



推荐阅读