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

ha9*_*3ar 9 terraform terraform-provider-aws terraform-aws-modules

这是我成功的摘录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)
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢,

Mar*_*ins 11

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

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

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

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

 ~ security_groups = [
     + (known after apply),
     + "sg-abc123",
     + (known after apply),
   ]
Run Code Online (Sandbox Code Playgroud)

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

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

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