【问题标题】:Terraform Dynamic module from a map地图中的 Terraform 动态模块
【发布时间】:2022-01-14 09:49:57
【问题描述】:

我正在尝试从 terraform 中的地图生成动态 aws_db_parameter_group。我想知道我正在尝试做的事情是否可能。这是一个示例代码:

provider "aws" {
...
}

variable "key_values" {
  type = map(string)

  default = {
    "audit_trail" = "db,extended"
    "log_buffer" = "100"
  }
}

resource "aws_db_parameter_group" "test" {
  family = "oracle-ee"

  name = "test"

  dynamic "key_value" {
    for_each = var.key_values
    content {
        name = key_value.key
        value = key_value.value
    }
  }
}

目标是对于变量中的每个键、值,我想生成一个具有两个值的动态块。一个是键名,第二个值是地图中的值。我一直在读这个:https://www.terraform.io/docs/language/expressions/dynamic-blocks.html

而且看起来我正在尝试的方法是可行的,但我无法弄清楚。有什么建议吗?

问候,

【问题讨论】:

    标签: terraform


    【解决方案1】:

    根据文档,您可以使用的唯一可能的动态块是parameter,我将在下面给您一个示例。

    resource "aws_db_parameter_group" "default" {
      name = "db-paramgroup-${var.project}-${var.env}"
      family = "mysql${var.engine_version}"
    
      dynamic "parameter" {
        for_each = var.custom_db_parameters
        content {
          name         = lookup(parameter.value, "name", null)
          value        = lookup(parameter.value, "value", null)
          apply_method = lookup(parameter.value, "apply_method", null)
        }
      }
      tags = var.tags
    }
    

    如果您需要以动态方式创建多个aws_db_parameter_groupresources,您应该使用countfor_each 使其工作,我将在下面给您一个新示例。

    
    resource "aws_db_parameter_group" "default" {
      count = length(var.parameter_group_name) == 0 ? 1 : 0
      name = "db-paramgroup-${var.project}-${var.env}"
      family = "mysql${var.engine_version}"
    
      dynamic "parameter" {
        for_each = var.custom_db_parameters
        content {
          name         = lookup(parameter.value, "name", null)
          value        = lookup(parameter.value, "value", null)
          apply_method = lookup(parameter.value, "apply_method", null)
        }
      }
      tags = var.tags
    }
    
    

    如果您需要有关count 工作原理的更多信息,可以参考this 链接。

    此外,请确保您使用的是 custom_db_parameters 值,如下所示:

    custom_db_parameters = [
        {
          name        = "database_parameter_name_one"
          value = "database_parameter_value_one"
          apply_method  = "immediate"
    
        },
        {
          name        = "database_parameter_name_two"
          value = "database_parameter_value_two"
          apply_method  = "pending-reboot"
        },
    
    ]
    

    确保apply_method 键具有正确的值,您有两个可能的值,重要的是要了解您是需要立即应用它还是等待下一个重新启动/维护窗口。

    【讨论】:

    • 非常感谢雨果。我正在查看查找。
    • 很高兴,希望对您有所帮助!
    • 这行得通吗?我尝试了与上面提到的相同的方法,但是查找函数总是返回默认值“立即”。
    • 是的,这段代码应该可以工作,查找内置函数正在验证您通过名为 custom_db_parameters 的变量传递给 for_each 参数的值,确保您传递了正确的值,然后您可以获得元素,注意如果值不存在,查找函数将默认返回 null(上面的示例)
    • 嗨,这段代码以前可以工作,但今天,当我尝试时,我得到了这样的错误:│“inputMap”参数的值无效:lookup() 需要一个地图作为第一个参数。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 2020-09-25
    • 2020-09-08
    • 2020-08-18
    • 1970-01-01
    • 2021-09-24
    • 2021-08-11
    相关资源
    最近更新 更多