Terraform 0.11: aws_lambda_function 中的条件 vpc_config

5

我尝试在Lambda函数上部署一个具有对 vpc_config 块的条件限制。我尝试了在 vpc_config 中使用计数,但是无法在那里使用计数语句。根据资源文档,如果您按照以下方式传入空列表,则会忽略 vpc_config 部分:

  vpc_config {
    subnet_ids = []
    security_group_ids = []
  }

我可以确认这个操作按预期工作(不会尝试配置VPC)。

因此,我尝试使用条件语句来处理 subnet_idssecurity_group_ids - 大概是像 var.vpc_function ? var.subnet_ids : [] 这样的方式 - 但是在条件语句中不能传递列表。我找到的最接近解决方案的方法是下面这个 hacky 的做法,即将列表合并后再拆分:

  resource "aws_lambda_function" "lambda_function" {
  ...
  vpc_config {
    subnet_ids = ["${split(",", var.vpc_function ? join(",", var.subnet_ids) : join(",", var.empty_array))}"]
    security_group_ids = ["${split(",", var.vpc_function ? join(",", aws_security_group.lambda_security_group.*.id) : join(",", var.empty_array))}"]
  }

variable "vpc_function" {
  default = "false"
}
variable "subnet_ids" {
  type = "list"
  default = ["subnet-a", "subnet-b"]
}
variable "empty_array" {
  type = "list"
  default = []
}

这在第一次应用时,无论vpc_function是真还是假,都可以正常运行,这很好,但是当vpc_function为假时,terraform在每次重新应用时总是会看到上述更改:
  vpc_config.#:                      "0" => "1"
  vpc_config.0.security_group_ids.#: "0" => "1"
  vpc_config.0.security_group_ids.0: "" => ""
  vpc_config.0.subnet_ids.#:         "0" => "1"
  vpc_config.0.subnet_ids.0:         "" => ""

我猜问题在于我的合并后再拆分的列表不是被视为[],而是一个带有一些(空白)内容的列表。
还有其他人有解决方法吗?我也尝试使用Terraform 0.12,但无法弄清楚。也许有人在Terraform 0.12中做过类似的事情,并可以提供一些指针?

1
我相信在 Terraform 0.11 的限制下,这是你能做到的最好的。你已经尝试了人们通常尝试的方法来解决这种情况/用例。 - Matt Schuchard
1个回答

4

最终我在Terraform 12中找到了解决方案:

resource "aws_lambda_function" "lambda_function" {
...
  vpc_config {
    subnet_ids = var.vpc_function ? var.subnet_ids : []
    security_group_ids = var.vpc_function ? aws_security_group.lambda_security_group.*.id : []
  }
...
}

变量 subnet_ids 如下所示传递:
subnet_ids = ["subnet-123", "subnet-345", "subnet-456"]

aws_security_group.lambda_security_group.*.id被创建为普通资源。


你能否为这些变量提供默认值(将默认值设置为空列表[])并避免使用三元运算符吗? - 208_man

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接