Cloud Hierarchy Comparison (AWS, GCP, Azure, Nebius) vs GPUaaS¶
Purpose¶
Provide a single comparison artifact to justify and defend GPUaaS tenancy and ownership decisions.
Scope¶
This document compares: - Ownership boundary - Resource hierarchy shape - Identity/access model - Billing anchor - Context selection model - Service-account model
It is intended to support architecture reviews and stakeholder alignment.
Executive Summary¶
GPUaaS is aligned with the dominant cloud pattern: - Ownership root at tenant/org/account level - Operational scope at project/account/subscription level - User identity as actor attribution, not owner-of-record - Access enforced via membership/group bindings on hierarchical scopes
Our chosen model (tenant -> project -> resource) is closest to Nebius and GCP semantics, while still compatible with AWS/Azure operational expectations.
Terminology Mapping¶
| Concept | AWS | GCP | Azure | Nebius | GPUaaS |
|---|---|---|---|---|---|
| Ownership root | Organization / Management Account | Organization | Tenant (Microsoft Entra tenant) + Management Group root | Tenant | Tenant (organizations) |
| Operational scope | Account | Project | Subscription / Resource Group | Project | Project |
| Resource container | Service resources in account | Service resources in project | Resources in resource group/subscription | Service resources in project | Allocations/storage/scheduler resources in project |
| Membership/access binding | IAM principals (users/roles), account/org scope bindings | IAM principals bound at org/folder/project scope | Entra principals with RBAC assignments at mg/sub/rg/resource scope | Tenant/project groups with membership bindings | tenant_memberships + project_memberships |
| Policy model | IAM policy docs + SCP guardrails | IAM allow policies + org policy constraints | Azure RBAC role assignments + policy initiatives | Group + role based access permits across tenant/project scopes | Policy chain global -> tenant -> project (most-specific wins) |
| RBAC / ABAC posture | Primarily RBAC with policy conditions (ABAC-like) | RBAC with IAM Conditions / tags (ABAC-like) | RBAC with conditional access/policy controls | Primarily RBAC via groups/roles | RBAC in MVP; OPA-ready decision interface for ABAC extension |
Side-by-Side Comparison¶
| Dimension | AWS | GCP | Azure | Nebius | GPUaaS (target model) |
|---|---|---|---|---|---|
| Default signup bootstrap | Account created; can later join/create org | Project created; org depends on domain/org setup | Tenant + subscription context | Tenant and project auto-created | Personal tenant + default project auto-created |
| Hierarchy depth | Org -> OU -> Account -> Resource | Org -> Folder -> Project -> Resource | Management Group -> Subscription -> Resource Group -> Resource | Tenant -> Project -> Resource | Tenant -> Project -> Resource |
| Policy inheritance | SCP/IAM policies via org/ou/account | IAM inheritance down org/folder/project | RBAC scope inheritance down mg/sub/resource group | Group-based access at tenant/project scopes | Global -> tenant -> project policy chain |
| Billing ownership anchor | Account / consolidated payer patterns | Billing account + org/project mapping | Subscription/billing account | Tenant quotas + billing | Tenant (organizations.stripe_customer_id) |
| Resource owner portability when user leaves | Yes (account/org owns resources) | Yes (project/org owns resources) | Yes (subscription/tenant owns resources) | Yes (tenant/project owns resources) | Yes (tenant/project owns resources) |
| User is owner-of-record? | No (except anti-pattern setups) | No | No | No | No (requested_by_user_id attribution only) |
| Service account scope | Account-scoped IAM roles | Project-scoped service accounts | Tenant app registrations + scoped RBAC | Project-scoped service accounts | Project-scoped service accounts |
| Multi-tenant user model | Supported | Supported | Supported | Supported (can be added to multiple tenants) | Deferred; MVP constrained by UNIQUE(user_id) in tenant membership |
| Authorization style at runtime | Role/policy evaluation with explicit deny semantics | Policy inheritance + conditional evaluation | Scope-based role evaluation + policy controls | Group/role permission evaluation | Membership + scoped policy evaluation (RBAC-first, ABAC-ready) |
Group Lifecycle (Operational View)¶
GPUaaS separates structure from lifecycle. Group-like access control exists through membership tables now, and richer group administration is deferred.
Lifecycle phases:
1. Scope creation
- Tenant and default project are created at signup.
- Initial owner memberships are created for the signing user.
2. Membership grant
- User is granted tenant/project role (owner/admin/member/viewer variants by scope).
- Every grant/revoke is audit logged with actor and correlation id.
3. Access evaluation
- Runtime checks resolve membership + scope + policy chain (global -> tenant -> project).
- User identity is attribution, not ownership.
4. Membership change
- Role update or removal changes effective permissions without resource ownership rewrite.
5. Offboarding
- User can be removed from memberships; resources remain tenant/project-owned.
6. Expansion (post-MVP)
- Add first-class group entities and group-management UX.
- Relax single-tenant constraint (UNIQUE(user_id) on tenant membership) for true multi-tenant users.
Why this matters: - Keeps MVP implementation simple. - Preserves a clean extension path to enterprise IAM without authz query rewrites.
Hierarchy vs Resource Identifier¶
These are related but distinct concerns:
- Hierarchy model
- Defines ownership and authorization boundaries (
tenant -> project -> resource). -
Drives access checks, policy resolution, and billing ownership.
-
Resource identifier model
- Defines a canonical name used across API responses, events, logs, and runbooks.
- Does not replace hierarchy; it encodes hierarchy context for portability and observability.
GPUaaS alignment rule:
- Every tenant-owned runtime resource identifier must include tenant and project context:
- core42:aicloud:{region}:{tenant_id}:{project_id}:{resource_type}:{resource_id}
- Authorization uses structured scope checks; resource_name is the canonical cross-system reference.
Why GPUaaS Model Is Defensible¶
- Aligns to industry baseline: all compared providers separate actor identity from ownership boundary.
- Prevents orphaned resources: allocation ownership survives user churn because ownership is tenant/project rooted.
- Supports enterprise expansion without query rewrites: membership tables are present now; MVP single-tenant behavior is enforced by constraint, not hardcoded query shape.
- Keeps MVP simple while preserving extensibility: minimal role set now, explicit path to richer IAM later.
- Keeps billing coherent: tenant-level billing avoids per-user financial fragmentation when team accounts are introduced.
- Matches our canonical resource identifier spec (
core42:aicloud:{region}:{tenant}:{project}:...), so policy and observability context are consistent.
Explicit Design Choices in GPUaaS¶
- Keep
organizationstable name for compatibility, but use tenant as architecture domain term. - Enforce non-null tenant/project ownership on project-owned runtime resources.
- Treat
requested_by_user_id/initiated_by_user_idas attribution only. - Require request-scoped project context for project-owned operations (no implicit fallback).
- Use two-tier roles:
- Platform role (
users.role) for platform superadmin paths - Tenant/project membership roles for tenant-scoped authorization
Known Differences vs Hyperscalers (Intentional)¶
- No folder/OU/management-group layer in MVP.
- No full IAM group-management UX in MVP.
- No full multi-tenant context switch UX in MVP.
These are intentional MVP scope boundaries and deferred extensions. They can be
added in later phases without changing the core ownership model (tenant -> project -> resource).
Design Principles (Short Form)¶
- Ownership root is separate from user identity.
- Tenant and project boundaries are first-class in authorization and billing.
- Membership-query shape is future-ready for multi-tenant expansion.
- Billing and access control remain tenant-rooted to avoid user-owned resource drift.
References¶
External: - AWS Organizations concepts: https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html - Google Cloud resource hierarchy: https://cloud.google.com/resource-manager/docs/cloud-platform-resource-hierarchy - Azure management groups and hierarchy: https://learn.microsoft.com/en-us/azure/governance/management-groups/overview - Nebius IAM overview: https://docs.nebius.com/iam/overview
Internal:
- doc/architecture/Tenant_Project_Ownership_Baseline.md
- doc/architecture/adrs/ADR-008-tenant-project-ownership-baseline.md
- doc/architecture/ERD.md
- doc/architecture/Resource_Identifier_Spec.md
- doc/architecture/Service_Account_Model.md