azure 是否有一种方法可以在Terraform中使用一个`random_uuid`资源生成一组随机UUID

svujldwt  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在尝试使用Terraform为sentinel解决方案部署一些sentinel自动化规则。因为自动化规则需要UUID作为其名称,所以我对每个自动化规则使用random_uuid资源来为自动化规则的名称生成UUID。代码如下所示。我想知道是否有一种方法可以通过一个random_uuid资源或类似的资源为我的自动化规则生成所有随机UUID值。

resource "random_uuid" "automation_rule_1" {}

resource "azurerm_sentinel_automation_rule" "automation_rule_1" {
  name                       = random_uuid.automation_rule_1.result
  log_analytics_workspace_id = var.log_analytics_workspace_id
  display_name               = "Automation Rule 1"
  order                      = 1
  triggers_on                = "Incidents"
  triggers_when              = "Created"
  enabled                    = true
  action_playbook {
    logic_app_id = var.logic_app_id
    order        = 1
    tenant_id    = var.tenant_id
  }
}

resource "random_uuid" "automation_rule_2" {}

resource "azurerm_sentinel_automation_rule" "automation_rule_2" {
  name                       = random_uuid.automation_rule_2.result
  log_analytics_workspace_id = var.log_analytics_workspace_id
  display_name               = "Automation Rule 2"
  order                      = 1
  triggers_on                = "Incidents"
  triggers_when              = "Created"
  enabled                    = true
  condition_json = jsonencode(
    [
      {
        conditionProperties = {
          operator     = "Contains"
          propertyName = "IncidentRelatedAnalyticRuleIds"
          propertyValues = [ var.sentinel_alert_rule_scheduled_id ]
        }
        conditionType = "Property"
      }
    ]
  )
  action_incident {
    order                  = 1
    status                 = "Closed"
    classification         = "BenignPositive_SuspiciousButExpected"
    classification_comment = "Sample Comment Goes Here"
    owner_id               = var.automation_rule_owner_id
  }
}

我期待类似以下的东西。有人能解释一下有没有一种方法可以实现这种行为。

resource "random_uuid" "automation_rule_ids" {
  keepers = {
    "rule_1_id" = "dont know what to put here",
    "rule_2_id" = "dont know what to put here"
  }
}
ljsrvy3e

ljsrvy3e1#

random_uuid的每个示例将仅生成一个UUID,但您可以使用该资源类型的多个示例来生成多个UUID。
例如:

variable "rules" {
  type = set(string)
}

resource "random_uuid" "example" {
  for_each = var.rules
}

locals {
  rule_uuids = tomap({
    for rule_name, obj in random_uuid_example :
    rule_name => obj.result
  })
}

这将local.rule_uuids定义为从规则名称到UUID字符串的Map,使用for_eachrandom_uuid.example资源声明该资源的多个动态示例。
例如,如果将rules变量设置为["a", "b"],则local.rule_uuids将具有如下结构的值:

tomap({
  a = "aabbccdd-eeff-0011-2233-445566778899"
  b = "ffffffff-ffff-ffff-ffff-ffffffffffff"
})

...当然,实际的UUID值会有所不同,因为它们是随机的。
上面没有包括任何“keepers”,因为您的问题没有定义任何规则,说明何时需要重新生成UUID。使用for_each意味着向var.rules添加新元素将导致Terraform建议仅为该规则键生成新的UUID,同样,从var.rules中删除元素将使Terraform建议丢弃其中一个UUID。
如果你确实需要为每个对象设置某种“keeper”,那么另一种方法是将输入变量设置为map,并使用值作为每个对象的“keepers”:

variable "rules" {
  type = map(string)
}

resource "random_uuid" "example" {
  for_each = var.rules

  keepers = {
    v = each.value
  }
}

# (locals block unchanged)

resource块中的each.value引用map的当前元素的值,因此该模块的调用者可以通过更改分配给map中其元素的值而不更改map键来重新生成现有的UUID。

相关问题