【问题标题】:Terraform - is local ran before or during the resource callTerraform - 在资源调用之前或期间本地运行
【发布时间】:2023-04-01 23:41:01
【问题描述】:

对于 terraform、resource,local 是在调用资源之后还是之前运行?

原因是,当我的本地在下面的代码中运行时,aws_vpn_connection.VPN-CONN 中的所有资源都没有准备好,所以我的tga_vpn 不完整,因此,并非所有资源都在aws_ec2_transit_gateway_route_table_propagation 中创建资源

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

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?

谢谢

【问题讨论】:

    标签: amazon-web-services terraform terraform-provider-aws


    【解决方案1】:

    在 Terraform 语言本身中,每个本地值本身就是依赖关系图中的一个节点,因此您的资源对 local.tga_vpn 的引用已经告诉 Terraform aws_ec2_transit_gateway_route_table_propagation.TGW-RT-PROP 依赖于 local.tga_vpn 所依赖的所有内容。同样,本地值指的是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 无法明确确定对象何时实际上完全传播,那么不幸的是,我们不得不使用解决方法,例如 time_sleep 资源类型Marcin 描述了,这实际上并没有解决问题,但它至少可以减少远程系统实现一致性的时间,而不是如果 Terraform 只是自然地开始在下游对象在其依赖项准备就绪时立即进行。

    【讨论】:

      【解决方案2】:

      如果您大致知道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]
      } 
      
      

      【讨论】:

      • 谢谢马尔辛。尽管增加了 10 分钟的计数,我的 terraform 计划仍显示相同数量的资源创建
      • @VinitaShah 你申请了吗? TF 计划不考虑时间延迟。
      • @VinitaShah 没问题。很高兴它有帮助:-)
      猜你喜欢
      • 2019-11-27
      • 2022-07-28
      • 1970-01-01
      • 2021-09-24
      • 2019-03-07
      • 1970-01-01
      • 1970-01-01
      • 2017-09-22
      • 2019-11-14
      相关资源
      最近更新 更多