Поведение ресурсов
Блок resource объявляет, что вы хотите, чтобы определенный объект инфраструктуры существовал с заданными настройками. Если вы впервые пишете новую конфигурацию, определенные в ней ресурсы будут существовать только в конфигурации и пока не будут представлять реальные объекты инфраструктуры на целевой платформе.
Применение конфигурации OpenTofu — это процесс создания, обновления и уничтожения реальных объектов инфраструктуры, чтобы привести их настройки в соответствие с конфигурацией.
Как OpenTofu применяет конфигурацию
Когда OpenTofu создает новый объект инфраструктуры, представленный блоком resource, идентификатор этого реального объекта сохраняется в состоянии OpenTofu, что позволяет обновлять и уничтожать его в ответ на будущие изменения. Для блоков ресурсов, которым уже соответствует объект инфраструктуры в состоянии, OpenTofu сравнивает фактическую конфигурацию объекта с аргументами, указанными в конфигурации, и при необходимости обновляет объект, чтобы привести его в соответствие с конфигурацией.
Подводя итог, применение конфигурации OpenTofu позволяет:
- Создавать ресурсы, которые существуют в конфигурации, но не связаны с реальным объектом инфраструктуры в состоянии.
- Уничтожать ресурсы, которые существуют в состоянии, но больше не присутствуют в конфигурации.
-
Забывать ресурсы, которые существуют в состоянии, но больше не присутствуют в конфигурации и на которые ссылается блок
removedв конфигурации. - Обновлять на месте ресурсы, аргументы которых изменились.
- Уничтожать и создавать заново ресурсы, аргументы которых изменились, но которые нельзя обновить на месте из-за ограничений удаленного API.
Это общее поведение применяется ко всем ресурсам независимо от их типа. Значение операций создания, обновления или уничтожения ресурса различается для разных типов ресурсов, но этот стандартный набор действий является общим для всех них.
Метапараметры в блоках resource, описанные в разделах ниже, позволяют настраивать некоторые аспекты стандартного поведения ресурсов для каждого ресурса отдельно.
Доступ к атрибутам ресурсов
Выражения в модуле OpenTofu могут обращаться к информации о ресурсах в том же модуле, и вы можете использовать эту информацию для настройки других ресурсов. Используйте синтаксис <RESOURCE TYPE>.<NAME>.<ATTRIBUTE>, чтобы ссылаться на атрибут ресурса в выражении.
Помимо аргументов, указанных в конфигурации, ресурсы часто предоставляют атрибуты только для чтения с информацией, полученной из удаленного API; часто это данные, которые нельзя узнать до создания ресурса, например уникальный случайный идентификатор ресурса.
Многие провайдеры также включают источники данных — особый тип ресурсов, используемый только для поиска информации.
Список атрибутов, предоставляемых типом ресурса или источника данных, см. в его документации; обычно он приводится вторым списком после списка настраиваемых аргументов.
Дополнительные сведения о ссылках на атрибуты ресурсов в выражениях см. в разделе Выражения: ссылки на атрибуты ресурсов.
Зависимости ресурсов
Большинство ресурсов в конфигурации никак не связаны друг с другом, и OpenTofu может параллельно вносить изменения в несколько независимых ресурсов.
Однако некоторые ресурсы необходимо обрабатывать после определенных других ресурсов; иногда это связано с тем, как работает ресурс, а иногда конфигурация ресурса просто требует информацию, созданную другим ресурсом.
Большинство зависимостей ресурсов обрабатывается автоматически. OpenTofu анализирует все выражения в блоке resource, чтобы найти ссылки на другие объекты, и рассматривает эти ссылки как неявные требования к порядку при создании, обновлении или уничтожении ресурсов. Поскольку большинство ресурсов, поведение которых зависит от других ресурсов, также ссылаются на данные этих ресурсов, обычно нет необходимости вручную указывать зависимости между ресурсами.
Однако некоторые зависимости нельзя неявно определить по конфигурации. Например, если OpenTofu должен управлять политиками контроля доступа и выполнять действия, для которых эти политики должны быть заданы, возникает скрытая зависимость между политикой доступа и ресурсом, создание которого от нее зависит. В этих редких случаях можно явно указать зависимость с помощью метапараметра depends_on.
Можно также использовать аргумент жизненного цикла replace_triggered_by, чтобы добавить зависимости между в остальном независимыми ресурсами. Он заставляет OpenTofu заменить родительский ресурс при изменении указанного ресурса или его атрибута.
Настройка жизненного цикла
Блок lifecycle внутри блока resource позволяет настраивать некоторые аспекты поведения OpenTofu, связанные с экземплярами ресурса на разных этапах его жизненного цикла.
resource "example" "example" {
# ...normal resource arguments...
lifecycle {
# ...lifecycle arguments...
}
}В блоке lifecycle для управляемого ресурса поддерживаются следующие аргументы и типы вложенных блоков:
-
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 и сохраняет этот параметр в снимках состояния. Нельзя задать для ресурса B значениеfalseвместоcreate_before_destroy, поскольку это привело бы к циклическим зависимостям в графе.При замене ресурса обработчики подготовки к уничтожению для него не запускаются, если для
create_before_destroyзадано значениеtrue. Дополнительные сведения приведены в обсуждении #13549 на GitHub. -
enabled(bool) — определяет, создается ли ресурс и управляется ли он OpenTofu. Если задано значениеfalse, ресурс исключается из конфигурации, как если бы его не существовало, а любой существующий объект инфраструктуры уничтожается. При значенииtrue(по умолчанию) ресурс работает в обычном режиме.Дополнительные сведения см. в разделе метапараметр
enabled. -
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нельзя применять к самому себе или к другим метапараметрам. -
Блоки
preconditionиpostcondition, описанные в разделе Пользовательские условия. -
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.
Локальные ресурсы
Большинство типов ресурсов соответствуют типам объектов инфраструктуры, которыми управляют через удаленный сетевой API, однако существуют специализированные типы ресурсов, работающие только внутри OpenTofu: они вычисляют результаты и сохраняют их в состоянии для дальнейшего использования.
Например, существуют локальные типы ресурсов для генерации закрытых ключей, выпуска самоподписанных сертификатов TLS и даже генерации случайных идентификаторов. Хотя такие типы ресурсов часто играют более второстепенную роль, чем ресурсы для управления «реальными» объектами инфраструктуры, они могут служить связующим звеном между другими ресурсами.
Локальные ресурсы ведут себя так же, как и все остальные, но их данные существуют только в состоянии OpenTofu. «Уничтожение» такого ресурса означает лишь его удаление из состояния с отбрасыванием его данных.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/resources/behavior/