【问题标题】:How to use local variables inside a QUERY in Terraform如何在 Terraform 的查询中使用局部变量
【发布时间】:2023-02-22 20:32:51
【问题描述】:

我正在尝试使用 Terraform 为哨兵解决方案部署警报规则。我使用来自 Azure 提供商的 sentinel_alert_rule_scheduled 资源,并且在警报规则的查询中有一个硬编码的值列表。

由于列表中的元素可以不时更改,我想从查询中取出列表并使用变量(局部变量应该是理想的)引用它。我需要了解 Terraform 中的支持才能实现这一目标。

当前警报规则资源:

resource "azurerm_sentinel_alert_rule_scheduled" "alert_rule_scheduled" {
  name                       = some_name
  log_analytics_workspace_id = some_log_analytics_workspace_id
  display_name               = some_.display_name
  description                = some_description

  enabled                    = true
  severity                   = "Low"

  query                      = <<QUERY
let someList = dynamic([element1,element2,element3,...])
.
.[query goes on]
.
QUERY

  query_frequency            = "PT1H"
  query_period               = "PT1H"

  trigger_operator           = "GreaterThan
  trigger_threshold          = 0
  suppression_enabled        = false
  tactics                    = ["IP"]
  
}

我想重构上面的代码是这样的:

resource "azurerm_sentinel_alert_rule_scheduled" "alert_rule_scheduled" {
  name                       = some_name
  log_analytics_workspace_id = some_log_analytics_workspace_id
  display_name               = some_.display_name
  description                = some_description

  enabled                    = true
  severity                   = "Low"

  query                      = <<QUERY
let someList = dynamic(${local.my_list_variable})
.
.[query goes on]
.
QUERY

  query_frequency            = "PT1H"
  query_period               = "PT1H"

  trigger_operator           = "GreaterThan
  trigger_threshold          = 0
  suppression_enabled        = false
  tactics                    = ["IP"]
  
}

locals {
  my_list_variable = [element1,element2,element3,...]
}

使用 $local.my_list_variable 会出现错误 Invalid template interpolation value。

我想知道我们是否可以在 Terraform 中做这种事情,如果可以,正确的做法是什么。

【问题讨论】:

  • 您是否尝试过不带大括号和美元符号的 local.my_list_variable?
  • @MarkoE 感谢您的评论。然后它像查询的字符串部分一样对待。我认为那也行不通。
  • my_list_variable = [element1,element2,element3,...] 这甚至不是有效的 TF 代码。因此,不清楚您要实现的目标。也不可能得到您报告的错误,因为,好吧,您的 TF 一开始就不正确。
  • @Marcin 感谢您的评论。您能否进一步解释为什么它不是有效代码,例如,我不能将 TF 局部变量作为 locals { fruits = ["Apple","Banana","Mango"]} 吗?如果没有,我应该如何申报。
  • fruits = ["Apple","Banana","Mango"] 是正确的,但 my_list_variable = [element1,element2,element3,...] 不是。您当前的代码让我相信,在您实际代码的其他区域,您也有一些语法错误,从而导致您的问题。

标签: syntax terraform terraform-provider-azure kql azure-sentinel


【解决方案1】:

本质上,这里的问题是您正在尝试对 list 类型进行字符串插值,如果不将其转换为 string,该类型在大多数语言中通常不起作用。但是,您实际上打算将变量转换为 string 而不是 list,因为它应该直接评估为 Terraform string 类型:

locals {
  my_list_variable = "[element1,element2,element3,...]"
}

然后在您的 HEREDOC 中:

let someList = dynamic(${local.my_list_variable})

将按预期呈现。

【讨论】:

  • 非常感谢。这正是我一直在寻找的,而且它奏效了。感谢您富有洞察力的解释。
猜你喜欢
  • 2018-04-10
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多