- The OpenTofu Language
- Meta-Arguments
- The enabled Meta-Argument
The enabled Meta-Argument
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.
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​
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​
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:
# 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:
│ 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