对于terraform,resource,local是在调用资源之后还是之前运行的?
原因是,当我的本地在下面的代码中运行时,并不是aws_vpn_connection.VPN-CONN
中的所有资源都准备好了,所以我的tga_vpn
并不完整,因此,并不是所有资源都在aws_ec2_transit_gateway_route_table_propagation
资源中创建
我必须再次运行地形应用程序来添加剩余的资源。
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
?
谢谢
在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没有提供明确确定对象何时实际上被完全触发的方法,那么不幸的是,我们被迫使用诸如Marcin描述的time_sleep
资源类型之类的解决方法,这实际上并不能解决问题,但与Terraform在其依赖关系就绪后立即自然开始处理下游对象相比,它至少通过给远程系统更长的时间来实现一致性,使问题不太可能发生。
如果您大致知道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]
}