用count创建的Terraform:depends_on资源

时间:2020-02-18 08:09:54

标签: terraform terraform-provider-aws

我用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创建的,因此我无法在此处静态指定名称

1 个答案:

答案 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]

countfor_eachdepends_on都没有任何区别:Terraform中资源之间的依赖性始终是针对整个resourcedata块,而不是针对从它们创建的单个实例。因此,在您的情况下,如果需要显式依赖NAT网关(不是必需的),则无论该资源上是否设置了count,您都可以用相同的方式编写它:

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