Terraform 0.11:aws_lambda_function 中的条件 vpc_config

Sua*_*Swe 5 aws-lambda terraform terraform-provider-aws terraform0.11

我正在尝试以vpc_config块为条件部署 Lambda 函数。我试过在里面使用 countvpc_config但不可能在那里使用 count 语句。根据资源的文档,如果您按如下方式传入空列表,则该vpc_config部分将被忽略:

  vpc_config {
    subnet_ids = []
    security_group_ids = []
  }
Run Code Online (Sandbox Code Playgroud)

我可以确认这确实按预期工作(没有尝试配置 VPC)。

因此,我尝试将条件用于subnet_idsand security_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 = []
}
Run Code Online (Sandbox Code Playgroud)

这在第一次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:         "" => ""
Run Code Online (Sandbox Code Playgroud)

我想问题是我的加入然后拆分列表没有被视为 [],而是被视为包含一些(空白)内容的列表。

有没有其他人对此有解决方案?我也尝试使用 Terraform 0.12,但无法弄清楚。也许有人在 Terraform 0.12 中做过类似的事情并且可以提供一些指导?

Sua*_*Swe 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 : []
  }
...
}
Run Code Online (Sandbox Code Playgroud)

变量subnet_ids传入如下:

subnet_ids = ["subnet-123", "subnet-345", "subnet-456"]
Run Code Online (Sandbox Code Playgroud)

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