Как terraform узнает, какой ресурс следует запустить первым, чтобы развернуть инфраструктуру?

Я использую terraform, чтобы развернуть Aws-DMS. Чтобы развернуть DMS, нам нужны группы подсетей, задача репликации dms, конечные точки dms, экземпляр репликации dms. Я все настроил, используя документацию по терраформу. У меня вопрос: как terraform узнает, какую задачу нужно выполнить первой, чтобы активировать другие задачи зависимостей? Нужно ли нам объявить его где-нибудь в терраформе или терраформ достаточно умен, чтобы работать соответствующим образом?


person Roy    schedule 19.06.2019    source источник
comment
learn.hashicorp.com/terraform/getting-started/dependencies.html   -  person Matt Schuchard    schedule 19.06.2019


Ответы (2)


Terraform использует ссылки в конфигурации для определения порядка.

Рассмотрим следующий пример:

resource "aws_s3_bucket" "example" {
  bucket = "terraform-dependencies-example"
  acl    = "private"
}

resource "aws_s3_bucket_object" "example" {
  bucket  = aws_s3_bucket.example.bucket # reference to aws_s3_bucket.example
  key     = "example"
  content = "example"
}

В приведенном выше примере ресурс aws_s3_bucket_object.example содержит выражение, которое ссылается на aws_s3_bucket.example.bucket, и поэтому Terraform может сделать вывод, что aws_s3_bucket.example должен быть создан до aws_s3_bucket_object.example.


Эти неявные зависимости, созданные ссылками, являются основным способом создания упорядочения в Terraform. В некоторых редких случаях нам нужно представить зависимости, которые не могут быть выведены с помощью выражений, и поэтому только для этих исключительных обстоятельств мы можем добавить дополнительные явные зависимости с помощью мета-аргумента depends_on.

Одна из ситуаций, когда это может произойти, - это политики AWS IAM, где граф, естественным образом созданный ссылками, будет иметь следующую форму:

и aws_lambda_function, и aws_iam_role_policy зависят только от aws_iam_role

Из-за модели данных AWS IAM мы должны сначала создать роль, а затем назначить ей политику в качестве отдельного шага, но объекты, принимающие эту роль (в данном случае, например, функция AWS Lambda), принимают только ссылку на роль, а не политику. Тогда с зависимостями, неявно созданными ссылками, функция Lambda потенциально может быть создана до того, как ее роль получит необходимый доступ, что приведет к ошибкам, если функция попытается предпринять какие-либо действия до назначения политики.

Чтобы решить эту проблему, мы можем использовать depends_on в блоке ресурсов aws_lambda_function, чтобы заставить эту дополнительную зависимость и, таким образом, создать правильный порядок выполнения:

resource "aws_iam_role" "example" {
  # ...
}

resource "aws_iam_role_policy" "example" {
  # ...
}

resource "aws_lambda_function" "exmaple" {
  depends_on = [aws_iam_role_policy.example]
}

Теперь aws_lambda_function также зависит от aws_iam_role_policy


Для получения дополнительной информации о зависимостях ресурсов в Terraform см. Зависимости ресурсов в документации Terraform.

person Martin Atkins    schedule 20.06.2019
comment
Отличное объяснение, Мартин ... очень признателен за ваш ответ. Спасибо :) - person Roy; 21.06.2019

Terraform автоматически создаст ресурсы в том порядке, в котором могут быть выполнены все зависимости.

Например: если вы установите идентификатор группы безопасности в определении DMS как "${aws_security_group.my_sg.id}", Terraform распознает эту зависимость и создаст группу безопасности до ресурса DMS.

person rflume    schedule 19.06.2019