簡體   English   中英

使用 for_each 引用資源的實例

[英]Referencing instances of a resource using for_each

我正在為服務總線命名空間創建藍/綠部署。 我使用一個局部變量來定義服務總線是“Premium”還是“Standard”sku。 這兩個命名空間創建得很好,但我遇到的問題是當我想引用這些命名空間的特定實例時,使用服務總線命名空間創建隊列。

請看下面的代碼:

這將查看變量 is_production 並決定命名空間是“Premium”還是“Standard”

locals {
  sb_sku       = var.is_production ? ["Premium"] : ["Standard"]
}

這是命名空間創建代碼:

resource "azurerm_servicebus_namespace" "service_bus_namespace_blue" {
  for_each = { for sku in local.sb_sku : sku => sku }

  name                = format("glasswall-sb-%s-gwc-%s-siem-%s-blue", var.location_short, var.client_name, terraform.workspace)
  location            = var.resource_group_location
  resource_group_name = var.resource_group_name
  sku                 = each.key

  tags = var.tags

}

resource "azurerm_servicebus_namespace" "service_bus_namespace_green" {
  for_each = { for sku in local.sb_sku : sku => sku if var.is_production != false }

  name                = format("glasswall-sb-%s-gwc-%s-siem-%s-green", var.location_short, var.client_name, terraform.workspace)
  location            = var.resource_group_location
  resource_group_name = var.resource_group_name
  sku                 = each.key

  tags = var.tags

}

最后是我發現問題的代碼:

resource "azurerm_servicebus_queue" "service_bus_queue_blue" {
  for_each = { for queue in var.servicebus_queue_config : queue.name => queue }

  namespace_id                            = [ for queue in azurerm_servicebus_namespace.service_bus_namespace_blue: queue.id ] <<<< This is the offender
  name                                    = each.value.name
  dead_lettering_on_message_expiration    = each.value.dead_lettering_on_message_expiration
  max_size_in_megabytes                   = each.value.max_size_in_megabytes
  max_delivery_count                      = each.value.max_delivery_count
  lock_duration                           = each.value.lock_duration
  requires_duplicate_detection            = each.value.requires_duplicate_detection
  duplicate_detection_history_time_window = each.value.duplicate_detection_history_time_window

}

resource "azurerm_servicebus_queue" "service_bus_queue_green" {
  for_each = { for queue in var.servicebus_queue_config : queue.name => queue if var.is_production != false }

  namespace_id                            = azurerm_servicebus_namespace.service_bus_namespace_green["Premium"].id
  name                                    = each.value.name
  dead_lettering_on_message_expiration    = each.value.dead_lettering_on_message_expiration
  max_size_in_megabytes                   = each.value.max_size_in_megabytes
  max_delivery_count                      = each.value.max_delivery_count
  lock_duration                           = each.value.lock_duration
  requires_duplicate_detection            = each.value.requires_duplicate_detection
  duplicate_detection_history_time_window = each.value.duplicate_detection_history_time_window

}

這是我收到的錯誤:

│ Error: Incorrect attribute value type
│ 
│   on modules/service-bus/main.tf line 32, in resource "azurerm_servicebus_queue" "service_bus_queue_blue":
│   32:   namespace_id                            = [ for queue in azurerm_servicebus_namespace.service_bus_namespace_blue: queue.id ]
│     ├────────────────
│     │ azurerm_servicebus_namespace.service_bus_namespace_blue is object with 1 attribute "Standard"
│ 
│ Inappropriate value for attribute "namespace_id": string required.

servicebus_queue_config 輸入:

variable "servicebus_queue_config" {
  type = list(object({
    name                                    = string
    dead_lettering_on_message_expiration    = bool
    max_size_in_megabytes                   = number
    max_delivery_count                      = number
    lock_duration                           = string
    requires_duplicate_detection            = bool
    duplicate_detection_history_time_window = string
  }))
}

# whats passed in from the tfvars

servicebus_queue_config = [
  {
    name                                    = "queuename1",
    dead_lettering_on_message_expiration    = true,
    max_size_in_megabytes                   = 1024,
    max_delivery_count                      = 10,
    lock_duration                           = "PT3M30S",
    requires_duplicate_detection            = true,
    duplicate_detection_history_time_window = "P7D"
  },
  {
    name                                    = "queuename2",
    dead_lettering_on_message_expiration    = true,
    max_size_in_megabytes                   = 1024,
    max_delivery_count                      = 10,
    lock_duration                           = "PT3M30S",
    requires_duplicate_detection            = true,
    duplicate_detection_history_time_window = "P7D"
  }
]

您可以嘗試添加tostring() function 嗎? terraform 文檔

tostring([ for queue in azurerm_servicebus_namespace.service_bus_namespace_blue: queue.id ])

我認為您正在返回列表或其他內容中的值,使用tostring function 將轉換任何值。 如果它不能轉換值(例如,如果它是一個元組),它將拋出一個錯誤。

在這一行,您傳遞了一個列表:

namespace_id = [ for queue in azurerm_servicebus_namespace.service_bus_namespace_blue: queue.id ]

這是一個只有一個元素的列表,但它仍然是一個列表。 namespace_id應該是一個字符串。

您可以簡單地直接引用它們,而不是嘗試在任何地方使用 for 循環來引用值:

namespace_id = azurerm_servicebus_namespace.service_bus_namespace_blue[local.sb_sku].id

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM