terraform 变量默认值从局部插值

gyr*_*yre 5 terraform terraform-provider-aws

我有一个用例,我需要两个 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
}

Run Code Online (Sandbox Code Playgroud)

其中variablesfoo_cloud_secret_keyfoo_cloud_access_key然后将被传递到子模块,如下所示:

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

Run Code Online (Sandbox Code Playgroud)

然后在哪里module foobar配置其附加内容并提供以下变量:

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

Run Code Online (Sandbox Code Playgroud)

当我运行 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.
Run Code Online (Sandbox Code Playgroud)

是否有可能实现这样的目标,terraform或者还有其他方法可以实现这一目标吗?

luk*_*302 7

拥有复杂的、计算出的变量默认值是可能的,但只有一种解决方法:

  • 为变量定义一个虚拟默认值,例如null
  • 定义一个局部变量,它的值要么是变量的值,要么是实际的默认值
variable "something" {
    default = null
}

locals {
    some_computation = ... # based on whatever data you want
    something = var.something == null ? local.some_computation : var.something
}
Run Code Online (Sandbox Code Playgroud)

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