Terraform: depen_on с ресурсом, созданным с помощью count - PullRequest
0 голосов
/ 18 февраля 2020

Я создал набор шлюза NAT с count

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
    ]

}

Мой вопрос, как я могу добавить зависимости шлюза NAT в ресурс route_table ?? Поскольку оба ресурса созданы с подсчетом, я не могу статически указать здесь имя

1 Ответ

0 голосов
/ 19 февраля 2020

Обычно нам не нужно использовать depends_on, потому что в большинстве случаев зависимости между объектами подразумеваются потоком данных между ними. В этом случае это станет реальностью, когда вы напишите блок route, описывающий маршрут к шлюзу NAT:

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, 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 = # ...
}

In выше, 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]
...