Hi.
Terraform is failing to destroy resources and I don’t understand why. I am working in Azure but I don’t think this is an Azure-specific error.
I have a networking module which creates several subnets, and an output to expose the subnet IDs for use with other resources:
# module "networking"
variable "subnets" {
  description = "Subnet configuration"
  type        = map(object({
    address_range = list(string)
    name          = string
    delegation    = optional(object({
      name               = string
      service_delegation = object({
        name    = string
        actions = optional(list(string))
      })
    }))
  }))
}
resource "azurerm_subnet" "this" {
  for_each             = var.subnets
  
  name                 = each.value.name
  resource_group_name  = var.rg_name
  address_prefixes     = each.value.address_range
  virtual_network_name = azurerm_virtual_network.this.name
  dynamic "delegation" {
    for_each = lookup(each.value, "delegation", {}) != null ? [1] : []
    content {
      name = lookup(each.value.delegation, "name", null)
      service_delegation {
        name    = lookup(each.value.delegation.service_delegation, "name", null)
        actions = lookup(each.value.delegation.service_delegation, "actions", null)
      }
    }
  }
}
output "subnet_ids" {
  description = "Map of subnet names and IDs"
  value = {
    for k, v in azurerm_subnet.this : v.name => v.id
  }
}
Elsewhere, I create an App Service and associate it with a subnet:
resource "azurerm_app_service" "this" {
  name                = var.app_svc_name
  resource_group_name = var.rg_name
  location            = var.location
  #...
}
resource "azurerm_app_service_virtual_network_swift_connection" "this" {
  app_service_id = azurerm_app_service.this.id
  subnet_id      = lookup(module.networking.subnet_ids, var.app_svc_subnet_name, null)
}
This code works to create everything correctly. However, when I execute a destroy plan, Terraform fails and gives the error:
Error: Unsupported attribute
on main.tf line 396:subnet_id = lookup(module.networking.subnet_ids, var.app_svc_subnet_name, null)module.networking is object with 2 attributes
This object does not have an attribute named “subnet_ids”.
Why does the destroy run have a problem with this code?