Terraform 0.11:aws_lambda_function 中的条件 vpc_config

Posted

技术标签:

【中文标题】Terraform 0.11:aws_lambda_function 中的条件 vpc_config【英文标题】:Terraform 0.11: conditional vpc_config in aws_lambda_function 【发布时间】:2020-01-30 21:54:25 【问题描述】:

我正在尝试以vpc_config 块为条件部署一个 Lambda 函数。我曾尝试在 vpc_config 中使用 count ,但在那里无法使用 count 语句。根据资源的文档,如果您按如下方式传入空列表,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 中做了类似的事情并且可以提供一些指点?

【问题讨论】:

我相信这是您在 Terraform 0.11 的限制下所能做的最好的事情。您已经尝试了人们通常针对这种情况/用例尝试的方法。 【参考方案1】:

我最终在 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 被创建为普通资源。

【讨论】:

你不能只为这些变量提供默认值(将默认值设为 [])并避免使用三级语句吗?

以上是关于Terraform 0.11:aws_lambda_function 中的条件 vpc_config的主要内容,如果未能解决你的问题,请参考以下文章

如何发现现有的 Terraform 版本

terraform:有没有办法动态创建 iam 策略语句?

用于 Mac M1 安装的 Terraform aws 提供程序问题

使用 terragrunt 的“无效的旧提供程序地址”

Ubuntu安装bochs运行Linux 0.11

Kafka 0.11版本新功能介绍