Мне нужно создать дополнительный модуль для каждого дополнительного ресурса для учетной записи хранения. Я работаю над 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" { source = "./modules/storage_queue" for_each = var.queues name =each.value.name ( } Предоставленная информация полная? Или чего-то не хватает?
Была ли переменная name объявлена как часть переменных модуля?
@VinayB Я только что попробовал добавить туда name. Я получил вышеуказанную ошибку. После этого я перестал настраивать.
@РуиДжаримба. да
Трудно помочь, не видя всего кода и/или полного сообщения об ошибке.
также обновил сообщение об ошибке


Настройте учетную запись хранения с подмодулями для каждой категории с помощью 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?
Если мы хотим создать несколько очередей для существующей учетной записи хранения, мы можем использовать этот подмодуль. чтобы добиться этого, можем ли мы использовать for_each внутри подмодуля и тот же блок переменных, который есть в корневом модуле? Если я использую этот блок, я получаю ту же ошибку.
Поскольку мы используем корневой модуль «for_each», мы не можем использовать его снова в подмодуле. нам нужно передать данные запроса из корневого модуля в подмодуль @csr1985
Большое спасибо. если мы используем root, как мы можем создать две очереди с существующей учетной записью хранения?
да, мы можем использовать for_each в корневом модуле для перебора определений запросов, которые передают значения в подмодуль, который позже действует как отдельные запросы @csr1985
Я попытался экспортировать значения очереди, как имя очереди, так и идентификатор, в качестве вывода. Но я получаю следующую ошибку. Can't access attributes on a primitive-typed value (string). Можете ли вы привести пример по этому поводу?
Можете ли вы поделиться полной информацией о модуле «storage_queue», добавив информацию, связанную с именем и т. д., отредактировав запрос, чтобы мы лучше поняли проблему @csr1985