Skip to content

Road to 1.0 Deprecated Feature Removal Schedule #3535

@yhakbar

Description

@yhakbar

On the road to the first major release of Terragrunt 1.0, some breaking changes will take place that remove functionality in Terragrunt.

While features will primarily be introduced as backwards compatible, deprecated features will be gradually removed leading up to 1.0, and remain supported until the next major version, 2.0. More on this can be found here, in the CLI Redesign RFC.

Note that users can also leverage Strict Mode to opt-in to these breaking changes before they occur to confirm that they are ready to adopt the releases where the changes take place. All deprecated functionality will be introduced to a strict mode control before it is fully removed to give users the chance to try out the removal preemptively.

The items listed below will be listed in order of their eventual removal. Initially, they will be listed with To Be Decided (TBD) deadlines for their removal, but as we get closer to 1.0, they will be scheduled, and removed slowly.

This is a living document. If you have concerns or would like to request that the order or deadline for feature removal change, please share your feedback. More may be added to this schedule as we get closer to 1.0.

Removal Schedule

This is a tentative schedule, subject to change based on community feedback:

  1. Removal of longstanding deprecated commands (e.g. plan-all) - 0.84.0: 2025/08/01
  2. Removal of legacy Terragrunt flags (all flags that start with terragrunt-) - x.y.z: 2025/08/15
  3. Removal of backend provisioning as default behavior - x.y.z: 2025/09/01
  4. Removal of command forwarding by default - x.y.z: 2025/09/15
  5. Removal of deprecated commands (e.g. terragrunt-info) - x.y.z: 2025/10/01
  6. Removal of behavior where inputs are read from dependencies - x.y.z: 2025/10/15
  7. Removal of deprecated runtime controls (skip, retryable_errors) - x.y.z: 2025/11/01

Removed Features

The following is a breakdown of the items listed above, and why they are being removed.

Removal of longstanding deprecated commands

For quite a long time, commands like plan-all have been deprecated in favor of the run-all command (which has since been replaced with run --all), and can be used in combination with other commands like plan, apply, etc instead of a dedicated command.

If you are currently using commands like the following:

$ terragrunt plan-all

You'll want to use the following instead:

$ terragrunt run --all plan

Removal of legacy Terragrunt flags

As discussed here, by 1.0, Terragrunt users will no longer have to use flags named with a terragrunt- prefix for every flag.

There is now a new, corresponding, flag for every legacy terragrunt- prefixed flag, the run and exec commands are introduced, and the terragrunt- prefixed flags will no longer be necessary.

If you are currently using flags like this:

$ terragrunt plan --terragrunt-non-interactive

You'll want to use the following instead:

$ terragrunt plan --non-interactive

You can learn more about these changes here.

Removal of backend provisioning as default behavior

As discussed here, the current default behavior of Terragrunt whereby backend resource provisioning is attempted by default is not desirable, and better alternatives exist.

Now that the backend command is available, along with the --backend-bootstrap flag, doing this by default is now deprecated.

If you currently expect the following to automatically provision backend resources on your behalf before running:

$ terragrunt plan --non-interactive

You'll want to use the following flag to retain that behavior:

$ terragrunt plan --backend-bootstrap --non-interactive

You can learn more about this here.

Removal of command forwarding by default

As discussed here, the current default behavior of Terragrunt forwarding all commands to OpenTofu/Terraform when they are not native commands in Terragrunt causes a lot of confusion and errors for users.

Now that the run command is available, along with dedicated OpenTofu command shortcuts, this behavior is now deprecated.

If you are currently using commands like the following (where you're expecting anything you pass to Terragrunt to be forwarded to OpenTofu/Terraform by default):

$ terragrunt workspace ls

You'll want to replace that usage with the run command like this:

$ terragrunt run -- workspace ls

You can learn more about this here.

Removal of deprecated commands

As discussed here, there are numerous instances where existing, infrequently used commands in Terragrunt have been restructured into a better organized, more consistent system.

Now that these commands are introduced to make the existing commands deprecated, legacy commands like terragrunt-info are deprecated.

If you are currently using commands like:

$ terragrunt hclfmt

You'll want to replace that usage with commands like this:

$ terragrunt hcl fmt

You can learn more about this (including the full list of commands that have been renamed) here.

Removal of behavior where inputs are read from dependencies

As discussed here, the current default behavior of Terragrunt where dependencies expose their inputs as accessible values slows Terragrunt configuration parsing significantly.

If you are currently accessing the inputs of dependencies like this:

dependency "foo" {
  config_path = "../foo"
}

inputs = {
  my_input = dependency.foo.inputs.an_input_from_foo
}

You'll want to adjust your usage so that you access outputs instead like this:

dependency "foo" {
  config_path = "../foo"
}

inputs = {
  my_input = dependency.foo.outputs.an_output_from_foo
}

You can learn more about this here.

Removal of deprecated runtime controls

The attributes retryable_errors and skip have been deprecated in favor of configurations errors and exclude respectively.

If you are currently using configurations like this:

skip = true

retryable_errors = [
  ".*Error: transient network issue.*"
]

You'll want to use configurations like this instead:

exclude {
    if = true
    actions = ["all"]
}

errors {
    # Retry block for transient errors
    retry "transient_errors" {
        retryable_errors = [".*Error: transient network issue.*"]
        max_attempts = 3
        sleep_interval_sec = 5
    }
}

You can learn more about the new configurations here.

Sub-issues

Metadata

Metadata

Assignees

Labels

preservedPreserved issues never go stale

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions