Terraform 计划“应用后已知” - 如何知道我的插值是不是成功?

Posted

技术标签:

【中文标题】Terraform 计划“应用后已知” - 如何知道我的插值是不是成功?【英文标题】:Terraform Plan "Known after Apply" - How to know if my interpolation has succeeded?Terraform 计划“应用后已知” - 如何知道我的插值是否成功? 【发布时间】:2021-07-06 17:41:36 【问题描述】:

这是我成功terraform plan的摘录

 ~ primary_network_interface_id = "eni-XXXXXXXXXXXXX -> (known after apply)
   ~ private_dns                  = "shshshshshshshshhs" -> (known after apply)
   ~ private_ip                   = "XXXXXXXXXXXXXXXXXX" -> (known after apply)
   + public_dns                   = (known after apply)
   + public_ip                    = (known after apply)
   ~ secondary_private_ips        = [] -> (known after apply)
   ~ security_groups              = [] -> (known after apply)

以上是作为内部模块导入的aws_instance 资源的一部分。我打算通过变量security_groups 传递安全组ID 列表,以便在资源创建期间,它将映射到vpc_security_group_ids。但是,按照上面的计划,我看不到它是如何成功映射的。

我的问题是 - 我怎么知道apply 会起作用? Known after apply 在这种情况下是 50-50?此外,没有设法在 TF 文档中发现任何内容,因此如果有任何内容,如果有人能指出我的方向,我将不胜感激。

谢谢,

【问题讨论】:

您只需申请并希望获得最好的结果。正如它所说的“应用后知道”。如果可能的话,您可以先在沙盒帐户中的一些虚拟资源上运行此操作以进行测试,但最终您必须申请并查看效果如何。您也可以一个一个地申请individual resources,而不是一次申请。 小澄清:您是否也从 terraform 创建安全组?或者您使用在 terraform 之外创建的现有资源? 【参考方案1】:

在 Terraform 语言中,有一种值“未知”的感觉,正如我们在此处看到的那样,计划渲染器将其显示为 (known after apply)

未知值源自提供者,它们应该通过返回尽可能多的结果来响应计划请求,因为他们能够根据现有信息进行预测,但将没有更多信息他们无法知道的任何内容标记为“未知”。

然后在 Terraform 语言中,您在表达式中执行的任何操作,如果结果需要知道标记为未知的值,则会导致该结果反过来也是未知的。

在您的情况下,您构建这个security_groups 值的方式似乎是列表作为一个整体 最终是未知的。整个列表是未知的通常表示我们不知道列表的长度,因为如果我们知道列表的长度,那么它将是一个 known 列表,其中包含 unknown 值它,也许是这样的:

 ~ security_groups = [
     + (known after apply),
     + "sg-abc123",
     + (known after apply),
   ]

那么,对于您的问题,非常笼统的回答是,如果您需要或希望在计划时知道某些事情,那么您需要仔细决定如何计算该结果,以便您了解计划所需的信息可以在您需要的地方可见。有时可以通过仔细考虑如何确定某些值来做到这一点,例如根据配置中已知的内容来确定列表的长度,即使列表中的某些项目可能不知道。

例如,如果您使用单个资源创建一组对象并设置了count,那么该资源的length(...) 结果(如length(aws_instance.example))将始终是已知值,因为count 必须始终在规划时就知道了。因此,像aws_instance.example[*].id 这样的其他派生操作可以生成一个包含未知值的已知列表,因此即使这些值本身还不知道,您仍然可以验证您是否拥有预期的元素数量。

在某些情况下没有答案,只要您想一步应用所有更改:Terraform 无法向您展示它不知道的内容。在这种情况下,如果知道特定值的这些结果是您流程的重要部分,那么您可能决定将配置拆分为两个单独的配置,您将按顺序分别应用它们。然后,您可以使用data sources 允许第二个配置找到由第一个配置创建的任何必要对象。

【讨论】:

以上是关于Terraform 计划“应用后已知” - 如何知道我的插值是不是成功?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 gitlab 中删除 terraform 资源?

使用 terraform 在 kubernetes 上计划重启

有啥方法可以参考 terraform 中的旧计划吗?

执行 Terraform 执行计划时出现凭据失败

如何使用 Terraform 为 Azure 资源创建警报

Terraform 定义的任务角色对于 ECS 计划任务无法正常工作