Monitorar mudanças de recursos com o Pub/Sub

Para receber notificações em tempo real sobre mudanças de recursos e políticas, crie e assine um feed.

Ao criar o feed, é possível especificar que você quer monitorar as mudanças de tipos de recursos, políticas do IAM, políticas de acesso e da organização compatíveis em uma organização, pasta ou projeto. Além disso, é possível adicionar condições ao seu feed para receber notificações apenas para determinados tipos de alteração em um recurso.

Depois de criar um feed, você vai receber notificações pelo Pub/Sub sempre que os recursos especificados mudarem. A primeira mensagem publicada no tópico do Pub/Sub é uma mensagem de boas-vindas no formato de uma string, e todas as mensagens seguintes estão no formato de um TemporalAsset.

Confira um exemplo de mensagem do Pub/Sub para o tipo de conteúdo RESOURCE.

{
  "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"
  }
}

Para saber mais sobre o Pub/Sub ou como configurar assinaturas, consulte a documentação do Pub/Sub.

Antes de começar

  1. Ative a API Cloud Asset Inventory no projeto em que você está executando os comandos do Inventário de recursos do Cloud.

    Ativar a API Cloud Asset Inventory

  2. Verifique se sua conta tem a função correta para chamar a API Cloud Asset Inventory. Para conferir as permissões individuais de cada tipo de chamada, consulte Permissões.

  3. Crie um tópico do Pub/Sub, se você ainda não tiver um.

Limitações

  • Pode levar até 10 minutos para que a criação, a atualização ou a exclusão de um feed entre em vigor.

  • O projeto em que um feed é criado precisa sobreviver ao feed. Isso acontece porque a conta de serviço usada para publicar no tópico Pub/Sub de destino está localizada nesse projeto. Um feed não funciona mais e é excluído assim que a exclusão do projeto é permanente.

  • É possível criar até 200 feeds em um item principal. Esse limite se aplica somente aos feeds que seguem logo um principal e não conta os feeds dos filhos. Por exemplo, se você tiver 10 projetos em uma organização, cada um poderá ter até 200 feeds, e a organização também poderá ter até 200 feeds.

Criar feeds

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"

Forneça os valores a seguir:

  • SCOPE: use um dos seguintes valores:

    • project=PROJECT_ID, em que PROJECT_ID é o ID do projeto em que o feed será criado.
    • folder=FOLDER_ID, em que FOLDER_ID é o ID da pasta em que o feed será criado.

      Como encontrar o ID de uma Google Cloud pasta

      Console doGoogle Cloud

      Para encontrar o ID de uma pasta do Google Cloud , siga estas etapas:

      1. Acesse o console do Google Cloud .

        Acesse o console do Google Cloud

      2. Clique na caixa de listagem do switcher na barra de menu.
      3. Selecione sua organização na caixa de listagem.
      4. Pesquise o nome da pasta. O ID da pasta aparece ao lado do nome dela.

      CLI da gcloud

      Para recuperar o ID de uma pasta Google Cloud localizada no nível da organização, use o seguinte comando:

      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)"

      Em que TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não retorna os IDs das subpastas dentro das pastas. Para isso, execute o seguinte comando usando o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, em que ORGANIZATION_ID é o ID da organização em que o feed será criado.

      Como encontrar o ID de uma Google Cloud organização

      Console doGoogle Cloud

      Para encontrar o ID de uma organização Google Cloud , siga estas etapas:

      1. Acesse o console do Google Cloud .

        Acesse o console do Google Cloud

      2. Clique na caixa de listagem do switcher na barra de menu.
      3. Selecione sua organização na caixa de listagem.
      4. Selecione a guia Todos. O ID da organização aparece ao lado do nome dela.

      CLI da gcloud

      Para recuperar o ID de uma organização Google Cloud , use o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • FEED_ID: um identificador exclusivo do feed de recursos.
  • BILLING_PROJECT_ID: opcional. O ID do projeto em que o agente de serviço padrão do Inventário de recursos do Cloud está e que tem permissões para gerenciar seu tópico do Pub/Sub. Leia mais sobre como definir o projeto de faturamento.

  • TOPIC_PROJECT_ID: o ID do projeto em que o tópico do Pub/Sub está localizado.
  • TOPIC_ID: o ID do tópico do Pub/Sub em que as notificações serão publicadas.
  • Pelo menos uma das seguintes definições de recursos:
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que você quer recuperar. Quando --content-type não é especificado, apenas informações básicas são retornadas, como nomes de recursos, a última vez que os recursos foram atualizados e a quais projetos, pastas e organizações eles pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Exige acesso ao nível Premium ou Enterprise do Security Command Center ou ao Gemini Cloud Assist. Uma lista separada por vírgulas de tipos de relacionamento de recursos que você quer recuperar. Defina CONTENT_TYPE como RELATIONSHIP para que isso funcione.
  • Se você estiver adicionando uma condição de feed opcional, inclua os seguintes detalhes no comando:
    • CONDITION_TITLE: um título a ser atribuído à condição do feed.
    • CONDITION_DESCRIPTION: uma descrição para atribuir à condição do feed.
    • CONDITION_EXPRESSION: a expressão de condição a ser aplicada ao feed.

Consulte a referência da CLI gcloud para todas as opções.

Exemplo

Execute o comando a seguir para criar um feed no tópico my-topic do Pub/Sub que notifica quando são feitas mudanças nos seguintes recursos do projeto my-project.

  • O bucket do Cloud Storage my-bucket
  • Qualquer tabela do 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

Exemplo de resposta

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

Método HTTP e URL:

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

Cabeçalhos:

X-Goog-User-Project: BILLING_PROJECT_ID

Corpo JSON da solicitação:

{
  "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"
    }
  }
}

Forneça os valores a seguir:

  • SCOPE_PATH: use um dos seguintes valores:

    Os valores permitidos são:

    • projects/PROJECT_ID, em que PROJECT_ID é o ID do projeto em que o feed será criado.
    • projects/PROJECT_NUMBER, em que PROJECT_NUMBER é o número do projeto em que o feed será criado.

      Como encontrar um Google Cloud número do projeto

      Console doGoogle Cloud

      Para encontrar o número de um projeto Google Cloud , siga estas etapas:

      1. Acesse a página Boas-vindas no console do Google Cloud .

        Acessar "Boas-vindas"

      2. Clique na caixa de listagem do switcher na barra de menu.
      3. Selecione sua organização na caixa de listagem e pesquise o nome do projeto. O nome, o número e o ID do projeto são mostrados perto do título Bem-vindo.

        Até 4.000 recursos são exibidos. Se você não encontrar o projeto que está procurando, acesse a página Gerenciar recursos e filtre a lista usando o nome dele.

      CLI da gcloud

      É possível extrair um número de Google Cloud projeto com o seguinte comando:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, em que FOLDER_ID é o ID da pasta em que o feed será criado.

      Como encontrar o ID de uma Google Cloud pasta

      Console doGoogle Cloud

      Para encontrar o ID de uma pasta do Google Cloud , siga estas etapas:

      1. Acesse o console do Google Cloud .

        Acesse o console do Google Cloud

      2. Clique na caixa de listagem do switcher na barra de menu.
      3. Selecione sua organização na caixa de listagem.
      4. Pesquise o nome da pasta. O ID da pasta aparece ao lado do nome dela.

      CLI da gcloud

      Para recuperar o ID de uma pasta Google Cloud localizada no nível da organização, use o seguinte comando:

      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)"

      Em que TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não retorna os IDs das subpastas dentro das pastas. Para isso, execute o seguinte comando usando o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, em que ORGANIZATION_ID é o ID da organização em que o feed será criado.

      Como encontrar o ID de uma Google Cloud organização

      Console doGoogle Cloud

      Para encontrar o ID de uma organização Google Cloud , siga estas etapas:

      1. Acesse o console do Google Cloud .

        Acesse o console do Google Cloud

      2. Clique na caixa de listagem do switcher na barra de menu.
      3. Selecione sua organização na caixa de listagem.
      4. Selecione a guia Todos. O ID da organização aparece ao lado do nome dela.

      CLI da gcloud

      Para recuperar o ID de uma organização Google Cloud , use o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: o ID do projeto em que o agente de serviço padrão do Inventário de recursos do Cloud está e que tem permissões para gerenciar seu tópico do Pub/Sub. Leia mais sobre como definir o projeto de faturamento.

  • FEED_ID: um identificador exclusivo do feed de recursos.
  • Pelo menos uma das seguintes definições de recursos:
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que você quer recuperar. Quando contentType não é especificado, apenas informações básicas são retornadas, como nomes de recursos, a última vez que os recursos foram atualizados e a quais projetos, pastas e organizações eles pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Exige acesso ao nível Premium ou Enterprise do Security Command Center ou ao Gemini Cloud Assist. Uma lista separada por vírgulas de tipos de relacionamento de recursos que você quer recuperar. Defina CONTENT_TYPE como RELATIONSHIP para que isso funcione.
  • TOPIC_PROJECT_ID: o ID do projeto em que o tópico do Pub/Sub está localizado.
  • TOPIC_ID: o ID do tópico do Pub/Sub para publicar notificações.
  • Se você estiver adicionando uma condição de feed opcional, inclua os seguintes detalhes no comando:
    • CONDITION_TITLE: um título a ser atribuído à condição do feed.
    • CONDITION_DESCRIPTION: uma descrição para atribuir à condição do feed.
    • CONDITION_EXPRESSION: a expressão de condição a ser aplicada ao feed.

Consulte a referência REST para todas as opções.

Exemplos de comandos

Execute um dos comandos a seguir para criar um feed no tópico my-topic do Pub/Sub que notifica quando são feitas mudanças nos seguintes recursos do projeto my-project.

  • O bucket do Cloud Storage my-bucket
  • Qualquer tabela do BigQuery

curl (Linux, macOS ou 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 '{
            "feedId": "my-feed",
            "feed": {
              "assetNames": [
                "//storage.googleapis.com/my-bucket"
              ],
              "assetTypes": [
                "bigquery.googleapis.com/Table"
              ],
              "contentType": "RESOURCE",
              "feedOutputConfig": {
                "pubsubDestination": {
                  "topic": "projects/my-project/topics/my-topic"
                }
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project/feeds

PowerShell (Windows)

$cred = gcloud auth print-access-token

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


$body = @"
{
  "feedId": "my-feed",
  "feed": {
    "assetNames": [
      "//storage.googleapis.com/my-bucket"
    ],
    "assetTypes": [
      "bigquery.googleapis.com/Table"
    ],
    "contentType": "RESOURCE",
    "feedOutputConfig": {
      "pubsubDestination": {
        "topic": "projects/my-project/topics/my-topic"
      }
    }
  }
}
"@

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

Exemplo de resposta

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

Go

Para saber como instalar e usar a biblioteca de cliente do Inventário de recursos do Cloud, consulte Bibliotecas de cliente do Cloud Asset Inventory.

Para autenticar no Inventário de recursos do Cloud, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.


// Sample create-feed create feed.
package main

import (
	"context"
	"flag"
	"fmt"
	"log"
	"os"

	asset "cloud.google.com/go/asset/apiv1"
	"cloud.google.com/go/asset/apiv1/assetpb"
)

// Command-line flags.
var (
	feedID = flag.String("feed_id", "YOUR_FEED_ID", "Identifier of Feed.")
)

func main() {
	flag.Parse()
	ctx := context.Background()
	client, err := asset.NewClient(ctx)
	if err != nil {
		log.Fatalf("asset.NewClient: %v", err)
	}
	defer client.Close()

	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
	feedParent := fmt.Sprintf("projects/%s", projectID)
	assetNames := []string{"YOUR_ASSET_NAME"}
	topic := fmt.Sprintf("projects/%s/topics/%s", projectID, "YOUR_TOPIC_NAME")

	req := &assetpb.CreateFeedRequest{
		Parent: feedParent,
		FeedId: *feedID,
		Feed: &assetpb.Feed{
			AssetNames: assetNames,
			FeedOutputConfig: &assetpb.FeedOutputConfig{
				Destination: &assetpb.FeedOutputConfig_PubsubDestination{
					PubsubDestination: &assetpb.PubsubDestination{