【问题标题】:Terraform list element out of bounds?Terraform列表元素超出范围?
【发布时间】:2018-12-22 06:13:19
【问题描述】:

来自 Terraform 文档:

element(list, index) - 从给定索引处的列表中返回单个元素。如果索引大于元素的数量,此函数将使用标准的 mod 算法进行换行。

使用 mod 包装的充分理由是什么?在我看来,这种行为可能是导致很多头痛的原因。

在我的脑海中,我只记得另外两种处理访问越界元素的方法:

  • Python/Ruby:返回无/无
  • Java/JS/Ruby:引发错误

我已经习惯了它们,以至于它们似乎很有意义,您要么一无所获,要么出现错误,但为什么您会期望在列表中获得 k mod n 元素?如果您是实施者,您将如何证明这种行为选择的合理性。

【问题讨论】:

    标签: indexing indexoutofboundsexception terraform


    【解决方案1】:

    这是一个必须自己完成 mod 的捷径,但在遍历一个短列表时很有用,例如您想要放置多个实例的子网数量或可用区。

    这是一种很常见的模式,出现在aws_subnet_ids data source docs

    data "aws_subnet_ids" "private" {
      vpc_id = "${var.vpc_id}"
      tags {
        Tier = "Private"
      }
    }
    
    resource "aws_instance" "app" {
      count         = 6
      ami           = "${var.ami}"
      instance_type = "t2.micro"
      subnet_id     = "${element(data.aws_subnet_ids.private.ids, count.index)}"
    }
    

    如果您改用slice operator,则只要您的实例多于数据源返回的子网,就会出现索引越界异常。

    【讨论】:

      猜你喜欢
      • 2013-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 2018-10-31
      • 2015-03-03
      • 2014-06-13
      相关资源
      最近更新 更多