Depending on your needs, you might need to design your architecture to work across multiple projects when using Cloud Asset Inventory. The following scenarios are the most common:
Orchestrator projects: When you want a single project to trigger Cloud Asset Inventory operations in other projects.
Export across projects: When you want to export resource metadata from one project to another.
Each of these scenarios requires some setup to ensure that operations complete successfully.
Orchestrator projects
When you use a project to trigger Cloud Asset Inventory operations on resources in another project, in certain scenarios you need to specify that the default Cloud Asset Inventory service account in the other project be used to perform the operation. These scenarios include:
To set which service account to use, you set the billing project to the ID of the project that contains the resources you're operating on. If the billing project isn't specified, Cloud Asset Inventory uses the default Cloud Asset Inventory service account in the project that's making the call, which might not have the permissions required to complete the operation.
Although it isn't required for all operations, it can be good practice to always specify a billing project to minimize confusion.
gcloud
For the gcloud CLI, add the --billing-project
flag to your
command to specify the project ID that contains the correct service account:
--billing-project=BILLING_PROJECT_ID
Alternatively, you can set the billing project before you run commands with the gcloud CLI. First, check if the billing project is different from the core project:
gcloud config list
Then if you need to, set the billing project:
gcloud config set billing/quota_project BILLING_PROJECT_ID
Provide the following values:
BILLING_PROJECT_ID
: A project ID that has the Cloud Asset Inventory API is enabled, and a service account with permissions to manage your target Pub/Sub topic, Cloud Storage bucket, or BigQuery table.
REST
For the REST API, add the X-Goog-User-Project
header to specify the project
ID that contains the correct service account:
"X-Goog-User-Project: BILLING_PROJECT_ID"
Provide the following values:
BILLING_PROJECT_ID
: A project ID that has the Cloud Asset Inventory API is enabled, and a service account with permissions to manage your target Pub/Sub topic, Cloud Storage bucket, or BigQuery table.
Export across projects
To export asset metadata from one project, PROJECT_A
, to another, PROJECT_B
,
you must give the default Cloud Asset Inventory service account in PROJECT_A
access to
the resources in PROJECT_B
.
This enables two things:
You can export asset metadata from
PROJECT_A
into a Pub/Sub topic, Cloud Storage bucket, or BigQuery table located inPROJECT_B
.You can use
PROJECT_A
to export asset metadata fromPROJECT_B
into a Pub/Sub topic, Cloud Storage bucket, or BigQuery table located inPROJECT_B
.
To export asset metadata from one project into another, complete the following instructions:
Make sure that the Cloud Asset Inventory API is enabled in the project you want to run your request from,
PROJECT_A
.Make at least one call to the Cloud Asset Inventory API in
PROJECT_A
to create the default Cloud Asset Inventory service account. Alternatively, you can create it manually:gcloud beta services identity create \ --service=cloudasset.googleapis.com \ --project=PROJECT_A_ID gcloud projects add-iam-policy-binding PROJECT_A_ID \ --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/cloudasset.serviceAgent
How to find a Google Cloud project number
Google Cloud console
To find a Google Cloud project number, complete the following steps:
-
Go to the Welcome page in the Google Cloud console.
- Click the switcher list box in the menu bar.
-
Select your organization from the list box, and then search for your project name. The project name, project number, and project ID are shown near the Welcome heading.
Up to 4,000 resources are displayed. If you don't see the project you're looking for, go to the Manage resources page and filter the list using the name of that project.
gcloud CLI
You can retrieve a Google Cloud project number with the following command:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"
-
Grant the correct roles to the service account in
PROJECT_A
.To publish to a feed through Pub/Sub, grant the Pub/Sub Publisher role (
roles/pubsub.publisher
) role to the service account on the topic:gcloud pubsub topics add-iam-policy-binding projects/PROJECT_B_ID/topics/TOPIC_ID \ --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/pubsub.publisher
To write to a Cloud Storage bucket, grant the Storage admin (
roles/storage.admin
) role to the service account on the bucket:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/storage.objectCreator
To write to a BigQuery table, grant the BigQuery Data Editor (
roles/bigquery.dataEditor
) and BigQuery user (roles/bigquery.user
) roles to the service account on the project:gcloud projects add-iam-policy-binding PROJECT_B_ID \ --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/bigquery.user gcloud projects add-iam-policy-binding PROJECT_B_ID \ --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \ --role=roles/bigquery.dataEditor
If you make a Cloud Asset Inventory request with the gcloud CLI from
PROJECT_B
or use the REST API, make sure to
specify PROJECT_A
as the billing project.