# Locals and Outputs — Terraform

Source: https://www.skillbyai.com/en/terraform/l-locals

> Name intermediate values; expose results.

## locals for reuse, outputs for consumers

**Locals** give names to expressions used several times (`local.app_name`, a common tags map) to avoid repetition. **Outputs** expose values after apply: to the user (`terraform output`), to calling modules (`module.x.output_name`) or to other tooling. Keep outputs meaningful (ids, endpoints, names) and mark outputs derived from secrets as sensitive.

## Apply, read the file, plan again, run

I ran this with Terraform 1.16.4 and the hashicorp/local 2.9.1 and hashicorp/random 3.9.1 providers, which manage local files and random values, so no cloud account was needed; each example starts from a fresh directory. Apply creates the file with content built from locals and prints the output; a second plan reports no changes, because the real resource already matches the configuration (idempotence).

```bash
terraform apply -auto-approve -no-color | tail -4
cat out/shop-dev.conf
terraform plan -no-color | grep -E "No changes|Plan:"
```

Output:

```

Outputs:

config_path = "./out/shop-dev.conf"
app=shop
env=dev
No changes. Your infrastructure matches the configuration.
```

## Use a common tags local

Define locals { tags = { app = "shop", env = var.env } } and apply it to every resource for cost tracking and ownership.

**Quiz:** Why did the second plan show no changes?

- [ ] Outputs block changes
- [ ] The plan failed
- [ ] Terraform forgot the resource
- [x] Real infrastructure already matched the configuration

*Answer:* Real infrastructure already matched the configuration. Applying the same config twice is idempotent.
