Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions .agents/references/gcp-backplane.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,52 @@ The backplane's `credentials_json` output is then an
document (`type = "external_account"`) pointing at the runner's token file, passed to the building
block as a `FILE` input with `GOOGLE_APPLICATION_CREDENTIALS` set to its path.

### Why GCP WIF subjects stop at the workspace

`modules/azure/`, `modules/aws/` and `modules/stackit/` append the building block definition uuid to
the subject; GCP deliberately does not because this creates a dependency cycle of the following form

```hcl
# --- backplane module ---
resource "google_iam_workload_identity_pool_provider" "meshstack" {
# trust condition wants to name the specific BBD so that only a single BBD can assume the role
attribute_condition = "google.subject.startsWith('...buildingblockdefinition.${var.bbd_uuid}')"
...
}

output "credentials_json" {
# audience must reference *this* pool provider's resource name
value = jsonencode({
audience = "//iam.googleapis.com/${google_iam_workload_identity_pool_provider.meshstack.name}"
...
})
}

# --- root module ---
resource "meshstack_building_block_definition" "gcp_storage_bucket" {
# the BBD needs the backplane's credentials as a static input...
spec = {
inputs = {
secret_value = "data:application/json;base64,${base64encode(module.backplane.credentials_json)}"
}
}
}

module "backplane" {
source = "./backplane"
# ...but the backplane needs the BBD's uuid to scope the trust condition, we now have a dependency cycle
bbd_uuid = meshstack_building_block_definition.gcp_storage_bucket.id
}
```

The current workaround for this problem is to use an `attribute_condition` that does not pin the BBD uuid.
A `startsWith` admits any building block definition owned by the same platform team workspace, so all of
them share the backplane's federated identity — but authoring a definition in that workspace is
already a privileged action, and in practice it coincides with being able to change the backplane
itself. The residual cost is audit attribution: Cloud Audit Logs cannot tell which definition acted.
Monitor https://feedback.meshcloud.io/feature-requests/p/introduce-building-block-definition-version-spec-resource-in-meshstack-terraform
for progress on this matter.

<!-- scorecard-checks: gcp_project_service_disable_on_destroy -->
## Project API enablement

Expand Down
Loading