以下列出了与 Cloud Asset API 交互时可能出现的常见问题以及如何处理这些问题。
Cloud Asset Inventory 是否为全球服务?
是。Cloud Asset API 不依赖于位置。它具有一个全球端点,该端点提供 Cloud Asset Inventory 中所有受支持的区域和全球资源的元数据。Cloud Asset API 可以在任何可用区中访问。
为什么我的请求具有无效的身份验证凭据?
如果您尚未正确设置 OAuth 标头,进行调用时将返回以下错误:
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected
OAuth 2 access token, login cookie or other valid
authentication credential. See
https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"detail": "Authentication error: 2"
}
]
}
}
要解决该问题,请重复验证您的初始设置中的步骤。
为什么我无权使用 Cloud Asset API?
如果您无权导出资产,或者无权获取组织、项目或文件夹的历史记录,则系统会返回错误。
例如,若您不具备权限,则运行以下命令:
gcurl -d '{"outputConfig":{"gcsDestination": \ {"uri":gs://YOUR_BUCKET/NEW_FILE}}}' \ https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets
将返回以下错误:
{ "error": { "code": 403, "message": "The caller does not have permission", "status": "PERMISSION_DENIED", "details": [ { "@type": "type.googleapis.com/google.rpc.DebugInfo", "detail": "[ORIGINAL ERROR] generic::permission_denied: Request denied by Cloud IAM." } ] } }
要解决该问题,请向项目、文件夹或组织管理员请求访问权限。根据要导出或获取历史记录的资产,您需要以下其中一个角色或包含所需 Cloud Asset API 权限的其他角色:
cloudasset.viewer
cloudasset.owner
如需详细了解角色和权限,请参阅了解角色。
如需详细了解 Cloud Asset API 的访问权限控制选项,请参阅访问权限控制。
为什么我的导出到 Cloud Storage 命令失败?
如果用于存储导出数据的 Cloud Storage 存储分区不属于您正在运行导出作业且已启用 Cloud Asset API 的项目,则执行请求将产生以下“权限被拒绝”错误:
{ "error": { "code": 7, "message": "Failed to write to: YOUR_BUCKET/FILE", } }
要解决此问题,请使用属于您从其中运行导出且已启用 Cloud Asset API 的项目的 Cloud Storage 存储分区,或者向 service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
服务帐号授予 roles/storage.admin
角色其中,PROJECT_NUMBER 是您从其中运行导出且已启用 Cloud Asset API 的项目的项目编号。
为什么 Cloud Asset API 结果已过时?
系统会尽力确保 Cloud Asset API 中数据的新鲜度。虽然几乎所有资产更新都将在数分钟内可供客户端使用,但在极少数情况下,Cloud Asset API 方法的结果可能不会包含最新的资产更新。
为什么运行 ExportAssets
后输出临时文件?
ExportAssets
操作可能会在输出文件夹中创建临时文件。操作正在进行时,请勿移除这些临时文件。
操作完成后,系统会自动移除临时文件。
如果临时文件仍然存在,则您可以在 ExportAssets
操作完成后,安全地移除这些临时文件。
如果请求网址过长无法用于 BatchGetAssetsHistory
该怎么办?
BatchGetAssetsHistory
方法是 HTTP GET 操作,该操作在有限长度的网址中发送所有请求数据。因此,如果请求过长,将发生错误。
要避免出现此错误,客户端代码应将 Content-Type
设为 application/x-www-form-urlencoded
并使用 X-HTTP-Method-Override: GET
HTTP 标头的 HTTP POST 来发送请求。如需了解详情,请参阅长请求网址。
以下是使用 HTTP POST 的 BatchGetAssetsHistory
请求示例:
curl -X POST -H "X-HTTP-Method-Override: GET" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "Authorization: Bearer" \ -d 'assetNames=&contentType=1&readTimeWindow.startTime=2018-09-01T09:00:00Z' \ https://cloudasset.googleapis.com/v1/projects/ :batchGetAssetsHistory
为什么我的 Google Cloud CLI 或 Cloud Shell 凭据被拒绝?
如果包含用户项目的请求从 Google Cloud CLI 或 Cloud Shell 发送到 cloudasset.googleapis.com
,您将看到如下所示的错误消息:
Your application has authenticated using end user credentials from the Google Cloud CLI or Cloud Shell which are not supported by the cloudasset.googleapis.com. We recommend that most server applications use service accounts instead. For more information about service accounts and how to use them in your application, see https://cloud.google.com/docs/authentication/.
要解决此问题,请将用户项目设置为启用了 Cloud Asset API 的用户项目 ID。这可以通过在 HTTP 请求中指定 HTTP 标头 X-Goog-User-Project
来实现。
如果您使用的是 curl,则可通过添加以下参数来实现此目的:
-H 'X-Goog-User-Project: PROJECT_ID'
如果您使用的是 gcloud
CLI,请在 gcloud asset
命令中指定标志 --billing-project <var>PROJECT_ID</var>
,或者使用以下命令:
gcloud config set billing/quota_project PROJECT_ID
如何将资产导出到不属于当前项目的 BigQuery 表?
当您从启用了 Cloud Asset API 的项目 (A) 调用 ExportAssets
API 时,它将使用 service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
服务帐号写入目标 BigQuery 表。要输出到另一个项目 (B) 中的 BigQuery 表,请执行以下操作:
在项目 B 的 Identity and Access Management (IAM) 政策中,向服务帐号 (service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
) 授予 roles/bigquery.user
和 roles/bigquery.dataEditor
角色。
为什么同一资产具有不同的祖先实体?
在调用 Cloud Asset API 获取不同的元数据类型时(例如同一资产的 RESOURCE
元数据和 IAM POLICY
元数据),ancestors
字段可能会在内容类型之间不一致。这是因为每种内容类型都有不同的数据提取时间表,因此在提取流程完成之前,它们可能会不一致。检查 update_time
字段,确保资源具有最新的信息。
如果不一致的情况持续超过 24 小时,请与我们联系。
应以怎样的频率调用 ExportAssets
API?
我们建议依序对同一组织/文件夹/项目调用 ExportAssets
API;例如,在上一个调用完成后再发出第二个调用。如需实时捕获资产更新,请考虑使用实时通知。
接收到重复的资产更新
设置实时通知后,您可能会 Pub/Sub 主题中收到重复的资产更新。这是自动尝试重试传送导致的,因为 Pub/Sub 不保证至少传送一次。
为什么我没有收到项目删除通知?
项目关停后,您可以在 30 天内撤消操作。只有在项目被永久删除后,才会设置通知中的 deleted
字段。如需监控待删除的项目,您可以在项目的 lifecycleState
上设置具有条件的 Feed,例如 temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED"
。