0

I would like to create three Azure service bus subscriptions and then two of the subscriptions need to have filters on them. My code is given below

resource "azurerm_servicebus_topic" "default" {
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  namespace_name      = azurerm_servicebus_namespace.default.name
  name                = module.names-default.environment.servicebus_topic.name_unique
  enable_partitioning = false
}

resource "azurerm_servicebus_subscription" "new-subscr" {
  for_each            = local.svc_bus_subscr
  resource_group_name = azurerm_servicebus_topic.default.resource_group_name
  namespace_name      = azurerm_servicebus_topic.default.namespace_name
  default_message_ttl = "P35D"
  topic_name          = azurerm_servicebus_topic.default.name
  max_delivery_count  = 5
  name                = each.value["name"]
  requires_session    = each.value["requires_session"]
}


locals {
  svc_bus_subscr = {
    sub-1 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "b214")
      requires_session = false
    }
    sub-2 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "ef14")
      requires_session = true
    }
    sub-3 = {
      name             = format("sbs-%s-%s-%s", var.resource_group_name, (var.resource_group_environment != "main") ? var.resource_group_environment : "dev", "ck89")
      requires_session = true
    }
  }
}

These are the filters for two of the subscriptions

locals {
  svc_bus_subscr_filter = {

   filter-b214 = {
      name  = ""
      id    = ""
      label = ""
    }
    filter-ef14 = {
      name  = "MinestarQbEvents"
      id    = "minestarqb"
      label = "red"
    }
    filter-ck89 = {
      name  = "WencoHvcEvents"
      id    = "wencohvc"
      label = "red"
    }
  }
}


resource "azurerm_servicebus_subscription_rule" "filter" {
  for_each            = { for n in local.svc_bus_subscr : n.name => n }
  subscription_name   = lookup(local.svc_bus_subscr[each.value.name], "name", null)
  name                = local.svc_bus_subscr_filter.value.filter_name
  resource_group_name = azurerm_servicebus_namespace.default.resource_group_name
  topic_name          = azurerm_servicebus_topic.default.name
  namespace_name      = azurerm_servicebus_namespace.default.name
  filter_type         = "CorrelationFilter"

  correlation_filter {
    correlation_id = local.svc_bus_subscr_filter.value.id
    label          = local.svc_bus_subscr_filter.value.label
    properties = {
      customProperty = "value"
    }
  }
}

The errors that i get are :

 Error: Unsupported attribute
│ 
│   on resources.sb.tf line 149, in resource "azurerm_servicebus_subscription_rule" "filter":
│  149:   name                = local.svc_bus_subscr_filter.value.filter_name
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".
╵
╷
│ Error: Unsupported attribute
│ 
│   on resources.sb.tf line 156, in resource "azurerm_servicebus_subscription_rule" "filter":
│  156:     correlation_id = local.svc_bus_subscr_filter.value.id
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".
╵
╷
│ Error: Unsupported attribute
│ 
│   on resources.sb.tf line 157, in resource "azurerm_servicebus_subscription_rule" "filter":
│  157:     label          = local.svc_bus_subscr_filter.value.label
│     ├────────────────
│     │ local.svc_bus_subscr_filter is object with 3 attributes
│ 
│ This object does not have an attribute named "value".
Pallab
  • 1,915
  • 2
  • 19
  • 46
  • The errors provided dont match the code you show. – Chris Doyle Oct 31 '22 at 20:39
  • @ChrisDoyle It is throwing error on the index of the subscriptions. I have put the code for the three subscriptions along with the filter – Pallab Oct 31 '22 at 21:50
  • Do i have to use a flatten function or something because it is a map in a map maybe – Pallab Oct 31 '22 at 22:08
  • where are you getting your values for `new-subscr`, what do you see if you do `terraform state list` and look for the resources listed under `azurerm_servicebus_subscription.new-subscr` – Chris Doyle Oct 31 '22 at 22:20
  • I have updated the question now , i get these new errors – Pallab Nov 01 '22 at 01:03
  • Can you check by modifying this > local.svc_bus_subscr_filter.value.filter_name to local.svc_bus_subscr_filter[each.vaule.filter_name], "filter Name" in block resource "azurerm_servicebus_subscription_rule" "filter" – kavyaS Nov 03 '22 at 06:19

0 Answers0