Метааргумент 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 CLI не может включить такие функции автоматически, поэтому перед использованием
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 должен игнорировать при планировании обновлений соответствующего удалённого объекта.Аргументы, соответствующие указанным именам атрибутов, учитываются при планировании операции создания, но игнорируются при планировании обновления. Аргументы задают относительный адрес атрибутов ресурса. Элементы отображений и списков можно указывать с помощью индексной нотации, например
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.10/language/meta-arguments/lifecycle/