Terraform 中的可选变量在值为 null 时不会被忽略

Posted

技术标签:

【中文标题】Terraform 中的可选变量在值为 null 时不会被忽略【英文标题】:Optional variable in Terraform is not ignored when the value is null 【发布时间】:2021-04-13 16:48:53 【问题描述】:

我在一个模块中有 Terraform“aws_instance”资源。当 ami 设置为 var.ami_id 并使用单个给定字符串时,它按预期工作。 为了将此模块用于不同的目的,我已将 var.ami_ids 添加为列表(字符串)并添加为可选变量。

ami           = var.ami_ids == [""] ? var.ami_id : var.ami_ids[count.index]

变量.tf

variable "ami_id" 
  description = "ID of AMI to use for the instance"
  type        = string
  default     = ""

variable "ami_ids" 
  description = "List of IDs of AMI to use for the instance"
  type        = list(string)
  default     = [""]

main.tf

resource "aws_instance" "ec2" 
  count = var.number_of_ec2_instances_required

  ami           = var.ami_ids == [""] ? var.ami_id : var.ami_ids[count.index]
  instance_type = var.instance_type
  private_ip    = length(var.private_ips) > 0 ? element(var.private_ips, count.index) : var.private_ip
  subnet_id = length(var.network_interface) > 0 ? null : element(
    distinct(compact(concat([var.ec2_subnets_id], var.ec2_subnets_ids))),
    count.index,
  )
  key_name                    = var.key_name
  monitoring                  = var.monitoring
  iam_instance_profile        = var.iam_instance_profile
  vpc_security_group_ids      = var.vpc_security_group_ids
  associate_public_ip_address = var.associate_public_ip_address
  ebs_optimized               = var.ebs_optimized
  ...

虽然“ami_ids”没有声明值(即 null),但我收到以下错误。

Error: Invalid index

  on ../../modules/ec2/main.tf line 23, in resource "aws_instance" "ec2":
  23:   ami           = var.ami_ids == [""] ? var.ami_id : var.ami_ids[count.index]
    |----------------
    | count.index is 1
    | var.ami_ids is list of string with 1 element

The given key does not identify an element in this collection value.

Releasing state lock. This may take a few moments...

有人可以在这里帮助我以更好的方式做到这一点。

谢谢

【问题讨论】:

【参考方案1】:

您的条件 var.ami_ids == [""] 将始终为false。这意味着无论如何var.ami_ids[count.index]都会执行。

如果你真的想使用这样的条件应该是:

var.ami_ids == tolist([""])

或者将您的变量更改为:'

variable "ami_ids" 
  description = "List of IDs of AMI to use for the instance"
  type        = list(string)
  default     = []

条件使用:

length(var.ami_ids) == 0

【讨论】:

以上是关于Terraform 中的可选变量在值为 null 时不会被忽略的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS 表单。 JSON中的可选属性[重复]

TypeScript 中的可选参数可以为空吗?

mysql 在值为null的字段插入数据!

PyTorch c++ 扩展中的可选张量

Oracle 10g 中的可选条件

Ansible Playbook 中的可选变量覆盖