根据您的需求,在使用 Cloud Asset Inventory 时,您可能需要设计可在多个项目中运行的架构。以下是最常见的几种情况:
每种情形都需要进行一些设置,以确保操作成功完成。
Orchestrator 项目
当您使用一个项目来触发对另一个项目中的资源执行 Cloud Asset Inventory 操作时,在某些情况下,您需要指定使用另一个项目中的默认 Cloud Asset Inventory 服务账号来执行该操作。这些情况包括:
如需设置要使用的服务账号,请将结算项目设置为您要操作的资源所在项目的 ID。如果未指定结算项目,Cloud Asset Inventory 会使用发出调用的项目中的默认 Cloud Asset Inventory 服务账号,该账号可能没有完成操作所需的权限。
虽然并非所有操作都需要指定结算项目,但始终指定结算项目可以最大限度地减少混淆。
gcloud
对于 gcloud CLI,请在命令中添加 --billing-project 标志,以指定包含正确服务账号的项目 ID:
--billing-project=BILLING_PROJECT_ID
或者,您也可以在通过 gcloud CLI 运行命令之前设置结算项目。首先,检查结算项目是否与核心项目不同:
gcloud config list
然后,根据需要设置结算项目:
gcloud config set billing/quota_project BILLING_PROJECT_ID
请提供以下值:
BILLING_PROJECT_ID:已启用 Cloud Asset Inventory API 的项目 ID,以及具有管理目标 Pub/Sub 主题、Cloud Storage 存储桶或 BigQuery 表权限的服务账号。
REST
对于 REST API,请添加 X-Goog-User-Project 标头以指定包含正确服务账号的项目 ID:
"X-Goog-User-Project: BILLING_PROJECT_ID"
请提供以下值:
BILLING_PROJECT_ID:已启用 Cloud Asset Inventory API 的项目 ID,以及具有管理目标 Pub/Sub 主题、Cloud Storage 存储桶或 BigQuery 表权限的服务账号。
跨项目导出
如需将资产元数据从一个项目 (PROJECT_A) 导出到另一个项目 (PROJECT_B),您必须向 PROJECT_A 中的默认 Cloud Asset Inventory 服务账号授予对 PROJECT_B 中资源的访问权限。
这样可以实现以下两点:
您可以将资产元数据从
PROJECT_A导出到位于PROJECT_B中的 Pub/Sub 主题、Cloud Storage 存储桶或 BigQuery 表。您可以使用
PROJECT_A将资产元数据从PROJECT_B导出到位于PROJECT_B中的 Pub/Sub 主题、Cloud Storage 存储桶或 BigQuery 表。
如需将资产元数据从一个项目导出到另一个项目,请完成以下说明:
确保在您要从中运行请求的项目
PROJECT_A中启用 Cloud Asset Inventory API。在
PROJECT_A中至少调用一次 Cloud Asset Inventory API,以创建默认的 Cloud Asset Inventory 服务账号。或者,您也可以手动创建: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如何查找 Google Cloud 项目编号
Google Cloud 控制台
如需查找 Google Cloud 项目编号,请完成以下步骤:
gcloud CLI
您可以使用以下命令检索 Google Cloud 项目编号:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"
在
PROJECT_A中向服务账号授予正确的角色。如需通过 Pub/Sub 发布到 Feed,请向主题上的服务账号授予 Pub/Sub Publisher 角色 (
roles/pubsub.publisher):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如需写入 Cloud Storage 存储桶,请向该存储桶上的服务账号授予 Storage Admin (
roles/storage.admin) 角色: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.admin如需写入 BigQuery 表,请向项目中的服务账号授予 BigQuery Data Editor (
roles/bigquery.dataEditor) 和 BigQuery User (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 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 CLI 从 PROJECT_B 发出 Cloud Asset Inventory 请求,或使用 REST API 发出 Cloud Asset Inventory 请求,请务必将 PROJECT_A 指定为结算项目。