Метааргумент depends_on
Используйте метааргумент depends_on для обработки скрытых зависимостей от ресурсов или модулей, которые OpenTofu не может определить автоматически. Вам нужно явно указывать зависимость только в том случае, если ресурс или модуль зависит от поведения другого ресурса, но не обращается к его данным в аргументах.
Последствия для обработки и планирования
Метааргумент depends_on указывает OpenTofu завершить все действия с объектом-зависимостью (включая действия чтения), прежде чем выполнять действия с объектом, объявляющим зависимость. Если объектом-зависимостью является целый модуль, depends_on влияет на порядок обработки OpenTofu всех ресурсов и источников данных, связанных с этим модулем. Подробнее см. в разделах Зависимости ресурсов и Зависимости источников данных.
Используйте depends_on только в крайнем случае, поскольку это может привести к тому, что OpenTofu будет составлять более консервативные планы, заменяя больше ресурсов, чем необходимо. Например, OpenTofu может считать больше значений неизвестными («известно после применения»), поскольку не может точно определить, какие изменения произойдут в вышестоящем объекте. Это особенно вероятно, если использовать depends_on для модулей.
Вместо depends_on мы рекомендуем по возможности использовать ссылки на выражения, чтобы задавать зависимости. Ссылки на выражения позволяют OpenTofu определить, от какого значения зависит ссылка, и избежать планирования изменений, если это конкретное значение не изменилось, даже если для других частей вышестоящего объекта запланированы изменения.
Использование
Метааргумент depends_on можно использовать в блоках module и во всех блоках resource независимо от типа ресурса. Для него требуется список ссылок на другие ресурсы или дочерние модули в том же вызывающем модуле. Этот список не может содержать произвольные выражения, поскольку значение depends_on должно быть известно до того, как OpenTofu определит взаимосвязи ресурсов, а значит, и до того, как он сможет безопасно вычислять выражения.
Мы рекомендуем всегда добавлять комментарий с объяснением необходимости использования depends_on. В следующем примере depends_on используется для обработки «скрытой» зависимости от aws_iam_instance_profile.example.
resource "aws_iam_role" "example" {
name = "example"
# assume_role_policy is omitted for brevity in this example. Refer to the
# documentation for aws_iam_role for a complete example.
assume_role_policy = "..."
}
resource "aws_iam_instance_profile" "example" {
# Because this expression refers to the role, OpenTofu can infer
# automatically that the role must be created first.
role = aws_iam_role.example.name
}
resource "aws_iam_role_policy" "example" {
name = "example"
role = aws_iam_role.example.name
policy = jsonencode({
"Statement" = [{
# This policy allows software running on the EC2 instance to
# access the S3 API.
"Action" = "s3:*",
"Effect" = "Allow",
}],
})
}
resource "aws_instance" "example" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
# OpenTofu can infer from this that the instance profile must
# be created before the EC2 instance.
iam_instance_profile = aws_iam_instance_profile.example
# However, if software running in this EC2 instance needs access
# to the S3 API in order to boot properly, there is also a "hidden"
# dependency on the aws_iam_role_policy that OpenTofu cannot
# automatically infer, so it must be declared explicitly:
depends_on = [
aws_iam_role_policy.example
]
}
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/meta-arguments/depends_on/