Terraform - 在资源调用之前或期间是本地 运行

Terraform - is local ran before or during the resource call

对于terraform,资源,本地运行是在调用资源之后还是之前?

原因是下面代码中我的local是运行的时候,aws_vpn_connection.VPN-CONN里面的资源还没有全部准备好,所以我的tga_vpn是不完整的,从而, 并非所有资源都在 aws_ec2_transit_gateway_route_table_propagation 资源

中创建

我必须再次 运行 terraform 申请以添加剩余的资源。

locals {
  tga_vpn = flatten([
    for vpn_conn in aws_vpn_connection.VPN-CONN: 
    .
    . 
])
}
resource "aws_ec2_transit_gateway_route_table_propagation" "TGW-RT-PROP" {
  count = length(local.tga_vpn)
  something1 = lookup(local.tga_vpn[count.index], "id1", null)
  something2 = lookup(local.tga_vpn[count.index], "id2", null)
} 

我还在 aws_ec2_transit_gateway_route_table_propagation 资源中添加了对 aws_vpn_connection 的依赖,但这没有帮助。

或者有没有办法为本地添加 depends_on

谢谢

如果您大致知道 aws_vpn_connection 在创建后需要多长时间才能完全初始化并准备好使用,您可以使用 time_sleep 资源来延迟执行 aws_ec2_transit_gateway_route_table_propagation.

例如,假设需要 30 秒,您可以这样做:

resource "time_sleep" "wait_30_seconds" {
  depends_on = [aws_vpn_connection.VPN-CONN]

  create_duration = "30s"
}

resource "aws_ec2_transit_gateway_route_table_propagation" "TGW-RT-PROP" {
  count = length(local.tga_vpn)
  something1 = lookup(local.tga_vpn[count.index], "id1", null)
  something2 = lookup(local.tga_vpn[count.index], "id2", null)

  depends_on = [time_sleep.wait_30_seconds]
} 

在 Terraform 语言本身中,每个本地值本身就是依赖关系图中的一个节点,因此您的资源对 local.tga_vpn 的引用已经告诉 Terraform aws_ec2_transit_gateway_route_table_propagation.TGW-RT-PROP 依赖于 [=10= 的所有内容] 取决于。同样,本地值指的是 aws_vpn_connection.VPN-CONN,因此这里的依赖链是:

  • aws_vpn_connection.VPN-CONN 可能有一些其他依赖项,但我们在您的部分示例中看不到那些
  • local.tga_vpn 取决于 aws_vpn_connection.VPN-CONN
  • aws_ec2_transit_gateway_route_table_propagation.TGW-RT-PROP 取决于 local.tga_vpn.

鉴于此,如果您看到 aws_ec2_transit_gateway_route_table_propagation.TGW-RT-PROP 的操作发生在 aws_vpn_connection.VPN-CONN 的操作完成之前,那么很遗憾,这表明 AWS 提供商或远程 AWS API。尽管 AWS 提供商努力解决很多情况,但 AWS API 中的某些对象是“最终一致的”,这意味着不能保证您可以编写一个新对象然后立即尝试使用它。相反,更改可能需要一些时间才能对 AWS 的所有其他部分完全可见,因为 AWS 是一个分布式系统。

在这种情况下,如果 AWS API 无法明确确定对象何时 实际 完全传播,那么不幸的是我们不得不使用变通方法例如 Marcin 描述的 time_sleep 资源类型,它实际上并没有 解决 问题,但它至少通过为远程系统提供更长的时间来减少它发生的可能性如果 Terraform 在其依赖项准备就绪时自然地立即开始处理下游对象,则可以获得一致性。