Метааргумент enabled
В одном блоке ресурса или модуля нельзя использовать enabled вместе с count или for_each. Подробнее см. в разделе Ограничения.
Метааргумент enabled, появившийся в OpenTofu v1.11, предоставляет более удобный способ условно создавать или пропускать один экземпляр ресурса или модуля в блоке lifecycle. В отличие от традиционного обходного решения с count = var.enabled ? 1 : 0, для доступа к отдельным экземплярам которого требуется индексация массива, enabled обеспечивает прямой доступ, когда ресурс создан, и корректно обрабатывает состояние null, когда ресурс отключен.
Базовый синтаксис
enabled — это метааргумент, который указывается внутри блока lifecycle. Он принимает выражения, возвращающие логические значения, чтобы определить, следует ли создавать ресурс или модуль.
variable "create_instance" {
type = bool
default = true
}
resource "aws_instance" "example" {
# ...
lifecycle {
enabled = var.create_instance
}
}Если enabled имеет значение true (или не указано), ресурс работает как обычно. Если enabled имеет значение false, ресурс не создается, и его значение становится null.
Переход с count
Если в существующих ресурсах используется шаблон count = var.enabled ? 1 : 0, можно перейти на enabled без ручного изменения состояния.
После перехода больше не нужно обращаться к ресурсу, используя ключ экземпляра [0]. Вместо aws_instance.example[0] можно просто использовать aws_instance.example. OpenTofu автоматически выполнит миграцию состояния индексированного экземпляра в неиндексированный.
До
variable "create_instance" {
type = bool
default = true
}
resource "aws_instance" "example" {
count = var.create_instance ? 1 : 0
# ...
}
output "instance_id" {
value = length(aws_instance.example) > 0 ? aws_instance.example[0].id : "not-created"
}После
variable "create_instance" {
type = bool
default = true
}
resource "aws_instance" "example" {
# ...
lifecycle {
enabled = var.create_instance
}
}
output "instance_id" {
value = aws_instance.example != null ? aws_instance.example.id : "not-created"
}После применения этого изменения OpenTofu автоматически переместит существующий ресурс из aws_instance.example[0] в aws_instance.example. Блок moved или ручное изменение состояния не требуются.
Доступ к отключенным ресурсам
Если ресурс может быть отключен, его значение будет null, поэтому к нему нельзя обращаться напрямую. Для безопасной обработки используйте условные выражения:
# Using try() - most concise but masks other errors
output "instance_id" {
value = try(aws_instance.example.id, "not-created")
}
# Using null check - most verbose but clearest intent
output "instance_id" {
value = aws_instance.example != null ? aws_instance.example.id : "not-created"
}Попытка напрямую обратиться к ресурсу, настроенному с помощью enabled = false, приведет к ошибке во время plan или apply:
│ Error: Attempt to get attribute from null value │ │ on main.tf line 10, in output "instance_id": │ 10: value = aws_instance.example.id │ ├──────────────── │ │ aws_instance.example is null │ │ This value is null, so it does not have any attributes.
Ограничения
Метааргумент enabled нельзя использовать вместе с count или for_each, поскольку эти метааргументы предназначены для разных целей. Используйте enabled для условного создания ресурсов с одним экземпляром, count — для создания нескольких нумерованных экземпляров или for_each — для создания нескольких именованных экземпляров.
Метааргумент enabled не может использовать:
- Неизвестные значения (значения, которые становятся известны только при применении конфигурации)
- Конфиденциальные значения
- Значения null
- Эфемерные значения
- Нелогические значения
Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.11/language/meta-arguments/enabled/