Spec-Zone.ru › OpenTofu 1.12

The enabled Meta-Argument

Note

A given resource or module block cannot use enabled together with count or for_each. See Restrictions for more details.

The enabled meta-argument, introduced in OpenTofu v1.11, provides a cleaner way to conditionally create or skip a single resource or module instance in a lifecycle block. Unlike the traditional count = var.enabled ? 1 : 0 workaround, which requires array indexing to access single instances, enabled allows direct access when the resource is created and properly handles the null state when disabled.

Basic Syntax​

enabled is a meta-argument that goes inside a lifecycle block. It accepts expressions that turn into boolean values to determine whether the resource or module should be created.

Code Block
variable "create_instance" {
  type    = bool
  default = true
}

resource "aws_instance" "example" {
  # ...
  lifecycle {
    enabled = var.create_instance
  }
}

When enabled is true (or not specified), the resource behaves normally. When enabled is false, the resource is not created and evaluates to null.

Migrating from count​

If you have existing resources using the count = var.enabled ? 1 : 0 pattern, you can migrate to enabled without manual state manipulation.

After migration, you no longer need to reference your resource using the [0] instance key. Instead of aws_instance.example[0], you can simply use aws_instance.example. OpenTofu automatically handles the state migration from the indexed instance to the non-indexed instance.

Before​

Code Block
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"
}

After​

Code Block
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"
}

When you apply this change, OpenTofu will automatically move your existing resource from aws_instance.example[0] to aws_instance.example. No moved block or manual state manipulation is required.

Accessing Disabled Resources​

When a resource might be disabled, it evaluates to null and cannot be accessed directly. You must use conditional expressions to handle this safely:

Code Block
# 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"
}

Attempting to directly access a resource configured with enabled = false will result in an error during plan or apply:

Code Block
│ 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.

Restrictions​

The enabled meta-argument cannot be used together with count or for_each, as these meta-arguments serve different purposes. Use enabled for conditionally creating single-instance resources, count for creating multiple numbered instances, or for_each for creating multiple named instances.

The enabled meta-argument cannot use:

  • Unknown values (values not known until apply)
  • Sensitive values
  • Null values
  • Ephemeral values
  • Non-boolean values

Copyright (c) The OpenTofu Authors
Copyright (c) 2014 HashiCorp, Inc.
Mozilla Public License, version 2.0
https://opentofu.org/docs/v1.12/language/meta-arguments/enabled/

Spec-Zone.ru

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