Terraform
terraform output command
The terraform output command extracts the value of an output variable from the state file.
Usage
Usage: terraform output [options] [NAME]
With no additional arguments, output will display all the outputs for
the root module. If an output NAME is specified, only the value of that
output is printed.
The command-line flags are all optional. The following flags are available:
-json- If specified, the outputs are formatted as a JSON object, with a key per output. IfNAMEis specified, only the output specified will be returned. This can be piped into tools such asjqfor further processing.-raw- If specified, Terraform will convert the specified output value to a string and print that string directly to the output, without any special formatting. This can be convenient when working with shell scripts, but it only supports string, number, and boolean values. Use-jsoninstead for processing complex data types.-no-color- If specified, output won't contain any color.-state=path- Path to the state file. Defaults to "terraform.tfstate". Legacy option for the local backend only.
Note: When using the -json or -raw command-line flags, Terraform displays sensitive values in plain text. For more information,
refer to Sensitive data in state.
Examples
These examples assume the following Terraform output snippet.
output "instance_ips" {
value = aws_instance.web.*.public_ip
}
output "lb_address" {
value = aws_alb.web.public_dns
}
output "password" {
sensitive = true
value = var.secret_password
}
To list all outputs:
$ terraform output
instance_ips = [
"54.43.114.12",
"52.122.13.4",
"52.4.116.53"
]
lb_address = "my-app-alb-1657023003.us-east-1.elb.amazonaws.com"
password = <sensitive>
Note that Terraform does not redact sensitive values when you specify the output by name:
$ terraform output password
password = notasecurepassword
However, Terraform completely omits any ephemeral values, even if you specify an output by name. Ephemeral values are never stored in state or included in Terraform plans. For more information, refer to Sensitive data in state.
To query for the DNS address of the load balancer:
$ terraform output lb_address
"my-app-alb-1657023003.us-east-1.elb.amazonaws.com"
To query for all instance IP addresses:
$ terraform output instance_ips
instance_ips = [
"54.43.114.12",
"52.122.13.4",
"52.4.116.53"
]
The terraform output command only displays outputs defined in the root module.
To display outputs from child modules, define an output block in your
root module using the value of an output from a child module. The example
below uses a child module named loadbalancer that defines an output named
lb_address. It then defines an output in the root module named address
to access the value when you run terraform output.
module "loadbalancer" {
source = "./modules/loadbalancer"
}
output "address" {
value = module.loadbalancer.lb_address
}
Use in automation
The terraform output command by default displays in a human-readable format,
which can change over time to improve clarity.
For scripting and automation, use -json to produce the stable JSON format.
You can parse the output using a JSON command-line parser such as
jq:
$ terraform output -json instance_ips | jq -r '.[0]'
54.43.114.12
For the common case of directly using a string value in a shell script, you
can use -raw instead, which will print the string directly with no extra
escaping or whitespace.
$ terraform output -raw lb_address
my-app-alb-1657023003.us-east-1.elb.amazonaws.com
The -raw option works only with values that Terraform can automatically
convert to strings. Use -json instead, possibly combined with jq, to
work with complex-typed values such as objects.
Terraform strings are sequences of Unicode characters rather than raw bytes,
so the -raw output will be UTF-8 encoded when it contains non-ASCII
characters. If you need a different character encoding, use a separate command
such as iconv to transcode Terraform's raw output.