当我的Terraform模板中的元组为空时,如何获取默认值?

当我的Terraform模板中的元组为空时,如何获取默认值?,terraform,Terraform,我有一个locals块,如下所示: locals { database_server_name = var.createDatabaseServer ? azurerm_postgresql_server.region[0].name : var.postgresqlServerName } 不幸的是,Terraform似乎想要评估元组(区域[0]),尽管并非在所有场景中都必须: Error: Invalid index on terraform/region/03-database

我有一个
locals
块,如下所示:

locals {
  database_server_name = var.createDatabaseServer ? azurerm_postgresql_server.region[0].name : var.postgresqlServerName
}
不幸的是,Terraform似乎想要评估元组(
区域[0]
),尽管并非在所有场景中都必须:

Error: Invalid index

  on terraform/region/03-database.tf line 34, in locals:
  34:   database_server_name = var.createDatabaseServer ? azurerm_postgresql_server.region[0].name : var.postgresqlServerName
    |----------------
    | azurerm_postgresql_server.region is empty tuple

如果在元组为空的情况下可以使用默认值(
var.postgresqlServerName
),是否有任何方法可以实现上面我想要的功能?

可能会将逻辑从本地取出并有条件地创建资源。您在其中使用
本地。数据库\u服务器\u名称
可以包含每个
计数
(可以包含其他逻辑):


也许可以将逻辑从本地取出,有条件地创建资源。您在其中使用
本地。数据库\u服务器\u名称
可以包含每个
计数
(可以包含其他逻辑):


仅从您共享的信息来看,尚不清楚
var.createDatabaseServer
azurerm\u postgresql\u server.region
是如何关联的,因此也不清楚在不合适的情况下,什么可能导致对条件的第一个表达式求值

话虽如此,你也许可以通过直接测试你所期望的情况是否属实,而不是通过测试另一个变量来推断,从而得到你想要的答案:

locals {
  database_server_name = (
    length(azurerm_postgresql_server.region) > 0 ?
    azurerm_postgresql_server.region[0].name :
    var.postgresql_server_name
  )
}

通过直接测试azurerm\u postgresql\u server.region中有多少元素,可以避免条件和第一个表达式不一致的情况。

仅从您共享的信息不清楚
var.createDatabaseServer
azurerm\u postgresql\u server.region
是相关的,因此不清楚在条件表达式的第一个表达式不合适的情况下,是什么导致对其求值

话虽如此,你也许可以通过直接测试你所期望的情况是否属实,而不是通过测试另一个变量来推断,从而得到你想要的答案:

locals {
  database_server_name = (
    length(azurerm_postgresql_server.region) > 0 ?
    azurerm_postgresql_server.region[0].name :
    var.postgresql_server_name
  )
}

通过直接测试azurerm\u postgresql\u server.region中有多少个元素,可以避免条件和第一个表达式不一致的情况。

您可能会在使用splat运算符时遇到问题。它符合旧的DSL语法,但可以正常工作。您可能无法使用splat运算符
*
解决方法。它符合旧的DSL语法,但可以工作。