Home > Software engineering >  In terraform making string variable optional in action block
In terraform making string variable optional in action block

Time:09-30

Hi i am creating alert rules. For some of the alerts i dont need to send any notification using action group.For that i need to make action group variable (string) as optional.

I tried using condition like var.action_group_id != null action_group_id : "". But i am getting following error.

Error: Can not parse "action.0.action_group_id" as a resource id: Cannot parse Azure ID: parse "null": invalid URI for request

And i tried making action block as dynamic block but it is not iterable. for_each is not supporting dynamic block with single variable with one values.

resource "azurerm_monitor_metric_alert" "keyvault_alert" {

 for_each = var.keyvault_alert_rules

  name                = "${var.kv_name} - ${each.value.severity}"
  resource_group_name = var.resource_group_name
  description         = each.value.description
  scopes              = var.alert_scope
  severity            = each.value.severity
  frequency           = each.value.frequency
  `window_size         = each.value.windowsize`

# criteria block
  criteria {
    
    metric_namespace  = "Microsoft.KeyVault/vaults"
    threshold         = each.value.threshold
    metric_name       = each.value.metric_name
    aggregation       = each.value.aggregation
    operator          = each.value.operator

 # dimension block

    dynamic "dimension" {
      for_each = each.value.dimension != null ? each.value.dimension : []
      content {
          name     = dimension.value.dimensionname
          operator = dimension.value.dimensionoperator
          values   = dimension.value.dimensionvalues
      }
    }
        
  }

  action {
         action_group_id = var.action_group_id
       }

variable.tf

variable "action_group_id" {
    type = string
  description = "ID of the action group"
}


variable "resource_group_name" {
    type = string
  description = "name of the resource group"
}

/* in the variables i am passing warning as n input.is there any way i can append warning to alert name in the main.tf based on the severity value which is given down below*/
variable "kv_alert_rules" {
    type = map(object({  
     display_name = string
     # display_name = "(severity numeric equalent ex:warning)-(metric name)" 
     

     #------details for the alert criteria
     metric_name = string
     operator = string
     threshold = number 
     aggregation = string
        
    #------ dimension vaules----------
      dimension =  list(object({
        dimensionname = string
        dimensionoperator = string
        dimensionvalues = list(string)
      }))  
    #-----------------------------------
     severity = number
     frequency = string
     windowsize = string
     # window size must be gretar than Frequency values be PT1M, PT5M, PT15M, PT30M, PT1H, PT6H, PT12H and P1D. Defaults to PT5M
     
     description = string
            
    }))

    description = "This variable for alert criteria for key vault"


            default = {
     "Alert_1" = {
      # display_name = "(severity numeric equalent ex:warning)-(generic word for metric name)"
    display_name = "warning-used capacity"
    severity = 2
    dimension = null
    metric_name = "SaturationShoebox"
    aggregation = "Average"
    frequency = "PT30M"
    description = "Alert fires When Used vault capacity is GreaterThan 85"
    windowsize = "PT1H"
    operator = "GreaterThan"
    threshold = 85
    }
  }
     }

variable "kv_name" {
  description = "key vault name "
  type = string 
}

module calling

module "keyvault" {
  source = "../testing/key-vault-alert"
   alert_scope = [data.azurerm_key_vault.examplekeyvault.id]
   action_group_id = module.action-group.AGidout
   resource_group_name = var.resource_group_name 
   kv_name = data.azurerm_key_vault.examplekeyvault.name
}

I would like to make action_group_id as optional variable.I dont wanna reference action group ID in some instances

If anyone knows a approach how to do that please guide me Thanks

CodePudding user response:

action is a dynamic block, so to make it optional you can do as follows:

  dynamic "action" {
     for_each = var.action_group_id != null ? [1] : []
     content {   
         action_group_id = var.action_group_id 
     }
  }
  • Related