В Terraform отсутствует механизм переключения поведения на основе типов. Обычно Terraform предпочитает выбирать определенные типы так, чтобы вызывающие модули всегда были согласованными, и Terraform может полностью проверить заданные значения, даже если в более простых случаях это означает небольшую дополнительную детализацию.
Я бы рекомендовал просто определить details
какобъект и наличие вызывающего явно выписать объект с атрибутом name
, чтобы быть более явным и последовательным:
variable "details" {
type = object({
name = string
})
}
module "example" {
source = "./modules/example"
details = { name = "example" }
}
Если вам нужно для поддержки двухразличных типов, самым близким в языке Terraform было бы определить две переменные и определить, какая из них является null
:
variable "details" {
type = object({
name = string
})
default = null
}
variable "name" {
type = string
default = null
}
local {
name = var.name != null ? var.name : var.details.name
}
Однако, поскольку в настоящее время нет способа выразить это точно одной из этих двухдолжна быть указана, конфигурация модуля, которую вы пишете, должна быть готова иметь дело с возможностью того, что оба будут установлены (в вышеприведенном примере var.name
имеет приоритет) или что ни один из них не будет установлен (в вышеприведенном примере выражение будет производитьошибка, но не очень удобная для вызывающих абонентов).