-2

在 ec2 实例模块中,我有几个安全组,一个来自变量,另一个是在模块中创建的。我有一种情况,需要在从该模块获取的 terraform 文件中添加新的安全组。

为了能够连接一个新列表,我想将现有的 format1 转换为一个我无法做到的显式列表。我怎样才能做到这一点?

resource "aws_instance" "instance" {
//...
# (current)format1: Works
vpc_security_group_ids = ["${aws_security_group.secGrp_1.id}", "${var.secGrp_2}"] 

# format2: Doesn't work
vpc_security_group_ids = "${list(aws_security_group.secGrp_1.id, var.secGrp_2)}"

# format3: Works
vpc_security_group_ids = "${list(var.secGrp_2)}"

# format3: Doesn't works
vpc_security_group_ids = "${list(tostring(aws_security_group.secGrp_1.id), var.secGrp_2)}"

Format2 失败并显示:“vpc_security_group_ids:应该是一个列表”。我怀疑 secGrp1 id 在此表示中未被识别为字符串。

Format4 失败:“调用未知函数:tostring in: ${(list(tostring(aws_security_group.secGrp_1.id), var.secGrp_2))}”

PS:我们使用的 Terraform 版本是 0.11.x

4

1 回答 1

0

Terraform v0.11 在表达式评估期间无法表示部分未知的列表。在初始创建时,aws_security_group.secGrp_1.id它将是未知的,因此将其传递给list函数将产生一个完全未知的值,该值不能用作列表参数的值。

这是 Terraform v0.12 解决的各种与表达式语言相关的问题之一。在 Terraform v0.12 中,与您的第二个等效的以下表达式应该可以工作:

  vpc_security_group_ids = [
    aws_security_group.secGrp_1.id,
    var.secGrp_2,
  ]

要使用 Terraform v0.11 获得预期的结果,需要分两个阶段应用此配置,以便 Terraformaws_security_group.secGrp_1.id在评估之前知道 的值aws_instance.instance

  1. terraform apply -target=aws_security_group.secGrp_1仅应用该资源和它所依赖的其他资源。
  2. 然后只是terraform apply应用其他所有内容,包括aws_instance.instance.
于 2021-10-12T00:52:46.593 回答