Terraform 0.11:无法将动态安全组添加到 aws 实例

Posted

技术标签:

【中文标题】Terraform 0.11:无法将动态安全组添加到 aws 实例【英文标题】:Terraform 0.11: Not able to add dynamic security group to aws instance 【发布时间】:2021-11-30 06:05:17 【问题描述】:

在 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))"

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

【问题讨论】:

0.11 非常非常老了。最好升级,因为你会遇到越来越多的问题 @Marcin,正在筹备中。 【参考方案1】:

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 获得预期结果,需要分两个阶段应用此配置,以便 Terraform 可以在评估 aws_instance.instance 之前知道 aws_security_group.secGrp_1.id 的值:

    terraform apply -target=aws_security_group.secGrp_1 仅应用该资源及其依赖的其他资源。 然后只需 terraform apply 即可应用其他所有内容,包括 aws_instance.instance

【讨论】:

感谢您的回复。不知何故,这种格式 ["$list(aws_security_group.secGrp_1.id, var.secGrp_2)"] (添加方括号)起作用了。

以上是关于Terraform 0.11:无法将动态安全组添加到 aws 实例的主要内容,如果未能解决你的问题,请参考以下文章

使用动态块作为安全组入口规则的 Terraform 问题

通过 Terraform 添加 AWS 安全组时出现问题

使用 terraform 将 EC2 自己的 IP 添加为入站规则

无法与我的 EC2 实例建立 Internet 连接 [使用 terraform 部署,并为 ACL、安全组、Internet GW 打开了 80 个 http 端口]

Lambda 安全组删除挂起且无法在 AWS 控制台中删除

Terraform 0.11:aws_lambda_function 中的条件 vpc_config