我用count
创建了一组NAT网关
resource "aws_nat_gateway" "nat_gateway_ec1_dev" {
count = 3
}
我想在创建路由表时将此作为依赖资源,其中我也使用count
resource "aws_route_table" "route_table_ics_ec1_dev_private" {
vpc_id = module.vpc_dev.vpc_id
count = 3
depends_on = [
##HOW TO ADD NAT GATEWAY DEPENDCIE HERE
]
}
我的问题是如何在route_table资源中添加NAT网关依赖项?由于这两个资源都是以count创建的,因此我无法在此处静态指定名称
答案 0 :(得分:0)
我们通常不需要使用depends_on
,因为在大多数情况下,对象之间的数据依赖关系隐含了对象之间的依赖关系。在这种情况下,当您编写描述到NAT网关的路由的route
块时,这将变为事实:
resource "aws_route_table" "route_table_ics_ec1_dev_private" {
vpc_id = module.vpc_dev.vpc_id
count = 3
route {
cidr_block = "0.0.0.0/0"
nat_gateway_id = aws_nat_gateway.nat_gateway_ec1_dev[count.index].id
}
}
由于该路由的配置取决于NAT网关的ID,因此Terraform可以看到它必须等到NAT网关创建之后才能开始创建路由表。
depends_on
适用于对象之间的数据流不足的更复杂情况,因为最终结果取决于远程API隐含的某些副作用,而不是Terraform中的显式副作用。这种情况的一个示例是,直到在单独的步骤中将访问策略应用于对象之前,该对象才变得可用,例如使用S3存储桶和关联的存储桶策略:
resource "aws_s3_bucket" "example" {
# ...
}
resource "aws_s3_bucket_policy" "example" {
bucket = aws_s3_bucket.example.bucket
policy = # ...
}
在上面,Terraform可以理解,它必须在创建策略之前创建存储桶,但是如果配置中其他位置的某些内容也正在使用该S3存储桶,则可能有必要声明对策略的显式依赖,以便在尝试该操作之前,请确保必要的访问规则将生效:
# Service cannot access the data from the S3 bucket
# until the policy has been activated.
depends_on = [aws_s3_bucket_policy.example]
count
和for_each
与depends_on
都没有任何区别:Terraform中资源之间的依赖性始终是针对整个resource
和data
块,而不是针对从它们创建的单个实例。因此,在您的情况下,如果需要显式依赖NAT网关(不是必需的),则无论该资源上是否设置了count
,您都可以用相同的方式编写它:
# Not actually needed, but included for the sake of example.
depends_on = [aws_nat_gateway.nat_gateway_ec1_dev]