使用 Pub/Sub 监控资产更改

您可以创建并订阅 Feed,以接收有关资源和政策更改的实时通知。

创建 Feed 时,您可以指定希望监控组织、文件夹、项目中受支持的资源类型、IAM 政策、访问权限政策和组织政策的更改。此外,您可以向 Feed 添加条件,以便仅在资产发生某些类型的更改时接收通知。

创建 Feed 后,只要指定资产发生更改,您将通过 Pub/Sub 收到通知。发布到 Pub/Sub 主题的第一条消息是字符串格式的欢迎辞,之后的所有消息均采用 TemporalAsset 格式。

以下是 RESOURCE 内容类型的 Pub/Sub 消息示例。

{
  "asset":{
    "ancestors":[
      "projects/000000000000",
      "folders/000000000000",
      "organizations/000000000000"
    ],
    "assetType":"storage.googleapis.com/Bucket",
    "name":"//storage.googleapis.com/my-bucket",
    "resource":{
      "data":{
        LATEST_ASSET_METADATA
      },
      "discoveryDocumentUri":"https://www.googleapis.com/discovery/v1/apis/storage/v1/rest",
      "discoveryName":"Bucket",
      "location":"us",
      "parent":"//cloudresourcemanager.googleapis.com/projects/000000000000",
      "version":"v1"
    },
    "updateTime":"2024-01-30T00:00:00.000000Z"
  },
  "priorAsset":{
    "ancestors":[
      "projects/000000000000",
      "folders/000000000000",
      "organizations/000000000000"
    ],
    "assetType":"storage.googleapis.com/Bucket",
    "name":"//storage.googleapis.com/my-bucket",
    "resource":{
      "data":{
        PREVIOUS_ASSET_METADATA
      },
      "discoveryDocumentUri":"https://www.googleapis.com/discovery/v1/apis/storage/v1/rest",
      "discoveryName":"Bucket",
      "location":"us",
      "parent":"//cloudresourcemanager.googleapis.com/projects/000000000000",
      "version":"v1"
    },
    "updateTime":"2024-01-29T00:00:00.000000Z"
  },
  "priorAssetState":"PRESENT",
  "window":{
    "startTime":"2024-01-30T00:00:00.000000Z"
  }
}

如需详细了解 Pub/Sub 或如何设置订阅,请参阅 Pub/Sub 文档

准备工作

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

    启用 Cloud Asset Inventory API

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

  3. 如果您还没有 Pub/Sub 主题,请创建一个 Pub/Sub 主题

限制

  • 任何 Feed 创建、更新或删除操作最长可能需要 10 分钟才能生效。

  • 创建 Feed 的项目必须比 Feed 存在时间更长。这是因为用于发布到目标 Pub/Sub 主题的服务账号位于该项目中。Feed 将不再起作用,而且会在项目删除后尽快删除。

  • 您可以为一个父级创建最多 200 个 Feed。此限制仅适用于直接跟踪父项的 Feed,而不会计入其子资源的 Feed。例如,如果您的某个组织中有 10 个项目,每个项目最多可以有 200 个 Feed,则该组织最多可以有 200 个 Feed。

创建 Feed

gcloud

gcloud asset feeds create FEED_ID \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --pubsub-topic=projects/TOPIC_PROJECT_ID/topics/TOPIC_ID \
    --asset-names=ASSET_NAME_1,ASSET_NAME_2,... \
    --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \
    --content-type=CONTENT_TYPE \
    --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \
    --condition-title="CONDITION_TITLE" \
    --condition-description="CONDITION_DESCRIPTION" \
    --condition-expression="CONDITION_EXPRESSION"

请提供以下值:

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

    • project=PROJECT_ID,其中 PROJECT_ID 是要在其中创建 Feed 的项目的 ID。
    • folder=FOLDER_ID,其中 FOLDER_ID 是要在其中创建 Feed 的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

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

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台

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

      gcloud CLI

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

      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 是要在其中创建 Feed 的组织的 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))"
  • FEED_ID:一种唯一的素材资源 Feed 标识符。
  • BILLING_PROJECT_ID:可选。默认 Cloud Asset Inventory 服务代理所在的项目 ID,该服务代理拥有管理您的 Pub/Sub 主题的权限。 详细了解如何设置结算项目

  • TOPIC_PROJECT_ID:Pub/Sub 主题所在项目的 ID。
  • TOPIC_ID:要将通知发布到的 Pub/Sub 主题的 ID。
  • 至少包含以下一项资源定义:
    • ASSET_NAME_#:可选。以英文逗号分隔的资源全名列表。
    • ASSET_TYPE_#:可选。以英文逗号分隔的 可搜索资产类型列表。 支持 RE2 兼容的正则表达式。如果正则表达式与任何支持的资源类型均不匹配,则会返回 INVALID_ARGUMENT 错误。如果未指定 --asset-types,则返回所有资源类型。
  • CONTENT_TYPE:可选。要检索的元数据的 内容类型。如果未指定 --content-type,则仅返回基本信息,例如资产名称、资产上次更新时间以及资产所属的项目、文件夹和组织。
  • RELATIONSHIP_TYPE_#:可选。需要有权访问 Security Command Center 高级层级或 Enterprise 层级,或者 Gemini Cloud Assist。您要检索的资产关系类型的英文逗号分隔列表。您必须将 CONTENT_TYPE 设置为 RELATIONSHIP, 才能使此功能正常运行。
  • 如果添加可选的Feed 条件,请在命令中添加以下详细信息:
    • CONDITION_TITLE:要分配给 Feed 条件的标题。
    • CONDITION_DESCRIPTION:要分配给 Feed 条件的说明。
    • CONDITION_EXPRESSION:要应用于 Feed 的条件表达式。

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

示例

运行以下命令,在 my-topic Pub/Sub 主题中创建一个 Feed,以便在 my-project 项目中的以下资源发生更改时收到通知。

  • my-bucket Cloud Storage 存储桶
  • 任何 BigQuery 表
gcloud asset feeds create my-feed \
    --project=my-project \
    --pubsub-topic=projects/my-project/topics/my-topic \
    --asset-names=//storage.googleapis.com/my-bucket \
    --asset-types=bigquery.googleapis.com/Table \
    --content-type=resource

示例响应

assetNames:
- //storage.googleapis.com/my-bucket
assetTypes:
- bigquery.googleapis.com/Table
condition: {}
contentType: RESOURCE
feedOutputConfig:
  pubsubDestination:
    topic: projects/my-project/topics/my-topic
name: projects/000000000000/feeds/my-feed

REST

HTTP 方法和网址:

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

标头:

X-Goog-User-Project: BILLING_PROJECT_ID

请求 JSON 正文:

{
  "feedId": "FEED_ID",
  "feed": {
    "assetNames": [
      "ASSET_NAME_1",
      "ASSET_NAME_2",
      "..."
    ],
    "assetTypes": [
      "ASSET_TYPE_1",
      "ASSET_TYPE_2",
      "..."
    ],
    "contentType": "CONTENT_TYPE",
    "relationshipTypes": [
      "RELATIONSHIP_TYPE_1",
      "RELATIONSHIP_TYPE_2",
      "..."
    ],
    "feedOutputConfig": {
      "pubsubDestination": {
        "topic": "projects/TOPIC_PROJECT_ID/topics/TOPIC_ID"
      }
    },
    "condition": {
      "title": "CONDITION_TITLE",
      "description": "CONDITION_DESCRIPTION",
      "expression": "CONDITION_EXPRESSION"
    }
  }
}

请提供以下值:

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

    允许使用的值包括:

    • projects/PROJECT_ID,其中 PROJECT_ID 是要在其中创建 Feed 的项目的 ID。
    • projects/PROJECT_NUMBER,其中 PROJECT_NUMBER 是要在其中创建 Feed 的项目的编号。

      如何查找 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 是要在其中创建 Feed 的文件夹的 ID。

      如何查找 Google Cloud 文件夹的 ID

      Google Cloud 控制台

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

      1. 前往 Google Cloud 控制台。

        前往 Google Cloud 控制台