将资产元数据导出到 BigQuery

本文档介绍如何将组织、文件夹或项目的资产快照导出到 BigQuery 表,然后对目录运行数据分析。BigQuery 提供类似于 SQL 的体验,让用户可以分析数据,并生成有意义的分析洞见,而无需使用自定义脚本。

准备工作

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

    启用 Cloud Asset Inventory API

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

  3. 创建要导出到的 BigQuery 数据集(如果您还没有)。

限制

  • 导出 BigQuery 表数据时,Cloud Asset Inventory 不支持所有字段。

  • 频繁更改的资源字段(例如 numBytesnumLongTermBytesnumPhysicalBytesnumRows)可能会导出为 null 值。

  • 不支持导出到 BigQuery 聚簇表。

  • 除非您导出到分区表,否则不支持将导出输出附加到现有表。目标表必须为空,或必须覆盖目标表。如需覆盖目标表,请将 --output-bigquery-force 标志与 gcloud CLI 配合使用,或将 "force": true 与 REST API 配合使用。

  • 导出到每个资源类型的单独表格时,不支持 Google Kubernetes Engine (GKE) 资源类型(container.googleapis.com/Clustercontainer.googleapis.com/NodePool 除外)。

  • 如果之前向同一目标发出的请求在不到 15 分钟前开始,并且仍在运行,Cloud Asset Inventory 会拒绝新的导出请求。不过,如果导出花费的时间超过 15 分钟,系统会将其标记为已完成,并允许向同一目的地发出新的导出请求。

  • ACCESS_POLICY 内容类型只能在组织级层导出。

  • 如果您要导出到的表已存在,并且正在导出到该表,则会返回 400 错误。

大小写

字段名称采用不同的命名惯例,具体取决于所请求的内容类型和导出设置:

  • 对于 RESOURCE 内容类型,当您按素材资源类型将素材资源导出到表格时,字词之间没有空格,并且第一个字词之后的每个新字词的首字母都大写。例如 assetType

  • 对于所有其他内容类型,字段名称均为小写,空格替换为下划线。例如 asset_type

用于导出的 BigQuery 架构

每个 BigQuery 表由描述列名、数据类型和其他信息的架构进行定义。为导出设置内容类型会决定表的架构:

  • 资源或未指定:如果将内容类型设置为 RESOURCE 或未指定内容类型,并将 per-asset-type 标志设置为 false 或未使用该标志,就会创建具有以下架构的 BigQuery 表。

    资源架构

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_document_uri",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "resource_url",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "parent",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "data",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "location",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "resource",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]

    resource.data 列是表示为 JSON 字符串的资源元数据。

    如果您将内容类型设置为 RESOURCE 或未设置内容类型,并将 per-asset-type 标志设置为 true,则会为每种资产类型创建单独的表。每个表的架构都包含映射到相应资产类型的 Resource.data 字段中的嵌套字段的 RECORD 类型列(最多可为 BigQuery 支持的 15 个嵌套级别)。如需查看示例表,请在 Google Cloud 控制台中参阅 export-assets-examples

  • IAM 政策:如果在 REST API 中将内容类型设置为 IAM_POLICY,或在 gcloud CLI 中将内容类型设置为 iam-policy,就会创建具有以下架构的 BigQuery 表。

    IAM 政策架构

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "INTEGER"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "role",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "members",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "expression",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "description",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "location",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "condition",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "bindings",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "service",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "log_type",
                    "type": "INTEGER"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "exempted_members",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "audit_log_configs",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "audit_configs",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "iam_policy",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",