| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package command | |
| import ( | |
| "fmt" | |
| "strings" | |
| "github.com/hashicorp/terraform/internal/addrs" | |
| "github.com/hashicorp/terraform/internal/command/arguments" | |
| "github.com/hashicorp/terraform/internal/states" | |
| ) | |
| // StateListCommand is a Command implementation that lists the resources | |
| // within a state file. | |
| type StateListCommand struct { | |
| Meta | |
| StateMeta | |
| } | |
| func (c *StateListCommand) Run(args []string) int { | |
| parsedArgs, diags := arguments.ParseStateList(c.Meta.process(args)) | |
| if diags.HasErrors() { | |
| c.showDiagnostics(diags) | |
| return 1 | |
| } | |
| if parsedArgs.StatePath != "" { | |
| c.Meta.statePath = parsedArgs.StatePath | |
| } | |
| // Load the backend | |
| b, diags := c.backend(".", arguments.ViewHuman) | |
| if diags.HasErrors() { | |
| c.showDiagnostics(diags) | |
| return 1 | |
| } | |
| // This is a read-only command | |
| c.ignoreRemoteVersionConflict(b) | |
| // Get the state | |
| env, err := c.Workspace() | |
| if err != nil { | |
| c.Ui.Error(fmt.Sprintf("Error selecting workspace: %s", err)) | |
| return 1 | |
| } | |
| stateMgr, sDiags := b.StateMgr(env) | |
| if sDiags.HasErrors() { | |
| c.Ui.Error(fmt.Sprintf(errStateLoadingState, sDiags.Err())) | |
| return 1 | |
| } | |
| if err := stateMgr.RefreshState(); err != nil { | |
| c.Ui.Error(fmt.Sprintf("Failed to load state: %s", err)) | |
| return 1 | |
| } | |
| state := stateMgr.State() | |
| if state == nil { | |
| c.Ui.Error(errStateNotFound) | |
| return 1 | |
| } | |
| var addrs []addrs.AbsResourceInstance | |
| if len(parsedArgs.Addrs) == 0 { | |
| addrs, diags = c.lookupAllResourceInstanceAddrs(state) | |
| } else { | |
| addrs, diags = c.lookupResourceInstanceAddrs(state, parsedArgs.Addrs...) | |
| } | |
| if diags.HasErrors() { | |
| c.showDiagnostics(diags) | |
| return 1 | |
| } | |
| for _, addr := range addrs { | |
| if is := state.ResourceInstance(addr); is != nil { | |
| if parsedArgs.ID == "" || parsedArgs.ID == states.LegacyInstanceObjectID(is.Current) { | |
| c.Ui.Output(addr.String()) | |
| } | |
| } | |
| } | |
| c.showDiagnostics(diags) | |
| return 0 | |
| } | |
| func (c *StateListCommand) Help() string { | |
| helpText := ` | |
| Usage: terraform [global options] state list [options] [address...] | |
| List resources in the Terraform state. | |
| This command lists resource instances in the Terraform state. The address | |
| argument can be used to filter the instances by resource or module. If | |
| no pattern is given, all resource instances are listed. | |
| The addresses must either be module addresses or absolute resource | |
| addresses, such as: | |
| aws_instance.example | |
| module.example | |
| module.example.module.child | |
| module.example.aws_instance.example | |
| An error will be returned if any of the resources or modules given as | |
| filter addresses do not exist in the state. | |
| Options: | |
| -state=statefile Path to a Terraform state file to use to look | |
| up Terraform-managed resources. By default, Terraform | |
| will consult the state of the currently-selected | |
| workspace. | |
| -id=ID Filters the results to include only instances whose | |
| resource types have an attribute named "id" whose value | |
| equals the given id string. | |
| ` | |
| return strings.TrimSpace(helpText) | |
| } | |
| func (c *StateListCommand) Synopsis() string { | |
| return "List resources in the state" | |
| } | |
| const errStateLoadingState = `Error loading the state: %[1]s | |
| Please ensure that your Terraform state exists and that you've | |
| configured it properly. You can use the "-state" flag to point | |
| Terraform at another state file.` | |
| const errStateNotFound = `No state file was found! | |
| State management commands require a state file. Run this command | |
| in a directory where Terraform has been run or use the -state flag | |
| to point the command to a specific state location.` |