json - 在 Terraform 变量中使用 JSON 格式的字符串
问题描述
我正在使用 Terraform 版本 0.14.15 上的 for_each 方法创建一些资源。该资源有一个属性 input_parameters,它将 JSON 格式的字符串作为其值。我正在使用单独的对象在地图变量中定义这个值。我指定为 JSON 格式的字符串的值,执行时出现错误,我需要声明一个字符串。有关修复此错误的任何见解都会有所帮助。以下是我声明资源和变量的方式。
资源
resource "aws_config_config_rule" "managed_rules" {
for_each = var.managed_rules
name = each.value.name
description = each.value.description
input_parameters = each.value.input_parameters
source {
owner = each.value.owner
source_identifier = each.value.source_identifier
}
depends_on = [aws_config_configuration_recorder.config_recorder]
}
多变的
variable "managed_rules" {
type = map(object({
name = string
description = string
owner = string
source_identifier = string
# Is there a variable for strings in JSON format?
input_parameters = string
}))
default = {
"1" = {
name = "alb-http-to-https-redirection-check"
description = "Checks whether HTTP to HTTPS redirection is configured on all HTTP listeners of Application Load Balancers. The rule is NON_COMPLIANT if one or more HTTP listeners of Application Load Balancer do not have HTTP to HTTPS redirection configured."
owner = "AWS"
source_identifier = "ALB_HTTP_TO_HTTPS_REDIRECTION_CHECK"
input_parameters = {
"MaximumExecutionFrequency" : "TwentyFour_Hours",
}
}
错误
This default value is not compatible with the variable's type constraint:
element "2": attribute "input_parameters": string required.
使用 jsonencode 函数更新代码并将 input_parameters 更改为 any 后,出现以下错误:
This default value is not compatible with the variable's type constraint:
collection elements cannot be unified.
解决方案
你有几件事在这里发生:
- 资源需要
input_parameters
是 JSON 编码的字符串 - 您将变量类型作为字符串
- 您将对象类型传递给仅接受字符串类型的变量
所以(2)和(3)是矛盾的。在某些时候,您必须将对象转换为 JSON 字符串。您可以在将其作为输入变量传递之前执行此操作,也可以将输入变量更改为接受对象,并在将对象提供给资源时将其转换为 JSON。
我会选择第二个选项,因为将对象而不是字符串传递到模块中更直观。所以,试试这个:
resource "aws_config_config_rule" "managed_rules" {
for_each = var.managed_rules
name = each.value.name
description = each.value.description
input_parameters = jsonencode(each.value.input_parameters)
source {
owner = each.value.owner
source_identifier = each.value.source_identifier
}
depends_on = [aws_config_configuration_recorder.config_recorder]
}
variable "managed_rules" {
type = map(object({
name = string
description = string
owner = string
source_identifier = string
# Is there a variable for strings in JSON format?
input_parameters = any
}))
default = {
"1" = {
name = "alb-http-to-https-redirection-check"
description = "Checks whether HTTP to HTTPS redirection is configured on all HTTP listeners of Application Load Balancers. The rule is NON_COMPLIANT if one or more HTTP listeners of Application Load Balancer do not have HTTP to HTTPS redirection configured."
owner = "AWS"
source_identifier = "ALB_HTTP_TO_HTTPS_REDIRECTION_CHECK"
input_parameters = {
"MaximumExecutionFrequency" : "TwentyFour_Hours",
}
}
请注意,我已jsonencode
在资源中使用,input_parameters
并且已将该字段的变量类型更改为any
(因此它将接受任何结构的对象)。
推荐阅读
- postgresql - PL/PGSQL。此循环语句在斐波那契示例中如何工作
- twitter-bootstrap-3 - bootstrap modal data-backdrop=false 允许在点击外部关闭模式
- java - 上传大文件时Spring启动java.net.SocketTimeoutException
- php - the_title 函数在 Wordpress 中返回字符串而不是回显
- python - 使用 VBA 刷新 PowerQuery 时禁用弹出窗口
- javascript - JavaScript 数组填充(一对多)
- python - 我有一本由 ajax 发送的字典,我想把它放到 django 视图中,而不用按键获取它们
- angular - Angular Typescript 从数据库加载对象
- r - 如何设置不同的阈值以获得 ROC 图的多个值
- firebase - 使用 Firestore 进行新闻提要收集和请求设计