3

这是我成功的摘录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作为内部模块导入的资源的一部分。我打算通过变量传递安全组 ID 列表,security_groups以便在资源创建期间将其映射到vpc_security_group_ids. 但是,按照上述计划,我看不到它是如何成功映射的。

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

谢谢,

4

1 回答 1

0

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

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

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

在您的情况下,您似乎以整个列表最终未知security_groups的方式构建了此值。一个未知的整个列表通常表示我们不知道列表的长度,因为如果我们知道列表的长度,那么它将是一个包含未知值的已知列表,可能像这样:

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

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

例如,如果您使用带有countset 的单个资源创建一组对象,则该length(...)资源的结果(如length(aws_instance.example))将始终是已知值,因为count在计划期间必须始终知道。结果,其他派生操作(例如)aws_instance.example[*].id可以生成包含未知值的已知列表,因此即使值本身未知,您仍然可以验证您是否拥有预期的元素数量。

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

于 2021-04-12T18:27:51.203 回答