Я использую terraform, чтобы развернуть Aws-DMS. Чтобы развернуть DMS, нам нужны группы подсетей, задача репликации dms, конечные точки dms, экземпляр репликации dms. Я все настроил, используя документацию по терраформу. У меня вопрос: как terraform узнает, какую задачу нужно выполнить первой, чтобы активировать другие задачи зависимостей? Нужно ли нам объявить его где-нибудь в терраформе или терраформ достаточно умен, чтобы работать соответствующим образом?
Как terraform узнает, какой ресурс следует запустить первым, чтобы развернуть инфраструктуру?
Ответы (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 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]
}
Для получения дополнительной информации о зависимостях ресурсов в Terraform см. Зависимости ресурсов в документации Terraform.
Terraform автоматически создаст ресурсы в том порядке, в котором могут быть выполнены все зависимости.
Например: если вы установите идентификатор группы безопасности в определении DMS как "${aws_security_group.my_sg.id}"
, Terraform распознает эту зависимость и создаст группу безопасности до ресурса DMS.