Блоки ресурсов
Ресурсы — важнейший элемент языка OpenTofu. Каждый блок ресурса описывает один или несколько объектов инфраструктуры, таких как виртуальные сети, вычислительные экземпляры или компоненты более высокого уровня, например записи DNS.
Синтаксис ресурсов
Объявления ресурсов могут включать ряд расширенных возможностей, но для начала работы необходима лишь небольшая их часть. Более сложные синтаксические возможности, например одиночные объявления ресурсов, создающие несколько похожих удалённых объектов, описаны далее на этой странице.
resource "aws_instance" "web" {
ami = "ami-a1b2c3d4"
instance_type = "t2.micro"
}Блок resource объявляет ресурс заданного типа ("aws_instance") с заданным локальным именем ("web"). Это имя используется для обращения к ресурсу из других частей того же модуля, но не имеет значения за пределами области видимости этого модуля.
Тип ресурса и его имя вместе служат идентификатором ресурса и поэтому должны быть уникальными в пределах модуля.
В теле блока (между { и }) указываются аргументы конфигурации самого ресурса. Большинство аргументов в этом разделе зависят от типа ресурса; в данном примере и ami, и instance_type — аргументы, определённые специально для типа ресурса aws_instance.
Типы ресурсов
Каждый ресурс связан с одним типом ресурса, который определяет, каким видом объекта инфраструктуры он управляет, а также какие аргументы и другие атрибуты поддерживает ресурс.
Провайдеры
Каждый тип ресурса реализуется провайдером — подключаемым модулем для OpenTofu, предоставляющим набор типов ресурсов. Обычно провайдер предоставляет ресурсы для управления одной облачной или локальной платформой инфраструктуры. Провайдеры распространяются отдельно от OpenTofu, но OpenTofu может автоматически устанавливать большинство провайдеров при инициализации рабочего каталога.
Чтобы управлять ресурсами, модуль должен указать необходимые ему провайдеры. Кроме того, большинству провайдеров требуется конфигурация для доступа к удалённым API, и корневой модуль должен предоставить эту конфигурацию.
Дополнительную информацию см. в разделах:
- Требования к провайдерам — как объявить, какие провайдеры использует модуль.
- Настройка провайдеров — как задать параметры провайдера.
Обычно OpenTofu автоматически определяет, какой провайдер использовать, по имени типа ресурса. (По соглашению имена типов ресурсов начинаются с предпочтительного локального имени их провайдера.) При использовании нескольких конфигураций провайдера (или непредпочтительных локальных имён провайдеров) необходимо использовать метааргумент provider, чтобы вручную выбрать альтернативную конфигурацию провайдера. Дополнительные сведения см. в разделе Метааргумент provider.
Аргументы ресурсов
Большинство аргументов в теле блока resource относятся к выбранному типу ресурса. В документации по типу ресурса перечислены доступные аргументы и указано, в каком формате должны быть заданы их значения.
В значениях аргументов ресурсов можно в полной мере использовать выражения и другие динамические возможности языка OpenTofu.
Также существуют некоторые метааргументы, определённые самим OpenTofu и применимые ко всем типам ресурсов. (См. раздел «Метааргументы» ниже.)
Документация по типам ресурсов
У каждого провайдера есть собственная документация с описанием типов ресурсов и их аргументов.
Большинство общедоступных провайдеров распространяются через Публичный реестр Terraform, где также размещена их документация. На странице провайдера в реестре OpenTofu можно нажать ссылку «Документация» в заголовке, чтобы просмотреть документацию. Документация провайдеров в реестре имеет версии; с помощью раскрывающегося меню версий в заголовке можно выбрать документацию нужной версии.
Список общедоступных провайдеров и их документацию можно найти в Публичном реестре Terraform.
Ранее документация провайдеров входила в основную документацию OpenTofu. Хотя здесь всё ещё может размещаться документация некоторых провайдеров, теперь главным источником документации всех общедоступных провайдеров является Публичный реестр OpenTofu.
Поведение ресурсов
Дополнительные сведения об управлении ресурсами в OpenTofu при применении конфигурации см. в разделе Поведение ресурсов.
Удаление ресурсов
Если удалить блок ресурса из конфигурации, по умолчанию OpenTofu уничтожит этот ресурс.
Однако иногда необходимо удалить ресурс из конфигурации, не уничтожая соответствующий объект инфраструктуры. В таких случаях можно удалить его из состояния OpenTofu, оставив его в удалённой системе.
Для этого выполните следующие действия:
- Удалите ресурс из конфигурации.
- Вместо него добавьте блок removed, указав в атрибуте
fromадрес ресурса, который нужно «забыть».
Например:
removed {
from = aws_instance.web
}Адрес в атрибуте from не может содержать ключи экземпляров (например, "aws_instance.web[0]").
При выполнении tofu plan OpenTofu сообщит, что ресурс будет удалён из состояния, но не будет уничтожен.
Блок removed можно использовать для удаления отдельных ресурсов или модулей, содержащих несколько ресурсов. Например:
removed {
from = module.some_module
}Метааргументы
Язык OpenTofu определяет несколько метааргументов, которые можно использовать с любым типом ресурса для изменения его поведения.
Следующие метааргументы описаны на отдельных страницах:
depends_on— для указания скрытых зависимостейcount— для создания нескольких экземпляров ресурса по заданному количествуfor_each— для создания нескольких экземпляров по карте или набору строкprovider— для выбора нестандартной конфигурации провайдераlifecycle— для настройки жизненного циклаprovisioner— для выполнения дополнительных действий после создания ресурса
Проверки пользовательских условий
С помощью блоков 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."
}
}
}Пользовательские условия помогают зафиксировать предположения, чтобы будущим разработчикам было проще понять замысел и принципы проектирования конфигурации. Они также позволяют раньше и в контексте получать полезную информацию об ошибках, помогая пользователям быстрее диагностировать проблемы в своих конфигурациях.
Дополнительные сведения см. в разделе Проверки пользовательских условий.
Тайм-ауты операций
Для некоторых типов ресурсов предусмотрен специальный аргумент в виде вложенного блока timeouts, позволяющий настроить, как долго могут выполняться определённые операции, прежде чем они будут считаться неудачными. Например, aws_db_instance позволяет настраивать тайм-ауты для операций create, update и delete.
Обработка тайм-аутов полностью реализуется типом ресурса в провайдере, но типы ресурсов, поддерживающие эту возможность, следуют соглашению: они определяют дочерний блок с именем timeouts, содержащий вложенный аргумент для каждой операции, тайм-аут которой можно настроить. Значение каждого такого аргумента задаётся строкой, представляющей длительность, например "60m" для 60 минут, "10s" для десяти секунд или "2h" для двух часов.
resource "aws_db_instance" "example" {
# ...
timeouts {
create = "60m"
delete = "2h"
}
}Набор настраиваемых операций определяется каждым типом ресурса. Большинство типов ресурсов вообще не поддерживают блок timeouts. Сведения о доступных для настройки операциях, если таковые имеются, см. в документации по соответствующему типу ресурса.
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.9/language/resources/syntax/