【问题标题】:Terraform :depends_on resource created with countTerraform :depends_on 使用计数创建的资源
【发布时间】:2020-06-02 04:58:20
【问题描述】:

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

【问题讨论】:

  • 为什么要在这里设置depends _on,而不是让 Terraform 在您设置使用 NAT 网关的路由时自动解决这个问题?
  • 这个例子可能好也可能不好,但问题是有效的;在更复杂的计划中,有时需要手动表达依赖关系。

标签: terraform terraform-provider-aws


【解决方案1】:

我们通常不需要使用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]

【讨论】:

  • 如您所说,我已使用route 修改了脚本,但在terraform plan 上出现错误aws_nat_gateway.nat_gateway_ics_ec1_dev is empty tuple。这是因为 NAT 网关创建错误吗??
猜你喜欢
  • 2021-01-21
  • 1970-01-01
  • 2020-11-18
  • 2019-05-19
  • 2020-04-28
  • 1970-01-01
  • 2022-07-24
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多