Terraform Plan "Known after Apply" - 如何知道我的插值是否成功?

8
这是我成功的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会起作用? 在这种情况下,“应用后已知”有点50-50吗? 同样,在TF文档中没有找到任何东西,因此如果有人能指向该方向,我将不胜感激。
谢谢,

你只需要申请并希望一切顺利。就像它所说的“申请后才知道”。如果可能的话,你可以先在沙箱账户上测试一些虚拟资源,但最终还是要提交申请并观察结果。你也可以逐个申请单独的资源,而不是一次性全部申请。 - Marcin
小澄清:您是否也从 Terraform 创建安全组?还是使用已在 Terraform 外部创建的现有资源? - Kasun Piyasena
如果您需要一个布尔值来表示您的计划输出是否为“(在应用后已知)”的插值状态,则您可能会发现这个有趣。 - Teneko
1个回答

9
在Terraform语言中,存在一种值被称为“未知”的概念,计划渲染器将其显示为(known after apply),如我们在这里看到的。
未知值起源于提供程序,它们需要响应规划请求并返回尽可能多的结果,以便基于已有信息进行预测,但将任何需要更多信息才能确定的内容标记为“未知”。
然后在Terraform语言中,您在表达式中执行任何需要知道被标记为未知值的值的操作都会导致该结果也变成未知。
在您的情况下,看起来您以某种方式构建了此security_groups值,使整个列表最终变成未知的。 整个列表是未知的通常表示我们不知道列表的长度,因为如果我们知道列表的长度,那么它将变成一个已知列表,并且其中包含未知值,可能像这样:
 ~ security_groups = [
     + (known after apply),
     + "sg-abc123",
     + (known after apply),
   ]

那么,对于你的问题,非常一般性的回答是,如果您需要或希望在计划期间知道某些内容,那么您需要仔细决定如何计算结果,以便您需要了解计划信息的位置可以看到所需的信息。有时可以通过仔细思考如何确定某些值(例如基于配置中已知的某些内容来决定列表的长度,即使列表中的某些项可能未知),来实现这一点。
例如,如果您正在使用设置count的单个资源创建一组对象,则该资源的length(...)结果,如length(aws_instance.example),将始终是已知值,因为count必须始终在规划期间得知。因此,其他派生操作,如aws_instance.example[*].id可以生成一个包含未知值的已知列表,因此即使尚未知道值,您仍然可以验证是否具有预期数量的元素。
有一些情况下,只要你想一次应用所有更改,就会出现无法回答的情况:如果Terraform不知道某些内容,它就无法向您展示这些内容。在这种情况下,如果了解特定值的这些结果是您流程的重要部分,那么您可能决定将配置拆分为两个单独的配置,您将按顺序分别应用这些配置。然后,您可以使用数据源允许第二个配置查找第一个配置创建的任何必要对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接