常见问题解答和问题排查

以下列出了与 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

我的 Cloud SDK 或 Cloud Shell 凭据为何被拒绝?

如果包含用户项目的请求从 Cloud SDK 或 Cloud Shell 发送到 cloudasset.googleapis.com,您将看到如下所示的错误消息:

Your application has authenticated using end user credentials from the
Cloud SDK 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 工具,请在 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.userroles/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"