使用 SQL 查询资产

您可以使用与 BigQuery SQL 兼容的方言查询项目、文件夹或组织中的素材资源。

准备工作

  1. 在您将运行 Cloud Asset Inventory 命令的项目中启用 Cloud Asset Inventory API。

    启用 Cloud Asset Inventory API

  2. 确保您的账号具有调用 Cloud Asset Inventory API 的正确角色。如需了解每种通话类型的具体权限,请参阅权限

限制

您可以查询的表

您可以查询以下表:

  • 对于 RESOURCE 内容类型,数据集中的表名称与资产类型名称相对应(假设资产类型存在)。例如,compute_googleapis_com_Instance 表包含 Compute Engine 实例元数据。

  • 对于非 RESOURCE 内容类型,数据集中的表名称与 RPC/REST 内容类型名称相对应。例如 ACCESS_POLICY

  • 如需跨资源类型查询资源标准元数据,请使用表名称 STANDARD_METADATA。这包括除 resource.DATA(特定于每种资源类型)之外的所有字段。

查询资产元数据

控制台

如需查询项目、文件夹或组织的资源元数据,请完成以下步骤:

  1. 在 Google Cloud 控制台中,前往资产库存页面上的资产查询标签页。

    前往“资产查询”页面

    如果系统未显示资产查询标签页,则表示您需要访问 Security Command Center 高级或企业版,或 Gemini Cloud Assist

  2. 切换到要查询的项目、文件夹或组织。
  3. 点击素材资源查询标签页。
  4. 如需查询资产元数据,请使用示例查询或构建自己的查询:

    • 如需使用示例,请点击查询库标签页中的条目以预览查询。点击“应用”将该示例复制到修改查询框中,然后修改该查询或点击运行以执行该查询。
    • 如需构建您自己的查询,请直接在修改查询框中输入查询文本,然后点击运行以执行查询。为帮助您编写自己的查询,您可以点击选择表格窗格中的表格,预览其架构和内容。如需了解如何构建查询,请参阅 查询语法

    与查询匹配的素材资源元数据会显示在查询结果标签页中。

  5. 可选:如需以 CSV 格式下载查询结果集,请点击导出

    CSV 文件的大小上限为 2 MB。如果下载请求因文件大小超出此限制而失败,系统会显示一条消息,其中包含有关导出完整结果的说明。

gcloud

gcloud asset query \
    --SCOPE \
    --statement="SQL_SELECT_QUERY" \
    --timeout="TIMEOUTs"

请提供以下值:

  • SCOPE:请使用以下某个值:

    • project=PROJECT_ID,其中 PROJECT_ID 是包含您要查询的素材资源的项目的 ID。
    • folder=FOLDER_ID,其中 FOLDER_ID 是包含您要查询的素材资源的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索位于组织级别的 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹中的子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要查询的资源的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY:SQL SELECT查询。
  • TIMEOUT:可选。客户端在等待查询完成之前应等待的最长时间(以秒为单位)。使用超时异步运行查询,并使用作业引用稍后检索结果

如需了解所有选项,请参阅 gcloud CLI 参考文档

示例

运行以下命令可获取 my-project 项目中前两个 Compute Engine 实例的名称和资产类型。

gcloud asset query \
    --project=my-project \
    --statement="
      SELECT
        name, assetType
      FROM
        compute_googleapis_com_Instance
      LIMIT 2"

已完成的作业响应

以下示例显示了对上一个示例查询的响应。响应包含作业引用,并告知您作业是否已完成 (done: true)。如果作业已完成,系统会使用适当的数据填充 queryResult 对象,并在之后列出结果。

done: true
jobReference: 0000000000000000000000000000000000000000000000000000000000000000
queryResult:
  nextPageToken: ''
  totalRows: '2'

name: //compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-1
assetType: compute.googleapis.com/Instance

name: //compute.googleapis.com/projects/my-project/zones/us-central1-c/instances/instance-2
assetType: compute.googleapis.com/Instance

未完成的作业响应

如果您在请求中设置了超时,系统会异步执行查询,并向您发送一条指示作业未完成的响应 (done: false)。这类响应包含作业引用和未填充的 queryResult 对象:

done: false
jobReference: 0000000000000000000000000000000000000000000000000000000000000000
queryResult:
  nextPageToken: ''
  totalRows: '0'

在作业完成且数据可用后,您可以使用 jobReference稍后检索查询结果

REST

HTTP 方法和网址:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

请求 JSON 正文:

{
  "statement": "SQL_SELECT_QUERY",
  "timeout": "TIMEOUTs",
  "pageSize": "PAGE_SIZE",
  "pageToken": "PAGE_TOKEN"
}

请提供以下值:

  • SCOPE_PATH:请使用以下某个值:

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是包含您要查询的素材资源的项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是包含您要查询的资产的项目的编号。

      如何查找 Google Cloud 项目编号

      Google Cloud 控制台

      如需查找 Google Cloud 项目编号,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的欢迎页面。

        前往“欢迎”页面

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织,然后搜索项目名称。 项目名称、项目编号和项目 ID 显示在欢迎标题附近。

        最多显示 4,000 个资源。如果您没有看到要查找的项目,请前往管理资源页面,然后使用该项目的名称过滤列表。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 项目编号:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID,其中 FOLDER_ID 是包含您要查询的素材资源的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索组织级 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要查询的资源的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY:SQL SELECT查询。
  • TIMEOUT:可选。客户端在等待查询完成之前应等待的最长时间(以秒为单位)。使用超时异步运行查询,并使用作业引用稍后检索结果
  • PAGE_SIZE:可选。每页返回的结果数。最大值是 500。如果该值设为 0 或负值,系统会选择相应的默认值。系统会返回 nextPageToken 以检索后续结果。

  • PAGE_TOKEN:可选。长请求响应会分布在多个页面上。如果未指定 pageToken,则返回第一页。 您可以使用上一个响应的 nextPageToken 作为 pageToken 值来调用后续页面。

如需了解所有选项,请参阅 REST 参考文档

命令示例

运行以下命令之一,即可获取 my-project 项目中前两个 Compute Engine 实例的名称和资产类型。

curl(Linux、macOS 或 Cloud Shell)

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "statement": "
              SELECT
                name, assetType
              FROM
                compute_googleapis_com_Instance
              LIMIT 2"
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "statement": "
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2"
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

已完成的作业响应

以下示例显示了对上一个示例查询的响应。响应包含作业引用,并告知您作业是否已完成 ("done": true)。如果作业已完成,则 queryResult 对象会填充适当的数据。

查询结果会拆分为 rows(包含资产元数据的数组)和 schema(用于描述 rows 数组中每个资产的架构的对象)。这样做是为了最大限度地减少大型响应中字段名称和类型的重复。

同样,rows 数组中使用 fv,而不是 fieldsvalue,以尽可能缩减响应大小。

{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000",
  "done": true,
  "queryResult": {
    "rows": [
      {
        "f": [
          {
            "v": "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-1"
          },
          {
            "v": "compute.googleapis.com/Instance"
          }
        ]
      },
      {
        "f": [
          {
            "v": "//compute.googleapis.com/projects/my-project/zones/us-central1-a/instances/instance-2"
          },
          {
            "v": "compute.googleapis.com/Instance"
          }
        ]
      }
    ],
    "schema": {
      "fields": [
        {
          "field": "name",
          "type": "STRING",
          "mode": "NULLABLE",
          "fields": []
        },
        {
          "field": "assetType",
          "type": "STRING",
          "mode": "NULLABLE",
          "fields": []
        }
      ]
    },
    "nextPageToken": "",
    "totalRows": "1"
  }
}

未完成的作业响应

如果您在请求中设置了超时,系统会异步执行查询,并向您发送一条指示作业未完成的响应 ("done": false)。这类响应包含作业引用和未填充的 queryResult 对象:

{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000",
  "done": false,
  "queryResult": {
    "rows": [],
    "schema": {
      "fields": []
    },
    "nextPageToken": "",
    "totalRows": "0"
  }
}

在作业完成且数据可用后,您可以使用 jobReference稍后检索查询结果

稍后检索查询结果

如需稍后检索花费较长时间才能完成的请求,请发出以下任一请求。

gcloud

gcloud asset query \
    --SCOPE \
    --job-reference="JOB_REFERENCE"

请提供以下值:

  • SCOPE:请使用以下某个值:

    • project=PROJECT_ID,其中 PROJECT_ID 是包含您要查询的素材资源的项目的 ID。
    • folder=FOLDER_ID,其中 FOLDER_ID 是包含您要查询的素材资源的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索位于组织级别的 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹中的子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要查询的资源的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • JOB_REFERENCE:上一个响应中返回的工作引用值。

示例

运行以下命令可获取之前在 my-project 项目中运行的查询的结果。

gcloud asset query \
    --project=my-project \
    --job-reference="0000000000000000000000000000000000000000000000000000000000000000"

REST

HTTP 方法和网址:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

请求 JSON 正文:

{
  "jobReference": "JOB_REFERENCE",
  "pageToken": "PAGE_TOKEN"
}

请提供以下值:

  • SCOPE_PATH:请使用以下某个值:

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是包含您要查询的素材资源的项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是包含您要查询的资产的项目的编号。

      如何查找 Google Cloud 项目编号

      Google Cloud 控制台

      如需查找 Google Cloud 项目编号,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的欢迎页面。

        前往“欢迎”页面

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织,然后搜索项目名称。 项目名称、项目编号和项目 ID 显示在欢迎标题附近。

        最多显示 4,000 个资源。如果您没有看到要查找的项目,请前往管理资源页面,然后使用该项目的名称过滤列表。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 项目编号:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID,其中 FOLDER_ID 是包含您要查询的素材资源的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索组织级 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要查询的资源的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • JOB_REFERENCE:上一个响应中返回的工作引用值。
  • PAGE_TOKEN:可选。长请求响应会分布在多个页面上。如果未指定 pageToken,则返回第一页。 您可以使用上一个响应的 nextPageToken 作为 pageToken 值来调用后续页面。

命令示例

运行以下命令之一可获取之前运行的查询的结果。

curl(Linux、macOS 或 Cloud Shell)

curl -X POST \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "jobReference": "0000000000000000000000000000000000000000000000000000000000000000"
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "jobReference": "0000000000000000000000000000000000000000000000000000000000000000"
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

将查询结果导出到 BigQuery

查询结果会作为 Query Assets API 响应返回。如需将结果导出到您自己的 BigQuery 表,请在请求中指定 BigQuery 目标位置。如果您还没有 BigQuery 数据集,则必须先创建 BigQuery 数据集,然后才能发出这些请求。

gcloud

gcloud asset query \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --statement="SQL_SELECT_QUERY" \
    --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
    --write-disposition="WRITE_METHOD"

请提供以下值:

  • SCOPE:请使用以下某个值:

    • project=PROJECT_ID,其中 PROJECT_ID 是包含您要使用 SQL 查询导出的资产元数据的项目的 ID。
    • folder=FOLDER_ID,其中 FOLDER_ID 是包含您要使用 SQL 查询导出的素材资源元数据的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索位于组织级别的 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要使用 SQL 查询导出的资产元数据的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • SQL_SELECT_QUERY:SQL SELECT查询。
  • BIGQUERY_PROJECT_ID:您要将 BigQuery 表导出到的项目的 ID。
  • DATASET_ID:BigQuery 数据集的 ID。
  • TABLE_NAME:要将元数据导出到的 BigQuery 表。如果该目录不存在,系统会创建一个。
  • WRITE_METHOD:指定在 BigQuery 目标表或分区已存在时执行的操作。支持以下值:

    • write-empty:默认值。如果现有表包含数据,作业结果中会返回重复错误。
    • write-append:将数据附加到表或最新分区。
    • write-truncate:覆盖整个表或所有分区数据。

示例

运行以下命令可获取 my-project 项目中前两个 Compute Engine 实例的名称和资产类型,并将结果导出到 my-project 项目中的 my-table BigQuery 表,如果该表已存在,则会覆盖整个表。

gcloud asset query \
  --project=my-project \
  --statement="
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2" \
  --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \
  --write-disposition="write-truncate"

REST

HTTP 方法和网址:

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:queryAssets

标头:

X-Goog-User-Project: BILLING_PROJECT_ID

请求 JSON 正文:

{
  "statement": "SQL_SELECT_QUERY",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID",
      "table": "TABLE_NAME",
      "writeDisposition": "WRITE_METHOD"
    }
  },
  "pageSize": "PAGE_SIZE"
}

请提供以下值:

  • SCOPE_PATH:请使用以下某个值:

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是包含您要使用 SQL 查询导出的资产元数据的项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是包含您要使用 SQL 查询导出的资源元数据的项目的编号。

      如何查找 Google Cloud 项目编号

      Google Cloud 控制台

      如需查找 Google Cloud 项目编号,请完成以下步骤:

      1. 前往 Google Cloud 控制台中的欢迎页面。

        前往“欢迎”页面

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织,然后搜索项目名称。 项目名称、项目编号和项目 ID 显示在欢迎标题附近。

        最多显示 4,000 个资源。如果您没有看到要查找的项目,请前往管理资源页面,然后使用该项目的名称过滤列表。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 项目编号:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID,其中 FOLDER_ID 是包含您要使用 SQL 查询导出的素材资源元数据的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 文件夹的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 搜索您的文件夹名称。文件夹 ID 显示在文件夹名称旁边。

      gcloud CLI

      您可以使用以下命令检索组织级 Google Cloud 文件夹的 ID:

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      其中 TOP_LEVEL_FOLDER_NAME 是文件夹名称的部分或完整字符串匹配。移除 --format 标志可查看有关找到的文件夹的更多信息。

      上一条命令不会返回文件夹内子文件夹的 ID。为此,请使用顶级文件夹的 ID 运行以下命令:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID,其中 ORGANIZATION_ID 是包含您要使用 SQL 查询导出的资产元数据的组织的 ID。

      如何查找 Google Cloud 组织的 ID

      Google Cloud 控制台

      如需查找 Google Cloud 组织的 ID,请完成以下步骤:

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

      2. 点击菜单栏中的切换器列表框。
      3. 从列表框中选择您的组织。
      4. 点击全部标签页。组织 ID 显示在组织名称旁边。

      gcloud CLI

      您可以使用以下命令检索 Google Cloud 组织的 ID:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID:默认 Cloud Asset Inventory 服务代理所在的项目 ID,该代理有权管理您的 BigQuery 数据集和表。 详细了解如何设置结算项目

  • SQL_SELECT_QUERY:SQL SELECT查询。
  • BIGQUERY_PROJECT_ID:您要将 BigQuery 表导出到的项目的 ID。
  • DATASET_ID:BigQuery 数据集的 ID。
  • TABLE_NAME:要将元数据导出到的 BigQuery 表。如果该目录不存在,系统会创建一个。
  • WRITE_METHOD:指定在 BigQuery 目标表或分区已存在时执行的操作。支持以下值:

    • WRITE_EMPTY:默认值。如果现有表包含数据,作业结果中会返回重复错误。
    • WRITE_APPEND:将数据附加到表或最新分区。
    • WRITE_TRUNCATE:覆盖整个表或所有分区数据。
  • PAGE_SIZE:可选。每页返回的结果数。最大值是 500。如果该值设为 0 或负值,系统会选择相应的默认值。系统会返回 nextPageToken 以检索后续结果。

命令示例

运行以下命令之一,获取 my-project 项目中前两个 Compute Engine 实例的名称和资产类型,并将结果导出到 my-project 项目中的 my-table BigQuery 表,如果该表已存在,则覆盖整个表。

curl(Linux、macOS 或 Cloud Shell)

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "statement": "
              SELECT
                name, assetType
              FROM
                compute_googleapis_com_Instance
              LIMIT 2",
            "outputConfig": {
              "bigqueryDestination": {
                "dataset": "projects/my-project/datasets/my-dataset",
                "table": "my-table",
                "writeDisposition": "WRITE_TRUNCATE"
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-Goog-User-Project" = "BILLING_PROJECT_ID";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "statement": "
    SELECT
      name, assetType
    FROM
      compute_googleapis_com_Instance
    LIMIT 2",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/my-project/datasets/my-dataset",
      "table": "my-table",
      "writeDisposition": "WRITE_TRUNCATE"
    }
  }
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:queryAssets" | Select-Object -Expand Content

其他 SQL 查询示例

以下代码示例展示了可用于搜索素材资源的特定 SQL 查询,以帮助您构建自己的查询。

特定区域中的 Compute Engine 虚拟机实例

此外,还要返回其 name 和创建时间。

SELECT
  name,
  resource.DATA.creationTimestamp
FROM
  compute_googleapis_com_Instance
WHERE
  resource.location LIKE '%asia%'

每个项目中有多少个 BigQuery 数据集

  SELECT
    ancestor AS project,
    COUNT(*)
  FROM
    bigquery_googleapis_com_Dataset
  CROSS JOIN
    UNNEST (ancestors) AS ancestor
  WHERE
    ancestor LIKE '%project%'
  GROUP BY
    ancestor
  ORDER BY
    2 DESC

每个区域中的 Compute Engine 虚拟机实例数量

SELECT
  resource.location,
  COUNT(*)
FROM
  compute_googleapis_com_Instance
GROUP BY
  resource.location

某个区域中所有资源的名称和 assetType

SELECT
  name,
  assetType
FROM
  STANDARD_METADATA
WHERE
  resource.location LIKE '%asia%'

公开提供的 Cloud Storage 存储分区

此外,还要返回其 name

SELECT
  name
FROM
  IAM_POLICY
CROSS JOIN
  UNNEST(iamPolicy.bindings) AS binding
WHERE
  ('allUsers' IN UNNEST(binding.members)
  OR 'allAuthenticatedUsers' IN UNNEST(binding.members))
  AND assetType = 'storage.googleapis.com/Bucket'

未挂接虚拟机实例的子网

SELECT
  subnetwork_table.name
FROM
  compute_googleapis_com_Subnetwork AS subnetwork_table
LEFT JOIN (
  SELECT
    interface.subnetwork AS subnetwork
  FROM
    compute_googleapis_com_Instance
  CROSS JOIN
    UNNEST(resource.DATA.networkInterfaces) AS interface) AS instance_table
ON
  SUBSTR(subnetwork_table.name, 25) = SUBSTR(instance_table.subnetwork,38)
WHERE
  instance_table.subnetwork IS NULL
  AND NOT subnetwork_table.name LIKE '%default%'