Spec-Zone.ru › OpenTofu 1.12

Поведение ресурсов

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

Настройка жизненного цикла​

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

    Во время замены не запускаются обработчики подготовки к уничтожению этого ресурса, если для create_before_destroy задано значение true. Дополнительные сведения приведены в обсуждении GitHub № 13549.

  • enabled (bool) — определяет, создаётся ли ресурс и управляется ли он OpenTofu. Если задано значение false, ресурс исключается из конфигурации, как если бы его не существовало, а любой существующий объект инфраструктуры уничтожается. При значении true (по умолчанию) ресурс работает в обычном режиме.

    Дополнительные сведения см. в разделе метааргумент enabled.

  • prevent_destroy (bool) — если для этого метааргумента задано значение true, OpenTofu выдаст ошибку и отклонит любой план, который приведёт к уничтожению объекта инфраструктуры, связанного с ресурсом, пока этот аргумент присутствует в конфигурации.

    Это можно использовать как меру защиты от случайной замены объектов, воссоздание которых может обойтись дорого, например экземпляров баз данных. Однако это сделает невозможным применение некоторых изменений конфигурации и не позволит использовать команду tofu destroy после создания таких объектов, поэтому этот параметр следует использовать с осторожностью.

    Поскольку для активации защиты этот аргумент должен присутствовать в конфигурации, такая настройка не может предотвратить уничтожение удалённого объекта, если блок resource полностью удалён из конфигурации. В этом случае настройка prevent_destroy удаляется вместе с блоком, и OpenTofu разрешит выполнить операцию уничтожения.

    Если вы хотите сохранить объект инфраструктуры даже после удаления блока resource из конфигурации, рассмотрите возможность использовать вместо этого аргумент destroy, описанный ниже. Обратите внимание: если задать destroy = false, OpenTofu преобразует действия destroy в разновидность действия forget, и prevent_destroy не будет иметь эффекта.

  • destroy (bool) — по умолчанию, если ресурс удалён из конфигурации, требует замены или явно уничтожается с помощью команды tofu destroy, OpenTofu уничтожает соответствующий объект инфраструктуры. Если задать для этого метааргумента значение false, поведение изменится: OpenTofu «забудет» экземпляр ресурса, удалив его из состояния, но не уничтожив сам объект инфраструктуры.

    Примечание

    Аргумент lifecycle.destroy принимает только постоянные логические значения (true или false).

    Если ресурс с destroy = false удалён из конфигурации или требует замены, OpenTofu запланирует его забывание, а не уничтожение. Ресурс будет удалён из файла состояния, но сам объект инфраструктуры останется без изменений у вашего облачного провайдера или в другой удалённой системе. Если ресурс требует замены, OpenTofu затем создаст новый экземпляр ресурса согласно текущей конфигурации.

    Это полезно, если вы хотите оставить ресурс в конфигурации, но изменить поведение при его уничтожении. В неполный список случаев использования входят:

    • Сохранение критически важных ресурсов или ресурсов, необходимых для соблюдения требований, даже при уничтожении остальной среды, без необходимости предварительно удалять их из конфигурации вручную. Это позволяет расширить автоматизацию с помощью проверяемых изменений конфигурации.
    • Сохранение старых экземпляров ресурсов при замене ресурсов или обновлении инфраструктуры, чтобы избежать простоя или потери данных. Это упрощает и ускоряет возможный откат.
    • Некоторые экземпляры ресурсов невозможно или нецелесообразно уничтожать из-за внешних зависимостей или ограничений.

    Обратите внимание: этот аргумент сохраняется в состоянии. После того как вы зададите и примените destroy = false для ресурса, OpenTofu не будет планировать уничтожение ресурса, пока вы явно не измените значение обратно на true или не удалите параметр из соответствующего блока конфигурации ресурса. OpenTofu действует осторожно и избегает уничтожения ресурсов, для экземпляров которых в последней применённой конфигурации было указано destroy = false. Если вы используете ресурсы с одним экземпляром (без count или for_each), этот атрибут можно переопределить в состоянии, явно указав блок removed для экземпляра ресурса с параметром destroy = true.

    Примечание

    Этот аргумент также можно использовать в блоках removed, чтобы указать, следует ли уничтожать ресурсы или забывать о них при их явном удалении из-под управления OpenTofu. В обоих случаях поведение одинаково. Обычно для удаления ресурсов из конфигураций при рефакторинге следует использовать блоки removed. Используйте аргумент жизненного цикла destroy, если нужно управлять поведением при уничтожении ресурсов, которые по-прежнему присутствуют в конфигурации.

    Аргумент destroy также применяется при использовании команды tofu destroy. Ресурсы с destroy = false будут забыты, а не уничтожены, и команда завершится с ненулевым кодом состояния, указывающим, что некоторые ресурсы удалены не полностью. Дополнительные сведения см. в документации по команде tofu destroy.

    Предупреждение

    После того как ресурс забыт (удалён из состояния), OpenTofu перестаёт отслеживать его. Если позже вы снова добавите ресурс в конфигурацию с тем же адресом, OpenTofu попытается создать новый ресурс, что может завершиться ошибкой, если объект инфраструктуры всё ещё существует. Возможно, потребуется импортировать существующий ресурс или использовать другой адрес ресурса.

  • ignore_changes (список имён атрибутов) — по умолчанию OpenTofu обнаруживает любые отличия текущих параметров реального объекта инфраструктуры от конфигурации и планирует обновить удалённый объект, чтобы привести его в соответствие с конфигурацией.

    Возможность ignore_changes предназначена для ресурсов, созданных со ссылками на данные, которые могут измениться в будущем, но эти изменения не должны влиять на ресурс после его создания. В некоторых редких случаях параметры удалённого объекта изменяются процессами вне 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.12/language/resources/behavior/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API