在Terraform中显式使用变量default

在Terraform中显式使用变量default,terraform,Terraform,我有一个值映射(从concur填充),我用它来配置我的资源,但是如果缺少可选变量的值,我希望Terraform充当它,因为没有提供参数。例如: resource "aws_db_instance" "db" { engine = "${lookup(config_map, "db_engine", "postgres")}" port = "${lookup(config_map, "db_port", "<pick default for the engine>")}"

我有一个值映射(从concur填充),我用它来配置我的资源,但是如果缺少可选变量的值,我希望Terraform充当它,因为没有提供参数。例如:

resource "aws_db_instance" "db" {
  engine = "${lookup(config_map, "db_engine", "postgres")}"
  port   = "${lookup(config_map, "db_port", "<pick default for the engine>")}"
}
资源“aws\u db\u实例”“db”{
engine=“${lookup(配置映射,“数据库引擎”,“postgres”)}
port=“${lookup(配置映射,“db\u端口”,“”)}
}

如果未给出
端口
,Terraform将根据发动机选择默认值。我可以显式触发此行为吗?

以下操作应符合您的预期(语法已验证,但
apply
尚未测试:如果答案有效,我将更新答案,否则将删除答案)

首先,您应该在引擎和默认端口之间有一个映射(在这里,这是一个变量,但可以像您的
配置映射那样存储在concur中):

然后,可以在嵌套查找中使用此变量:

resource "aws_db_instance" "db" {
  engine = "${lookup(config_map, "db_engine", "postgres")}"
  port   = "${
    lookup(
      var.default_ports_by_engine,
      "${lookup(config_map, "db_engine", "postgres")}"
    )
  }"
}

请注意,如果在
default\u ports\u by\u engine

中未找到
db\u engine
,则不将第三个参数传递给
lookup
函数将导致Terraform失败。我认为这会起作用,但我希望重用Terraform执行的逻辑,而不是复制它。您所说的“复制逻辑”是什么意思?在本例中,我需要检查Terraform为我想要使用的所有引擎使用的默认端口,并对它们进行硬编码。
resource "aws_db_instance" "db" {
  engine = "${lookup(config_map, "db_engine", "postgres")}"
  port   = "${
    lookup(
      var.default_ports_by_engine,
      "${lookup(config_map, "db_engine", "postgres")}"
    )
  }"
}