State access is all-or-nothing
Terraform has no concept of partial access to a state. If you can write it, you can change every resource in it — and terraform_remote_state hands consumers the entire file. RBAC bolted onto a bucket answers "can you touch this state," never "which resources, and to do what."
Scoped to a slice of the graph
An illustrative scenario: two tokens on the same state. One can plan and apply within one module; the other is scoped to a different one. Each sees exactly what its capabilities allow.
❯ stategraph whoami state: platform capabilities: preview module.network.* commit module.network.*
❯ stategraph whoami state: platform capabilities: preview module.firewall.* commit module.firewall.*
Same state. Different capabilities. No overlap.
❯ stategraph apply # firewall token, change reaches module.network Resolving change set… ✗ Denied: commit on module.network.db is outside this token's capabilities # nothing was applied
Out of scope means denied, not partially applied.
Access that fits the change, not the file
What you get
Scope to any level
Grant capabilities at the tenant, state, or resource level, with wildcards for a whole module subtree. The scope of a token is the ceiling on the blast radius it can cause.
Preview and commit, separately
Preview maps to plan, commit maps to apply. Hand reviewers preview-only access and keep commit for the people who own the change.
Least-privilege CI tokens
Scope a pipeline to read what it needs to build the graph and commit only its area of change. An automated run can't reach beyond its lane, which shrinks the blast radius of CI.
Delegate a subset
Users can mint tokens that carry a subset of their own capabilities, perfect for handing a narrow, scoped credential to an automated system.
Direct and downstream
Control not just what you change directly, but whether a change may propagate into the resources that depend on it. If it would touch something outside your capabilities, the whole operation is denied rather than half-applied.
Attributable by identity
Every operation is tied to who ran it, and an automated run can be constrained to the capabilities of the user it acts on behalf of. CI can't do more than the person behind it.
Give every token exactly what it needs
Stop handing out write access to an entire state because the tooling can't express anything smaller. Scope people and pipelines to the resources they actually touch.
See more in all features · blast radius →