Метааргумент lifecycle
На странице Поведение ресурсов описан общий жизненный цикл ресурсов. Некоторые детали этого поведения можно настроить с помощью специального вложенного блока lifecycle внутри тела блока ресурса:
resource "azurerm_resource_group" "example" {
# ...
lifecycle {
create_before_destroy = true
}
}Синтаксис и аргументы
lifecycle — это вложенный блок, который может находиться внутри блока ресурса. Блок lifecycle и его содержимое — метааргументы, доступные для всех блоков resource независимо от их типа.
В блоке lifecycle доступны аргументы create_before_destroy, prevent_destroy, ignore_changes и replace_triggered_by.
-
create_before_destroy(bool) — по умолчанию, если OpenTofu необходимо изменить аргумент ресурса, который нельзя обновить на месте из-за ограничений удалённого API, OpenTofu вместо этого уничтожает существующий объект, а затем создаёт новый объект взамен с новыми аргументами, заданными в конфигурации.Метааргумент
create_before_destroyменяет это поведение: новый объект взамен создаётся сначала, а предыдущий объект уничтожается после создания замены.Это поведение необходимо включать явно, поскольку для многих типов удалённых объектов требуются уникальные имена или существуют другие ограничения, которые необходимо учитывать, чтобы новый и старый объекты могли существовать одновременно. Например, некоторые типы ресурсов предоставляют специальные параметры для добавления случайного суффикса к имени каждого объекта во избежание конфликтов. Интерфейс командной строки OpenTofu не может автоматически включить такие возможности, поэтому перед использованием
create_before_destroyдля конкретного типа ресурса необходимо понимать связанные с ним ограничения.Обратите внимание, что OpenTofu распространяет и применяет поведение метаатрибута
create_before_destroyко всем зависимостям ресурса. Например, если для ресурса A включён параметрcreate_before_destroy, а для ресурса B — нет, но ресурс A зависит от ресурса B, OpenTofu по умолчанию неявно включаетcreate_before_destroyдля ресурса B и сохраняет это в файле состояния. Нельзя переопределитьcreate_before_destroyнаfalseдля ресурса B, поскольку это привело бы к циклическим зависимостям в графе.Провиженеры уничтожения этого ресурса не запускаются, если для
create_before_destroyзадано значениеtrue. Подробнее см. в этой задаче на GitHub. -
prevent_destroy(bool) — если для этого метааргумента задано значениеtrue, OpenTofu выдаст ошибку и отклонит любой план, который приведёт к уничтожению инфраструктурного объекта, связанного с ресурсом, пока этот аргумент присутствует в конфигурации.Это можно использовать в качестве меры защиты от случайной замены объектов, воссоздание которых может быть дорогостоящим, например экземпляров баз данных. Однако это сделает невозможным применение некоторых изменений конфигурации и не позволит использовать команду
tofu destroyпосле создания таких объектов, поэтому этот параметр следует использовать экономно.Поскольку для применения защиты этот аргумент должен присутствовать в конфигурации, обратите внимание: эта настройка не предотвращает уничтожение удалённого объекта, если блок
resourceполностью удалить из конфигурации. В этом случае настройкаprevent_destroyбудет удалена вместе с блоком, и OpenTofu разрешит выполнить операцию уничтожения. -
ignore_changes(список имён атрибутов) — по умолчанию OpenTofu обнаруживает любые отличия текущих настроек реального инфраструктурного объекта от конфигурации и планирует обновление удалённого объекта для приведения его в соответствие с конфигурацией.Функция
ignore_changesпредназначена для случаев, когда ресурс создаётся со ссылками на данные, которые могут измениться в будущем, но не должны влиять на этот ресурс после его создания. В редких случаях настройки удалённого объекта изменяются процессами, не связанными с OpenTofu, после чего OpenTofu пытается «исправить» их при следующем запуске. Чтобы OpenTofu мог совместно с отдельным процессом управлять одним объектом, метааргументignore_changesуказывает атрибуты ресурса, которые OpenTofu следует игнорировать при планировании обновлений связанного удалённого объекта.Аргументы, соответствующие указанным именам атрибутов, учитываются при планировании операции создания, но игнорируются при планировании обновления. Аргументы задаются относительными адресами атрибутов ресурса. На элементы map и списка можно ссылаться с помощью индексной нотации, например
tags["Name"]иlist[0]соответственно.Блок кода resource "aws_instance" "example" { # ... lifecycle { ignore_changes = [ # Ignore changes to tags, e.g. because a management agent # updates these based on some ruleset managed elsewhere. tags, ] } }Вместо списка можно использовать специальное ключевое слово
all, чтобы указать OpenTofu игнорировать все атрибуты. Это означает, что OpenTofu сможет создавать и уничтожать удалённый объект, но никогда не будет предлагать его обновление.Игнорировать можно только атрибуты, определённые типом ресурса.
ignore_changesнельзя применять к самому себе или к другим метааргументам. -
replace_triggered_by(список ссылок на ресурсы или атрибуты) — заменяет ресурс при изменении любого из указанных элементов. Укажите список выражений со ссылками на управляемые ресурсы, экземпляры или атрибуты экземпляров. Если использовать этот аргумент в ресурсе, для которого заданcountилиfor_each, в выражении можно использоватьcount.indexилиeach.key, чтобы сослаться на конкретные экземпляры других ресурсов, настроенных с тем же параметром count или коллекцией.Ссылки приводят к замене в следующих случаях:
- Если ссылка ведёт на ресурс с несколькими экземплярами, план обновления или замены любого экземпляра приведёт к замене.
- Если ссылка ведёт на один экземпляр ресурса, план обновления или замены этого экземпляра приведёт к замене.
- Если ссылка ведёт на один атрибут экземпляра ресурса, любое изменение значения атрибута приведёт к замене.
В выражениях
replace_triggered_byможно ссылаться только на управляемые ресурсы. Благодаря этому такие выражения можно изменять, не вызывая замену.Блок кода resource "aws_appautoscaling_target" "ecs_target" { # ... lifecycle { replace_triggered_by = [ # Replace `aws_appautoscaling_target` each time this instance of # the `aws_ecs_service` is replaced. aws_ecs_service.svc.id ] } }Для
replace_triggered_byдопускаются только адреса ресурсов, поскольку решение зависит от запланированных действий для всех указанных ресурсов. Простые значения, такие как локальные значения или входные переменные, не имеют собственных запланированных действий, но с ними можно работать по аналогии с ресурсами, используя тип ресурсаterraform_data.
Проверки пользовательских условий
В блоке lifecycle можно добавить блоки precondition и postcondition, чтобы задать предположения и гарантии относительно работы ресурсов и источников данных. В следующем примере создаётся предусловие, проверяющее правильность настройки AMI.
resource "aws_instance" "example" {
instance_type = "t2.micro"
ami = "ami-abc123"
lifecycle {
# The AMI ID must refer to an AMI that contains an operating system
# for the `x86_64` architecture.
precondition {
condition = data.aws_ami.example.architecture == "x86_64"
error_message = "The selected AMI must be for the x86_64 architecture."
}
}
}Пользовательские условия помогают зафиксировать предположения, чтобы будущим сопровождающим было проще понять замысел и принципы проектирования конфигурации. Они также позволяют раньше и в контексте получать полезную информацию об ошибках, помогая пользователям быстрее диагностировать проблемы в конфигурациях.
Подробнее см. в разделе Пользовательские условия.
Только литеральные значения
Все настройки lifecycle влияют на построение и обход графа зависимостей OpenTofu. Поэтому можно использовать только литеральные значения: обработка происходит слишком рано для вычисления произвольных выражений.
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/lifecycle/