Terraform 地形:取决于使用count创建的资源

Terraform 地形:取决于使用count创建的资源,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我已经创建了一组具有count resource "aws_nat_gateway" "nat_gateway_ec1_dev" { count = 3 } 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 DEP

我已经创建了一组具有
count

resource "aws_nat_gateway" "nat_gateway_ec1_dev" {
  count         = 3

}
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
    ]

}
我想在创建路由表时将其作为依赖资源,我在其中也使用了
count

resource "aws_nat_gateway" "nat_gateway_ec1_dev" {
  count         = 3

}
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_表资源中添加NAT网关依赖项??由于这两个资源都是使用count创建的,因此我无法在此处静态指定名称

我们通常不需要使用
dependens\u 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网关创建完成后才能开始创建路由表


dependens\u on
适用于对象之间数据流不足的更复杂情况,因为最终结果取决于远程API暗示的一些副作用,而不是Terraform中明确的副作用。这种情况的一个示例是,对象在单独的步骤中应用访问策略(例如使用S3 bucket和关联的bucket策略)之前不可用:

resource "aws_s3_bucket" "example" {
  # ...
}

resource "aws_s3_bucket_policy" "example" {
  bucket = aws_s3_bucket.example.bucket
  policy = # ...
}
综上所述,Terraform可以理解,它必须在创建策略之前创建bucket,但是,如果配置中的其他地方也在使用该S3 bucket,那么它可能需要声明对策略的显式依赖,以确保在尝试该操作之前,必要的访问规则将生效:

  # Service cannot access the data from the S3 bucket
  # until the policy has been activated.
  depends_on = [aws_s3_bucket_policy.example]
计数
对于每个
都没有任何区别,因为
依赖于
:地形中资源之间的依赖关系总是针对整个
资源
数据
块,而不是针对从它们创建的单个实例。因此,在您的情况下,如果需要对NAT网关的显式依赖(而不是),那么您将以相同的方式编写它,而不管在该资源上设置了
count

  # Not actually needed, but included for the sake of example.
  depends_on = [aws_nat_gateway.nat_gateway_ec1_dev]

为什么在这里设置
取决于
,而不是在设置使用NAT网关的路由时让Terraform自动解决这个问题?这个例子可能是好的,也可能不是好的,但问题是有效的;在更复杂的计划中,有时需要手动表示依赖关系。正如您所述,我已使用
路由
修改了脚本,但我收到一个错误
aws\u nat\u gateway.nat\u gateway\u ics\u ec1\u dev在
地形计划
上是空元组。这是因为NAT网关创建错误吗??