【问题标题】:terraform variable default value interpolation from locals来自本地的 terraform 变量默认值插值
【发布时间】:2021-05-22 20:59:23
【问题描述】:

我有一个用例,我需要两个 AWS 提供商来提供不同的资源。默认的aws 提供程序在主模块中配置,该模块使用另一个定义附加aws 提供程序的模块。

默认情况下,除非明确覆盖,否则我希望两个提供商都使用相同的 AWS 凭证。

我想我可以做这样的事情。在主模块中:

locals {
  foo_cloud_access_key = aws.access_key
  foo_cloud_secret_key = aws.secret_key
}

variable "foo_cloud_access_key" {
  type        = string
  default     = local.foo_cloud_access_key
}

variable "foo_cloud_secret_key" {
  type        = string
  default     = local.foo_cloud_secret_key
}

variables foo_cloud_secret_keyfoo_cloud_access_key 会像这样传递给子模块:

module foobar {
...
  foobar_access_key = var.foo_cloud_access_key
  foobar_secret_key = var.foo_cloud_secret_key
...
}

module foobar 将在其中配置其附加变量,并提供以下变量:

provider "aws" {
  alias      = "foobar_aws"
  access_key = var.foobar_access_key
  secret_key = var.foobar_secret_key
}

当我运行 init terraform 时会吐出这个错误(对于两个变量):

Error: Variables not allowed
  on variables.tf line 66, in variable "foo_cloud_access_key":
  66:   default     = local.foo_cloud_access_key

Variables may not be used here.

是否有可能在terraform 中实现类似的目标,或者有其他方法可以解决这个问题吗?

【问题讨论】:

    标签: terraform terraform-provider-aws


    【解决方案1】:

    可以使用复杂的计算变量默认值,但只能使用解决方法:

    • 为变量定义一个虚拟默认值,例如null
    • 定义一个局部变量,它的值要么是变量的值,要么是实际的默认值
    variable "something" {
        default = null
    }
    
    locals {
        some_computation = ... # based on whatever data you want
        something = var.something == null ? local.some_computation : var.something
    }
    

    然后在其余的 terraform 文件中仅使用 local.something 而不是 var.something

    【讨论】:

    • 请注意,我需要“提取” provider 配置变量并在其他地方使用它们,即 aws 提供程序将配置为 access_keysecret_key,我需要使用那些作为其他变量的默认值。
    猜你喜欢
    • 2020-08-26
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多