*_ID secrets. The service account uses the Cloud Asset API to enumerate resources across every project in your organization in a single call per asset type — no per-project iteration, no per-region loops.
You will end up with a handful of secrets in ConfigView — the 3 core IDs (GCP_ORG_ID, GCP_CUSTOMER_ID, GCP_WORKSPACE_ADMIN_EMAIL), plus the 3 GCP_BILLING_* secrets if you enable billing detail — plus one uploaded JSON file (google_cloud.json, the service account key).
Prerequisite — enable the required APIs on the project that hosts the service account (the one you pick in Step 2). Every call is billed/quoted against that project, and on a fresh project several of these are off by default:
cloudasset.googleapis.com— all Asset-API endpoints (compute, storage, IAM bindings, …); the bulk of the 27cloudresourcemanager.googleapis.com— Projects, Organizations, Folderscloudbilling.googleapis.com— Billing Accountsiam.googleapis.com— Service Accounts, Service Account Keysserviceusage.googleapis.com— APIs Enabled (per Project); usually already onlogging.googleapis.com— Audit Logs (Admin Activity)bigquery.googleapis.com— billing cost + pricing (queries the BigQuery export)billingbudgets.googleapis.com— Billing Budgetsadmin.googleapis.com— only for Cloud Identity Users (optional, Step 6)
Propagation. After enabling, SERVICE_DISABLED 403s can persist intermittently for ~10–15 minutes — some calls succeed while others still fail as the change rolls out across Google’s systems. Wait it out before assuming a misconfiguration.
Step 1: Identify your IDs
You need three identifiers up-front:GCP_ORG_ID— Open https://console.cloud.google.com/iam-admin/settings, switch to your organization in the picker, copy the Organization ID (e.g.123456789012).GCP_CUSTOMER_ID— In the same Organization Settings page, copy the Directory customer ID (begins withC, e.g.C03az79cb). This is your Cloud Identity / Workspace customer ID.GCP_WORKSPACE_ADMIN_EMAIL— Only required for the Cloud Identity Users endpoint. The email of a Workspace admin the service account will impersonate via DWD. Skip this if you’re not enabling Cloud Identity Users.
Step 2: Create the service account
- Open https://console.cloud.google.com/iam-admin/serviceaccounts
- Pick (or create) a project to host the service account —
configview-integrationis conventional, but any project the SA can use as its “home” works - Click Create Service Account
- Name:
configview - Click Create and Continue — we’ll add roles in the next step
- Click Done (you can skip the optional grant-users step)
Step 3: Grant the service account org-level roles
Switch to IAM at the organization level (not project): https://console.cloud.google.com/iam-admin/iam → pick your organization in the picker → click Grant Access. Add the service account email as a principal and assign:
For the billing detail endpoints (Cost Summary/Detailed, Pricing, Budgets) the service account also needs, not at the org but on the project that hosts the BigQuery billing export:
No billing export, no cost data. GCP has no cost API — detailed spend only exists if you’ve enabled Billing → BigQuery export (Standard + Detailed usage cost, and optionally Pricing). If you haven’t, set it up first (console → Billing export), then point ConfigView at it via the secrets in Step 5. Budgets and the account→project map work without the export.Click Save.
AboutCloud Asset Viewer. This role alone covers most of the heavy lifting. If you want a single-role install and don’t mind slightly less granular reads, you can grantroles/cloudasset.viewer+roles/browserand the majority of the 27 endpoints will function. The other roles fix the gaps for billing, service-usage, IAM policy, and SA keys.
Cloud Identity Users needs no org role. That endpoint reads the user directory through the Admin Directory API via domain-wide delegation (Step 6), not a GCP IAM grant — so there’s nothing to add here for it. (There is noroles/cloudidentity.viewer; the predefined Cloud Identity roles areroles/cloudidentity.groups.readonlyand friends, none of which this integration uses.)
Step 4: Create + upload the JSON key
- From the service account list, click your
configviewservice account - Open the Keys tab → Add Key → Create new key → JSON
- Click Create — the JSON file downloads automatically
- Upload the JSON to your ConfigView satellite at
<satellite-root>/json/google_cloud.json(your ConfigView administrator can do this — it’s NOT a Secret Manager secret because the file is bigger and is referenced directly by all scripts)
Where the file lives. The scripts resolve<project_root>/json/google_cloud.json, where<project_root>is the dashboard-backend root. On a satellite this is/opt/configview-dashboard-backend/json/google_cloud.json— the same directory that already holdssecret-manager.jsonandgoogle_admin.json. Permissions:chmod 400, ownerconfigview:configview.
Step 5: Add the secrets to ConfigView
- Go to your ConfigView dashboard:
https://{companyname}.configview.com/admin/secret/ - Click Add Secret and create:
GCP_ORG_ID: from Step 1.1 (numeric, e.g.123456789012)GCP_CUSTOMER_ID: from Step 1.2 (starts withC)GCP_WORKSPACE_ADMIN_EMAIL: from Step 1.3 (admin email to impersonate, only needed for Cloud Identity Users)
- For the billing detail endpoints, also add (skip if you’re not enabling cost/pricing/budgets):
GCP_BILLING_BQ_PROJECT: the project that holds the BigQuery billing export (e.g.my-billing)GCP_BILLING_BQ_DATASET: the dataset name within it (e.g.billing)GCP_BILLING_ACCOUNT_ID: the billing account ID with dashes (e.g.01ABCD-23EFGH-45IJKL)- (optional)
GCP_BILLING_DETAILED_DAYS(default7),GCP_AUDIT_LOOKBACK_HOURS(default24),GCP_AUDIT_MAX_ENTRIES(default100000)
- Click Save
Step 6: Domain-Wide Delegation (only for Cloud Identity Users)
Skip this step if you’re not enabling the Cloud Identity Users endpoint. The endpoint duplicates google-workspace data, so most customers already running google-workspace can leave it disabled. If you do want it:- From the service account list, click your
configviewSA → Details → expand Advanced settings → copy the Client ID - Sign in to your Google Workspace admin console as a super admin: https://admin.google.com
- Go to Security → Access and data control → API controls → Manage Domain Wide Delegation
- Click Add new and paste:
- Client ID: (from above)
- OAuth scopes:
https://www.googleapis.com/auth/admin.directory.user.readonly
- Click Authorize
GCP_WORKSPACE_ADMIN_EMAIL to read the user directory.
Step 7: Enable the Google Cloud scripts
The Compute Engine endpoints below all read Cloud Asset Inventory at org scope, so
they are covered by the
roles/cloudasset.viewer grant from Step 3. No additional
role, API, or secret is needed for any of them — if Compute Instances works, they all
work.- Go to:
https://{companyname}.configview.com/admin/cron/ - You should see google-cloud in the list of available apps
- Enable scripts by tier — turn on the parents first; children will run automatically after them:
Identity & governance
Compute — core inventory
Cloud Asset does not split global and regional variants into separate asset types the way the Compute REST API splits the resources.
GlobalAddress, GlobalForwardingRule, RegionDisk and RegionBackendService are rejected as asset types — those resources come back under Address, ForwardingRule, Disk and BackendService, told apart by the location column (global or a region name). So there is nothing extra to enable for them.
Compute — cost & waste
Everything here maps to a line on the bill. None of it needs a new role or secret.Compute — security & network posture
Configuration that determines what is reachable and how. Mostly small tables; several are empty in orgs that do not use the feature, which is itself the answer.Compute — fleet shape & load balancing
The rest of the Compute surface: why VM counts move on their own, and the full load balancer chain behind a forwarding rule.Storage & data
Security
Cost & billing
These query the BigQuery billing export (see the export note in Step 3) and need theGCP_BILLING_* secrets.
- Click Save
Step 8: Verify
- Go to:
https://{companyname}.configview.com/admin/cron/ - Expand google-cloud and click the Health check button on the app header
- A passing run reports
overall: ok. On failure, the toast lists the failing checks — and the same result is written to the Activity log and emailed to your alert address. The health check also runs automatically right after any google-cloud script fails, so failures are captured even if you don’t trigger it by hand. - Projects, Organizations, and at least one Asset-API endpoint (e.g. Compute Instances) should pass
PERMISSION_DENIEDon Asset API —roles/cloudasset.viewernot granted at the organization level (project-level isn’t enough). Re-do Step 3 against the org.SERVICE_DISABLED: <API> has not been used in project X— That API isn’t enabled on the SA’s host project (Xis the project number). Applies tocloudasset,cloudresourcemanager,cloudbilling, andiam— enable the full set from the Prerequisite at the top. Calls are billed/quoted against the SA’s host project, not the org. Expect intermittentSERVICE_DISABLEDfor ~10–15 min after enabling while it propagates.PERMISSION_DENIEDon Service Usage — Missingroles/serviceusage.serviceUsageViewer.PERMISSION_DENIEDon billing — Missingroles/billing.viewer. Billing is granted at the billing account level, not org level, depending on your account structure.PERMISSION_DENIEDon Service Account Keys — Missingroles/iam.securityReviewerOR the customer turned off SA key listing via org policy (constraints/iam.disableServiceAccountKeyCreationis unrelated; the relevant constraint is on read).unauthorized_client: Client is unauthorized to retrieve access tokenson Cloud Identity Users — DWD client ID not authorized, or wrong scope. Re-do Step 6.- Billing cost/pricing returns
Access DeniedorNot found: Table— the SA is missingroles/bigquery.dataVieweron the billing-export project orroles/bigquery.jobUseron its own project, or aGCP_BILLING_*secret is wrong (project/dataset/account ID). Confirm the export table exists:bq ls <project>:<dataset>. - Audit Logs returns few/no rows —
roles/logging.viewermust be at the org so it covers all projects; Admin Activity is always on, but check theGCP_AUDIT_LOOKBACK_HOURSwindow. Transient500 Internal erroronentries.listis retried and bad projects are skipped automatically.
Data Tables
Selected highlights. Seemanifest.json for the full 62-table list.
The Cloud Asset-backed tables all share one shape. Every endpoint sourced from
Cloud Asset SearchAllResources — which is 46 of the 62, including all 36 Compute
tables — writes the same columns: name, asset_type, project, display_name,
location, state, create_time, update_time, labels_json,
network_tags_json, additional_attributes_json, resource_json, organization,
parent_full_resource_name, parent_asset_type, raw_json, run_at. Learn it once
and every one of them reads the same way.
Two of those columns hold the resource’s own fields and the difference matters:
additional_attributes_json— Cloud Asset’s search index. A small, type-specific set of fields it chose to index (a Disk getstype,sizeGb,users; a Route getsidand nothing else). Fast, but mostly absent.resource_json— the full resource body, exactly as the Compute API would return it. This is wheredestRange,expireTime,resourcePolicies,endTimestampand everything else actually lives.
resource_json. It is NULL on rows captured before the collectors began
requesting it, so a query that treats a missing field as a finding must also say
AND resource_json IS NOT NULL — otherwise every old row reads as a hit.
Where an endpoint bundles several asset types into one table (Target Proxies bundles
eight), filter on asset_type to pick one out.
What you can’t ingest with this setup
- Data Access / System Event / Policy Denied audit logs. Only Admin Activity audit logs are ingested (config changes). Data Access logs are off by default, very high volume, and not pulled in this version.
- Per-resource detailed metrics (CPU, network throughput, etc.). The Asset API gives configuration + metadata. Real-time metrics live in Cloud Monitoring.
- GCS bucket object listings. Buckets yes; objects no — that would multiply the row count by many orders of magnitude.
- Secret Manager secret payloads. ConfigView reads names and metadata only. Payloads stay in GCP.
- Compute Engine quota usage. Per-project and per-region quota limits and current
usage come from
compute.projects.get/compute.regions.list, which are not Cloud Asset types — they need a separate collector that walks every project. Not built yet. - Google’s own catalogs — machine types, disk types, accelerator types, zones, regions, interconnect locations. These are identical for every customer and reference data rather than inventory, so they are deliberately not ingested. SKU-level rates come from the billing pricing export instead.
- Compute operations logs (
globalOperations,regionOperations,zoneOperations). Resource-change churn is already covered by the Admin Activity audit log endpoint.