Настройте учетную запись хранения с подмодулями для каждой категории

Мне нужно создать дополнительный модуль для каждого дополнительного ресурса для учетной записи хранения. Я работаю над Queue и ищу способ ссылаться на аргументы модуля foreach.

Переменная

variable "queues" {
  type = map(object({
    metadata = optional(map(string))
    name     = string
    role_assignments = optional(map(object({
      role_definition_id_or_name             = string
      principal_id                           = string
      description                            = optional(string, null)
      skip_service_principal_aad_check       = optional(bool, false)
      condition                              = optional(string, null)
      condition_version                      = optional(string, null)
      delegated_managed_identity_resource_id = optional(string, null)
    })), {})
    timeouts = optional(object({
      create = optional(string)
      delete = optional(string)
      read   = optional(string)
      update = optional(string)
    }))
  }))
  default     = {}
}
resource "azapi_resource" "queue" {
  for_each = var.queues

  type = "Microsoft.Storage/storageAccounts/queueServices/queues@2023-01-01"
  body = jsonencode({
    properties = {
      # metadata = each.value.metadata
    }
  })
  name                      = each.value.name
  parent_id                 = "${azurerm_storage_account.this.id}/queueServices/default"
  schema_validation_enabled = false

  dynamic "timeouts" {
    for_each = each.value.timeouts == null ? [] : [each.value.timeouts]
    content {
      create = timeouts.value.create
      delete = timeouts.value.delete
      read   = timeouts.value.read
    }
  }
}
module "storage_queue" {
  source = "./modules/storage_queue"

  for_each = var.queues

  name = each.value.name (
  
}

Ошибка, которую я получаю при попытке добавить имя:

Неожиданный атрибут: атрибут с именем «имя» здесь не ожидается Terraform

Во время проверки отображается следующая ошибка

│
│   on ../../main.queues.tf line 8, in module "storage_queue":
│    8:   name = each.value
│
│ An argument named "name" is not expected here. ```

Можете ли вы поделиться полной информацией о модуле «storage_queue», добавив информацию, связанную с именем и т. д., отредактировав запрос, чтобы мы лучше поняли проблему @csr1985

Vinay B 08.06.2024 12:01

обновил информацию о модуле

csr1985 08.06.2024 12:23

модуль "storage_queue" { source = "./modules/storage_queue" for_each = var.queues name =each.value.name ( } Предоставленная информация полная? Или чего-то не хватает?

Vinay B 08.06.2024 12:27

Была ли переменная name объявлена ​​как часть переменных модуля?

Rui Jarimba 08.06.2024 12:37

@VinayB Я только что попробовал добавить туда name. Я получил вышеуказанную ошибку. После этого я перестал настраивать.

csr1985 08.06.2024 12:48

@РуиДжаримба. да

csr1985 08.06.2024 12:49

Трудно помочь, не видя всего кода и/или полного сообщения об ошибке.

Rui Jarimba 08.06.2024 13:10

также обновил сообщение об ошибке

csr1985 08.06.2024 18:03
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
8
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Настройте учетную запись хранения с подмодулями для каждой категории с помощью terraform.

Чтобы определить подмодуль /дочерние модули с использованием подресурса for-each и ссылки на аргументы внутри учетной записи хранения, нам необходимо соблюдать определенную последовательность действий, поскольку параметры зависят от каждого другой.

Общее понимание субмодуля: нам нужно сначала начать писать конфигурацию субмодуля, а затем переходить к корневой конфигурации. Таким образом, иногда изменение последовательности может также вызвать проблему, с которой вы столкнулись.

Я попробовал конфигурацию терраформирования вашего требования, добавив имя в конфигурацию модуля очереди, и мне удалось решить проблему, и я смог успешно выполнить это требование, используя ресурс azapi для очереди хранения.

Конфигурация терраформа:

main.tf:

provider "azurerm" {
  features {}
}

variable "queues" {
  type = map(object({
    metadata = optional(map(string))
    name     = string
    role_assignments = optional(map(object({
      role_definition_id_or_name             = string
      principal_id                           = string
      description                            = optional(string, null)
      skip_service_principal_aad_check       = optional(bool, false)
      condition                              = optional(string, null)
      condition_version                      = optional(string, null)
      delegated_managed_identity_resource_id = optional(string, null)
    })), {})
    timeouts = optional(object({
      create = optional(string)
      delete = optional(string)
      read   = optional(string)
      update = optional(string)
    }))
  }))
  default = {}
}


resource "azurerm_resource_group" "example" {
  name     = "sampletestvk-rg"
  location = "East US"
}

resource "azurerm_storage_account" "example" {
  name                     = "exvksbstrageacct"
  resource_group_name      = azurerm_resource_group.example.name
  location                 = azurerm_resource_group.example.location
  account_tier             = "Standard"
  account_replication_type = "LRS"
}

module "storage_queue" {
  source             = "./modules/storage_queue"
  for_each           = var.queues
  name               = each.value.name
  metadata           = lookup(each.value, "metadata", {})
  storage_account_id = azurerm_storage_account.example.id
  timeouts           = lookup(each.value, "timeouts", null)
}

модуль/storage_queue/main.tf

terraform {
  required_providers {
    azapi = {
      source = "azure/azapi"
    }
  }
}

variable "name" {
  description = "The name of the queue."
  type        = string
}

variable "metadata" {
  description = "Metadata info for the queue."
  type        = map(string)
  default     = {}
}

variable "storage_account_id" {
  description = "The ID of the storage account."
  type        = string
}

variable "timeouts" {
  description = "Timeouts of the queue."
  type = object({
    create = optional(string)
    delete = optional(string)
    read   = optional(string)
  })
  default = null
}

resource "azapi_resource" "queue" {
  type = "Microsoft.Storage/storageAccounts/queueServices/queues@2023-01-01"
  body = jsonencode({
    properties = {
      metadata = var.metadata
    }
  })
  name                      = var.name
  parent_id                 = "${var.storage_account_id}/queueServices/default"
  schema_validation_enabled = false

  dynamic "timeouts" {
    for_each = var.timeouts == null ? [] : [var.timeouts]
    content {
      create = timeouts.value.create
      delete = timeouts.value.delete
      read   = timeouts.value.read
    }
  }
}

Развертывание выполнено успешно:

Большое спасибо за отзыв. Я вижу, вы написали специальные переменные для «module/storage_queue/main.tf». Можем ли мы использовать в корне тот же блок переменных, который мы использовали в main.tf?

csr1985 09.06.2024 17:07

Если мы хотим создать несколько очередей для существующей учетной записи хранения, мы можем использовать этот подмодуль. чтобы добиться этого, можем ли мы использовать for_each внутри подмодуля и тот же блок переменных, который есть в корневом модуле? Если я использую этот блок, я получаю ту же ошибку.

csr1985 09.06.2024 17:38

Поскольку мы используем корневой модуль «for_each», мы не можем использовать его снова в подмодуле. нам нужно передать данные запроса из корневого модуля в подмодуль @csr1985

Vinay B 09.06.2024 18:02

Большое спасибо. если мы используем root, как мы можем создать две очереди с существующей учетной записью хранения?

csr1985 09.06.2024 18:26

да, мы можем использовать for_each в корневом модуле для перебора определений запросов, которые передают значения в подмодуль, который позже действует как отдельные запросы @csr1985

Vinay B 09.06.2024 18:48

Я попытался экспортировать значения очереди, как имя очереди, так и идентификатор, в качестве вывода. Но я получаю следующую ошибку. Can't access attributes on a primitive-typed value (string). Можете ли вы привести пример по этому поводу?

csr1985 05.07.2024 18:34

Другие вопросы по теме