Terraform: как вызвать значения списков строк из входной переменной в локальных переменных, специфичных для «azurerm_storage_management_policy»

Я пытаюсь назначить политику управления жизненным циклом учетной записи хранения с помощью terraform. Списки из более чем 30 контейнеров определены в файле input.tfvars как списки строк, которые необходимо вызвать в main.tf в «жизненном цикле ресурса azurerm_storage_management_policy». Но выдает ошибку. Подскажите, пожалуйста, как мне вызвать переменную.

Детали кода в моем git приведены ниже.

input.tfvars -

containername = ["a", "b", "c", "d", "e", "f", "g".................................]

Этот список включает более 30 названий контейнеров.

переменные.tf ---

variable "containername" {
  type    = list(string)
  default = []
}

main.tf --

locals {
   folderlist1  = var.containername
   list1 = [ for a in local.folderlist1: a ]
 }
 output "result1" {
     value = local.list1
}
resource "azurerm_storage_management_policy" "lifecycle" {
  storage_account_id = azurerm_storage_account.sa.id
  rule{
    name    = "Rule1"
    enabled = true
    filters {
      prefix_match = local.list1
      blob_types   = ["blockBlob"] 
    }
    actions {
      base_blob {
        delete_after_days_since_modification_greater_than = 15
      }
      snapshot {
        delete_after_days_since_creation_greater_than = 15
      }
    }
  }
}

Выдает ошибку как «prefix_match»: элемент 0: требуется строка.

Как установить 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
0
104
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Чтобы это работало, вам нужно будет использовать блок dynamic с метааргументом for_each:

locals {
  folderlist1  = var.containername
  list1 = [ for a in local.folderlist1: a ]
}

output "result1" {
  value = local.folderlist1
}

resource "azurerm_storage_management_policy" "lifecycle" {
  storage_account_id = azurerm_storage_account.sa.id
  dynamic "rule" {
    for_each = local.folderlist1
    content {
      name    = "Rule-${rule.key}"
      enabled = true
      filters {
        prefix_match = [rule.value]
        blob_types   = ["blockBlob"]
      }
      actions {
        base_blob {
          delete_after_days_since_modification_greater_than = 15
        }
        snapshot {
          delete_after_days_since_creation_greater_than = 15
        }
      }
    }
  }
}

Привет @Marko E. Надеюсь, у тебя все хорошо. Я обновил свой код твоим кодом. Я получаю следующую ошибку с вашим кодом: недопустимое значение для атрибута «prefix_match»: требуется набор строк.

Izzy 25.04.2024 09:11

Ах, ок, позвольте мне это исправить.

Marko E 25.04.2024 09:13

Извините, что беспокою в пятницу. У вас была возможность просмотреть это сообщение об ошибке. Спасибо :)

Izzy 26.04.2024 11:53

Я исправил это вчера, пожалуйста, попробуйте еще раз.

Marko E 26.04.2024 12:01

Отлично, вот как вы можете принять ответ: Meta.stackexchange.com/questions/86978/….

Marko E 26.04.2024 12:45

Списки из более чем 30 контейнеров определены в файле input.tfvars как списки строк, которые необходимо вызвать в main.tf в «жизненном цикле ресурса azurerm_storage_management_policy».

В политике управления жизненным циклом нескольких контейнеров, указанных в переменной containername, вам нужно будет перебрать каждое имя контейнера и создать для каждого отдельное правило.

Вот обновленный код Terraform для создания lifecycle management policy для всех контейнеров в учетной записи хранения.

terraform.tfvars

 containername  =  ["venkat1", "venkat2", "venkat3", "venkat4", "venkat5", "v6enkat","venkat7","venkat8","venkat9","venkat10","venkat11","venkat12","venkat13","venkat14","venkat15","venkat16","venkat17","venkat18","venkat19","venkat20","venkat21","venkat22","venkat23","venkat24","venkat25"]

variable.tf

    variable "containername" {
      type    = list(string)
      default = []
    }

Storage.tf

    provider "azurerm" {
      features {}
    }
    
    data "azurerm_storage_account" "example" {
      name                = "demostoracc2304"
      resource_group_name = "Sri"
    }
    
    locals {
      folderlist1 = var.containername
    }
    
    resource "azurerm_storage_management_policy" "lifecycle" {
      storage_account_id = data.azurerm_storage_account.example.id
    
      dynamic "rule" {
        for_each = range(length(local.folderlist1))
    
        content {
          name    = "Rule-${rule.key + 1}"
          enabled = true
    
          filters {
            prefix_match = [local.folderlist1[rule.key]]
            blob_types   = ["blockBlob"]
          }
    
          actions {
            base_blob {
              delete_after_days_since_modification_greater_than = 15
            }
            snapshot {
              delete_after_days_since_creation_greater_than = 15
            }
          }
        }
      }
    }
    
    output "result1" {
      value = local.folderlist1
    }

Выход:

После запуска скрипта в политике управления учетной записью хранения создаются правила для всех контейнеров, указанных в variables.tf.

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