{"id":79374,"date":"2026-10-15T08:26:58","date_gmt":"2026-10-15T08:26:58","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=79374"},"modified":"2026-10-15T08:30:18","modified_gmt":"2026-10-15T08:30:18","slug":"terraform-cloud-hcp-terraform-organization-project-workspace-team-user-mapping","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/terraform-cloud-hcp-terraform-organization-project-workspace-team-user-mapping\/","title":{"rendered":"Terraform Cloud (HCP Terraform) \u2014 Organization, Project, Workspace, Team &#038; User Mapping"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Updated: October 15, 2026 | Based on current HashiCorp documentation<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Terraform Cloud is now called HCP Terraform. Its architecture separates infrastructure organization from user access management (RBAC).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The most important point is that these five components do not form one linear hierarchy.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"797\" height=\"537\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-11.png\" alt=\"\" class=\"wp-image-79375\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-11.png 797w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-11-300x202.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-11-767x517.png 767w\" sizes=\"auto, (max-width: 797px) 100vw, 797px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Teams receive permissions on the organization, projects, and workspaces. Users receive those permissions through team membership. A user may belong to multiple teams, and a team may access multiple projects and workspaces.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Understanding all five components<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Component<\/th><th>Purpose<\/th><th>Relationship<\/th><\/tr><tr><td>Organization<\/td><td>Top-level administrative boundary for Terraform infrastructure, teams, policies and settings<\/td><td>Contains projects and teams<\/td><\/tr><tr><td>Project<\/td><td>Groups related workspaces and controls access to them<\/td><td>Belongs to one organization<\/td><\/tr><tr><td>Workspace<\/td><td>Manages Terraform configuration, runs, variables and its own state<\/td><td>Belongs to exactly one project<\/td><\/tr><tr><td>Team<\/td><td>Groups users and defines their permissions<\/td><td>Created within an organization; assigned roles at different scopes<\/td><\/tr><tr><td>User<\/td><td>Individual identity accessing HCP Terraform<\/td><td>Can belong to multiple teams and organizations<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Important cardinality mapping<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Relationship<\/th><th>Mapping<\/th><\/tr><tr><td>Organization \u2192 Project<\/td><td>One to many<\/td><\/tr><tr><td>Project \u2192 Workspace<\/td><td>One to many<\/td><\/tr><tr><td>Organization \u2192 Team<\/td><td>One to many<\/td><\/tr><tr><td>Team \u2194 User<\/td><td>Many to many within organization membership<\/td><\/tr><tr><td>Team \u2194 Project<\/td><td>Many to many via permissions<\/td><\/tr><tr><td>Team \u2194 Workspace<\/td><td>Many to many via permissions<\/td><\/tr><tr><td>Workspace \u2192 Project<\/td><td>Exactly one project<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">All workspaces start in a Default Project unless another project is selected. The default project can be renamed but not deleted.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Complete component relationship diagram<\/h2>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">\nflowchart TB\n    O[\"ORGANIZATION\"]\n    P[\"PROJECTS\"]\n    W[\"WORKSPACES\"]\n    T[\"TEAMS\"]\n    U[\"USERS\"]\n\n    O -->|\"Contains\"| P\n    P -->|\"Contains\"| W\n\n    O -->|\"Contains\"| T\n    T -->|\"Membership\"| U\n\n    T -.->|\"Organization permissions\"| O\n    T -.->|\"Project roles\"| P\n    T -.->|\"Workspace roles\"| W\n\n    classDef org fill:#dbeafe,stroke:#2563eb,color:#1e40af\n    classDef infra fill:#dcfce7,stroke:#16a34a,color:#166534\n    classDef access fill:#fef3c7,stroke:#d97706,color:#92400e\n    class O org\n    class P,W infra\n    class T,U access\n<\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The solid arrows show membership or resource structure. The dashed arrows represent access grants.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Practical mapping example \u2014 Infrastructure platform<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Consider one organization managing development, staging and production infrastructure.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"809\" height=\"519\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-12.png\" alt=\"\" class=\"wp-image-79378\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-12.png 809w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-12-300x192.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-12-767x492.png 767w\" sizes=\"auto, (max-width: 809px) 100vw, 809px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Illustrative example: projects and workspaces organize infrastructure; teams and users control access.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Example team-to-resource permission mapping<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Team<\/th><th>Target<\/th><th>Role<\/th><th>Result<\/th><\/tr><tr><td>owners<\/td><td>Organization<\/td><td>Owner<\/td><td>Full organization administration<\/td><\/tr><tr><td>devops-engineers<\/td><td>EVP-NonProd project<\/td><td>Write<\/td><td>Plan\/apply all its workspaces<\/td><\/tr><tr><td>devops-engineers<\/td><td>eks-prod workspace<\/td><td>Plan<\/td><td>Plan but cannot apply there through this grant<\/td><\/tr><tr><td>release-managers<\/td><td>EVP-Production project<\/td><td>Write<\/td><td>Plan\/apply production workspaces<\/td><\/tr><tr><td>security-auditors<\/td><td>Production workspaces<\/td><td>Custom read-only<\/td><td>View permitted run details without unnecessarily granting full state access<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The production <code>Plan<\/code> assignment for DevOps is granted directly on the workspace. The team does not need project-wide <code>Write<\/code> access.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Permission levels \u2014 the critical distinction<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Project permissions<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Project roles apply across the project&#8217;s workspaces and Stacks.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Role<\/th><th>Capabilities<\/th><\/tr><tr><td>Admin<\/td><td>Full project management, including access assignments, workspaces and runs<\/td><\/tr><tr><td>Maintain<\/td><td>Manage workspace lifecycle and operations, including create\/delete and plan\/apply, without full project administration<\/td><\/tr><tr><td>Write<\/td><td>Run Terraform plans and applies, update variables and state<\/td><\/tr><tr><td>Read<\/td><td>View project and workspace information, runs and state<\/td><\/tr><tr><td>Custom<\/td><td>Select individual permissions<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Workspace permissions<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Role<\/th><th>Read<\/th><th>Plan<\/th><th>Apply<\/th><th>Manage workspace settings<\/th><\/tr><tr><td>Read<\/td><td>Yes<\/td><td>No<\/td><td>No<\/td><td>No<\/td><\/tr><tr><td>Plan<\/td><td>Yes<\/td><td>Yes<\/td><td>No<\/td><td>No<\/td><\/tr><tr><td>Write<\/td><td>Yes<\/td><td>Yes<\/td><td>Yes<\/td><td>No<\/td><\/tr><tr><td>Admin<\/td><td>Yes<\/td><td>Yes<\/td><td>Yes<\/td><td>Yes<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Custom workspace permissions are also available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Notice that Project Write gives write permissions to all workspaces within that project, whereas Workspace Write affects only the selected workspace, unless the team has broader permissions elsewhere.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How inherited permissions work<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">HCP Terraform permissions are additive, not restrictive overrides.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"813\" height=\"305\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-13.png\" alt=\"\" class=\"wp-image-79379\" srcset=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-13.png 813w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-13-300x113.png 300w, https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2026\/10\/image-13-768x288.png 768w\" sizes=\"auto, (max-width: 813px) 100vw, 813px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If the team has Project Admin, assigning Workspace Read does not reduce its effective access. The same principle applies across organization, project, workspace, and multiple team permissions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. User access and Terraform execution flow<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This diagram illustrates a user-initiated run. VCS-triggered and automated runs may have different initiation and approval behavior. Authorization does not replace Terraform policy checks, run controls, or cloud-provider IAM permissions.<\/p>\n\n\n\n<div class=\"wp-block-merpress-mermaidjs diagram-source-mermaid\"><pre class=\"mermaid\">\nflowchart TD\n    U[\"User signs into HCP Terraform\"]\n    T[\"Team memberships determine permissions\"]\n    G{\"Authorized for workspace?\"}\n    A[\"Access denied\"]\n    W[\"Workspace\"]\n    R[\"Start or inspect Terraform run\"]\n    PL[\"Terraform Plan\"]\n    AP{\"Apply authorized?\"}\n    STOP[\"Review \/ await approval\"]\n    EX[\"Terraform Apply\"]\n    S[\"Update workspace state\"]\n\n    U --> T --> G\n    G -->|No| A\n    G -->|Yes| W\n    W --> R --> PL --> AP\n    AP -->|No| STOP\n    AP -->|Yes| EX --> S\n<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">6. How to configure this in the HCP Terraform UI<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Create the organization. Sign in at <a href=\"https:\/\/app.terraform.io\/\">app.terraform.io<\/a> and create your organization. Configure its organization-wide settings.<\/li>\n\n\n\n<li>Create projects. Open Projects and create logical groupings such as NonProd, Production and Shared Infrastructure.<\/li>\n\n\n\n<li>Create workspaces. Assign each workspace to its project. Configure VCS or CLI integration, variables, execution mode and cloud credentials.<\/li>\n\n\n\n<li>Create teams. Navigate to Organization Settings \u2192 Teams. Create teams based on operational responsibilities.<\/li>\n\n\n\n<li>Invite users. Navigate to Organization Settings \u2192 Users, invite users by email, and associate them with appropriate teams.<\/li>\n\n\n\n<li>Grant project access. Navigate to Project \u2192 Settings \u2192 Team access. Assign Read, Write, Maintain, Admin or custom permissions.<\/li>\n\n\n\n<li>Grant workspace exceptions. Navigate to Workspace \u2192 Settings \u2192 Team access when a particular team needs additional permissions on a specific workspace.<\/li>\n\n\n\n<li>Validate effective permissions. Test with representative users before allowing access to sensitive or production infrastructure.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">These navigation paths follow HashiCorp&#8217;s current standard HCP Terraform permission-setting documentation.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=https:\/\/developer.hashicorp.com&amp;sz=32\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HashiCorp Developer<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Recommended best practices<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Recommendation<\/th><th>Reason<\/th><\/tr><tr><td>Use projects as access boundaries<\/td><td>Keep teams responsible only for relevant infrastructure<\/td><\/tr><tr><td>Separate production and nonproduction permissions<\/td><td>Avoid broad write access to sensitive workspaces<\/td><\/tr><tr><td>Use workspaces for separate infrastructure states<\/td><td>Reduce blast radius and improve lifecycle management<\/td><\/tr><tr><td>Assign permissions to teams rather than individuals<\/td><td>Makes onboarding\/offboarding and auditing easier<\/td><\/tr><tr><td>Restrict the Owners team<\/td><td>Its members have maximum organization permissions<\/td><\/tr><tr><td>Prefer custom read permissions for auditors<\/td><td>Default Read roles can allow full Terraform state access<\/td><\/tr><tr><td>Keep cloud IAM separate from HCP Terraform RBAC<\/td><td>Terraform access does not automatically grant AWS\/Azure permissions<\/td><\/tr><tr><td>Apply consistent workspace naming<\/td><td>Simplifies searching, automation and maintenance<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Security warning: Workspace Read and Project Read include the ability to read full state files. Terraform state can contain sensitive information, so use custom permissions where only run history or selected outputs should be visible.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=https:\/\/developer.hashicorp.com&amp;sz=32\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HashiCorp Developer<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">8. Important 2026 considerations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">HCP Terraform Europe: The newer HCP Europe organizational model uses HCP groups and roles instead of conventional HCP Terraform teams. Standard HCP Terraform organizations continue to use teams.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=https:\/\/developer.hashicorp.com&amp;sz=32\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HashiCorp Developer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Stacks: A project can contain Terraform Stacks as well as workspaces, and project-level permissions can extend to both.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=https:\/\/developer.hashicorp.com&amp;sz=32\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HashiCorp Developer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Plans and licensing: Projects are broadly available, but team management and project permission-management capabilities depend on the HCP Terraform edition.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.google.com\/s2\/favicons?domain=https:\/\/developer.hashicorp.com&amp;sz=32\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">HashiCorp Developer<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">+1<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Final mapping to remember<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><th>Question<\/th><th>Answer<\/th><\/tr><tr><td>Who owns the project?<\/td><td>Organization<\/td><\/tr><tr><td>Who owns the workspace?<\/td><td>Project<\/td><\/tr><tr><td>Who owns the team?<\/td><td>Organization<\/td><\/tr><tr><td>Who belongs to the team?<\/td><td>Users<\/td><\/tr><tr><td>Who receives permission assignments?<\/td><td>Teams<\/td><\/tr><tr><td>Where are permissions applied?<\/td><td>Organization, Project, Workspace<\/td><\/tr><tr><td>Who executes Terraform runs?<\/td><td>Workspaces, using their configured execution mode<\/td><\/tr><tr><td>Where is Terraform state stored?<\/td><td>Separately for each HCP Terraform workspace<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest correct mental model:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Organization \u2192 Project \u2192 Workspace defines what infrastructure is managed and where.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Organization \u2192 Team \u2192 Users, with team roles on projects and workspaces, defines who can access and change that infrastructure.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Official references: <a href=\"https:\/\/developer.hashicorp.com\/terraform\/cloud-docs\/projects\">Projects<\/a>, <a href=\"https:\/\/developer.hashicorp.com\/terraform\/cloud-docs\/users-teams-organizations\/permissions\">Permissions overview<\/a>, and <a href=\"https:\/\/developer.hashicorp.com\/terraform\/cloud-docs\/users-teams-organizations\/permissions\/set-permissions\">Managing permissions<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Updated: October 15, 2026 | Based on current HashiCorp documentation Terraform Cloud is now called HCP Terraform. Its architecture separates infrastructure organization from user access management (RBAC)&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-79374","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79374","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=79374"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79374\/revisions"}],"predecessor-version":[{"id":79382,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79374\/revisions\/79382"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=79374"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=79374"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=79374"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}