Terraform 数据源无法获取现有资源

Terraform data source not able to fetch existing resource

无法使用 Terraform 数据源获取现有资源。我遇到错误,

一个存储账户可以运行成功

但我需要实现的是,对于第一个存储帐户创建私有 DNS 区域“privatelink.blob.core.windows.net”,后续存储帐户使用现有的私有 DNS 区域“privatelink.blob.core.windows.net”。

为此,我正在使用 lookup 变量,如果它是 true ,则不创建只查找现有资源,如果 false 则创建它。

有人可以帮忙吗,我在下面的代码中做错了什么。下面共享所有必需的详细信息。如果需要其他信息,请发表评论。

Error: Private DNS Zone "privatelink.blob.core.windows.net" (Resource Group "rg1") was not found
│
│   with module.storage[1].data.azurerm_private_dns_zone.lookup[0],
│   on ../../../../modules/storage/main.tf line 57, in data "azurerm_private_dns_zone" "lookup":
│   57: data "azurerm_private_dns_zone" "lookup" {

下面是模块main.tf

resource "azurerm_storage_account" "main" {
  name                          = var.storage_name
  resource_group_name           = var.storage_resource_group_name
  location                      = var.storage_location
  account_tier                  = var.account_tier
  account_kind                  = var.account_kind
  account_replication_type      = var.account_replication_type
  enable_https_traffic_only     = var.enable_https_traffic_only
  min_tls_version               = var.min_tls_version
  allow_blob_public_access      = var.allow_blob_public_access
  tags                          = var.tags
  depends_on = [
    azurerm_private_dns_zone.main
  ]
}

resource "azurerm_storage_container" "main" {
  count                 = length(var.container_names)
  name                  = var.container_names[count.index]
  storage_account_name  = azurerm_storage_account.main.name
  container_access_type = var.container_access_type
}

resource "azurerm_storage_account_network_rules" "main" {
  storage_account_id = azurerm_storage_account.main.id

  default_action             = var.default_action
  ip_rules                   = var.ip_rules
  virtual_network_subnet_ids = var.virtual_network_subnet_ids
  bypass                     = var.bypass
}

resource "azurerm_private_endpoint" "main" {
  name                = var.pep_name
  location            = var.pep_location
  resource_group_name = var.pep_resource_group_name
  subnet_id           = var.pep_subnet_id

  private_service_connection {
    name                           = var.psc_name
    private_connection_resource_id = azurerm_storage_account.main.id
    subresource_names              = var.subresource_names
    is_manual_connection           = var.is_manual_connection
  }
  private_dns_zone_group {
       name                  = var.private_dns_group_name
       private_dns_zone_ids  = var.lookup_private_dns_zone_name ? [data.azurerm_private_dns_zone.lookup[0].id] : [azurerm_private_dns_zone.main[0].id]
  }
}

resource "azurerm_private_dns_zone" "main" {
  count               = var.lookup_private_dns_zone_name ? 0 : 1
  name                = var.private_dns_zone_name
  resource_group_name = var.private_dns_zone_resource_group_name
}

data "azurerm_private_dns_zone" "lookup" {
  count               = var.lookup_private_dns_zone_name ? 1 : 0
  name                = azurerm_private_dns_zone.main[0].name
  resource_group_name = azurerm_private_dns_zone.main[0].resource_group_name

  depends_on = [
    azurerm_private_dns_zone.main
  ]
}

resource "azurerm_private_dns_zone_virtual_network_link" "main" {
  name                  = var.private_dns_zone_virtual_network_link_name
  resource_group_name   = var.private_dns_zone_virtual_network_link_resource_group_name
  private_dns_zone_name = var.lookup_private_dns_zone_name ? data.azurerm_private_dns_zone.lookup[0].name : azurerm_private_dns_zone.main[0].name
  virtual_network_id    = var.private_dns_zone_virtual_nevtwork_id
}

调用根模块:

module "storage" {
  count                                                     = length(var.storage)
  source                                                    = "../../../../modules/storage"
  storage_name                                              = join("", [local.prefix, "store", var.storage[count.index].id])
  lookup_private_dns_zone_name                              = try(var.storage[count.index].lookup_private_dns_zone_name, false)
  storage_resource_group_name                               = var.storage[count.index].resource_group_name
  storage_location                                          = var.storage[count.index].location
  account_replication_type                                  = try(var.storage[count.index].account_replication_type, "GRS")
  tags                                                      = merge(try(var.storage[count.index].tags, {}), local.tags)
  container_names                                           = try(var.storage[count.index].container_names, [])
  virtual_network_subnet_ids                                = try(var.storage[count.index].virtual_network_subnet_ids, [])
  default_action                                            = try(var.storage[count.index].default_action, "Deny")
  pep_name                                                  = join("", [local.prefix, "pepstore", var.storage[count.index].id])
  pep_location                                              = var.storage[count.index].location
  pep_resource_group_name                                   = var.storage[count.index].resource_group_name
  pep_subnet_id                                             = var.storage[count.index].pep_subnet_id
  psc_name                                                  = join("", [local.prefix, "pscstore", var.storage[count.index].id])
  is_manual_connection                                      = false
  private_dns_group_name                                    = join("", [local.prefix, "dnsgroupstore", var.storage[count.index].id])
  private_dns_zone_name                                     = "privatelink.blob.core.windows.net"
  private_dns_zone_resource_group_name                      = var.storage[count.index].resource_group_name
  private_dns_zone_virtual_network_link_name                = join("", [local.prefix, "pdzvnlstore", var.storage[count.index].id])
  private_dns_zone_virtual_network_link_resource_group_name = var.storage[count.index].resource_group_name
  private_dns_zone_virtual_network_id                       = var.storage[count.index].private_dns_zone_virtual_network_id
  depends_on                                                = [module.resource_group]
}

输入文件poc.tfvars.json:

{"storage": [
        {
            "id": "04",
            "resource_group_name": "rg1",
            "location": "westus2",
            "pep_subnet_id": "sub_net_resource_id",
            "private_dns_zone_virtual_network_id": "virtual_network_id",
            "container_names": ["containerinfratfswsu2ctedev"]
        },
        {
            "id": "05",
            "lookup_private_dns_zone_name": true,
            "resource_group_name": "WUS2-DEV-PE-CTE-CCI-TF-REPO-RG",
            "location": "westus2",
            "pep_subnet_id": "subnet_resource_id",
            "private_dns_zone_virtual_network_id": "virtual_network_id"
        }
    ]}

因为您正在使用:

module "storage" {
  count                                                     = length(var.storage)

您的模块的两个实例将同时创建,而不是连续创建。很明显,模块的第二个实例失败了,因为它是在第一个实例的同时(而不是之后)创建的。所以此时此刻,没有azurerm_private_dns_zone.

您要么必须手动 运行 模块,一个接一个 depends_on,或者以某种方式将 lookup_private_dns_zone_name 功能提取到它自己的模块中,即 运行 在一切之前。

另一种选择是使用 External Data Source 激活第二个实例模块,并人为地停止它直到 azurerm_private_dns_zone 存在。但是,依靠它来传递它是非常老套的。