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 может быть потенциально создана до того, как ее роль получит необходимый доступ, что приведет к ошибкам, если функция попытается предпринять какие-либо действия до назначения политики.
Чтобы решить эту проблему, мы можем использовать 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.