Terraform:如何使用列表或映射在 azurerm 中提供多个存储容器?

Terraform: How to use list or map to provision multiple storage containers in azurerm?

我正在尝试创建多个存储容器来存储 Terraform 中多个组件组的远程状态。

我的环境中有基础架构、前端、后端和堡垒虚拟机,每个都有自己的 .tf 模板,因此我可以将它们单独部署为基础架构的功能单元。

我以后可能需要添加更多类型,这表明我需要将 components/environments 的列表存储为一个变量,然后通过它分块来创建后端存储容器。

这里的主要假设是我可以使用相同的存储帐户,但我需要为每个远程状态使用单独的容器,否则它们会混合在一起。

  1. 该评估是否属实?
  2. 我如何使用列表或其他可最大程度减少代码重复的方法在语法上完成它?

诚然,我是 Terraform 的初学者,所以我预计我没有掌握 HCL 的一些基本原理。这是我的代码的摘录:

variable "component" {
  type    = list
  default = ["bastion", "frontproxy", "db", "infra"]
}

provider "azurerm" {
  version = "~> 2.8"
  features {}
    }

resource "azurerm_storage_account" "sa" {
  name                     = "${lower(var.naming_prefix)}${random_integer.sa_num.result}"
  resource_group_name      = azurerm_resource_group.setup.name
  location                 = var.location
  account_tier             = "Standard"
  account_replication_type = "LRS"

}

resource "azurerm_storage_container" "ct" {
  #count                = length(var.component)
  name                 = "terraform-state${var.component}"
  storage_account_name = azurerm_storage_account.sa.name

}

我尝试了各种符号,包括 "count"(在上面的示例中被注释掉)和 azurerm_storage_container.ct.name 中的引用元素等,但没有得到任何牵引力。我在这里错过了什么?

对于评价,我觉得不完全正确。如果您只需要为每个单独的组件创建一个状态文件。我认为只有一个容器就足够了。您可以为每个不同名称的单独组件创建一个状态文件,以便您直接找到具有特殊名称的特殊文件。如果你想保留所有的状态文件,并为每个部署的一个组件设置不同的名称,那么评估是正确的,你需要多个容器来回显单独的组件。

然后是 Terraform 代码,大部分代码都是对的,所以你只需要像这样更改容器的代码:

resource "azurerm_storage_container" "ct" {
  count                = length(var.component)
  name                 = "terraform-state-${element(var.component, count.index)}"
  storage_account_name = azurerm_storage_account.sa.name

}