Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Supervisar cambios en los recursos

En esta página, se explica cómo crear y administrar feeds en un proyecto.

Descripción general

Para recibir notificaciones en tiempo real sobre los cambios en los recursos y las políticas, puedes crear y suscribirte a un feed. Cuando configuras el feed, puedes especificar que deseas supervisar los cambios en los tipos de recursos admitidos, las políticas de IAM, las políticas de acceso y las políticas de la organización dentro de una organización, una carpeta, un proyecto o recursos específicos. Además, puedes agregar condiciones a tu feed para que solo recibas notificaciones de ciertos tipos de cambios en un recurso. Después de configurar tu feed, recibirás notificaciones al instante que se envíen a través de Pub/Sub (con formato de TemporalAsset) cuando se modifiquen los recursos especificados. Las notificaciones en tiempo real se conectan a tus cargas de trabajo existentes. Con esta funcionalidad puedes combinar acciones, como crear una función de Cloud Functions para revertir un cambio de recurso después de que se detecta.

Antes de comenzar

  1. Habilita la API de Cloud DLP para el proyecto.

  2. Crea una cuenta de servicio nueva si no tienes una cuenta de servicio existente en tu proyecto.

  3. Otorga permisos a tu cuenta de servicio para que llame a la API a fin de obtener feeds en tiempo real. Se necesitan los siguientes permisos para cada operación:

    Permiso Descripción
    cloudasset.feeds.create y cloudasset.assets.exportResource Crea feeds
    cloudasset.feeds.update y cloudasset.assets.exportResource Actualiza feeds
    cloudasset.feeds.delete Borra feeds
    cloudasset.feeds.get Obtén feeds
    cloudasset.feeds.list Enumera feeds

    Si otorgas a tu cuenta de servicio la función de propietario de Cloud Asset (roles/cloudasset.owner), se otorgan todos los permisos relacionados con la API de Cloud Asset, incluidos los permisos enumerados en la tabla anterior. Para obtener más información acerca de las funciones y los permisos, consulta Comprende las funciones.

  4. Crea un tema de Pub/Sub si no tienes un tema de Pub/Sub existente. Asegúrate de que service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com tenga el permiso pubsub.topics.publish para el tema, en el que PROJECT_NUMBER es el número del proyecto habilitado para la API de Cloud Asset a partir de la cual planeas crear el feed. Según la configuración predeterminada, esta cuenta de servicio tiene el permiso pubsub.topics.publish para todos los temas de este proyecto con la API de Cloud Asset habilitada.

    La cuenta de servicio se creará mediante un solo llamado a la API o puedes usar el siguiente comando:

      gcloud beta services identity create --service=cloudasset.googleapis.com --project=PROJECT_ID
    

Configura tu entorno

GCLOUD

  1. Instala el SDK de Cloud en tu cliente local si no lo tienes instalado.

  2. Actualiza todos los componentes instalados a la última versión si tienes el SDK de Cloud instalado.

  3. Habilita la API de Resource Manager para tu proyecto.

API

  1. Para configurar una nueva instancia de VM de Compute Engine, ve a la página Crear una instancia y selecciona la cuenta de servicio de tu proyecto.

  2. En Permiso de acceso, selecciona Permitir acceso completo a todas las API de Cloud.

  3. Haz clic en Crear para iniciar tu instancia.

  4. Ir a la página Instancia de VM

  5. Haz clic en SSH junto a la lista de instancias para abrir un cliente SSH web conectado a la instancia.

  6. En el cliente SSH web, genera un token de autenticación para tu cuenta de servicio con la siguiente llamada:

    TOKEN=$(gcloud auth application-default print-access-token)
    

En las siguientes llamadas a la API, se supone que creas y administras feeds en un proyecto. Si quieres crear y administrar feeds para una organización o una carpeta, intercambia /projects/PROJECT_NUMBER/ por /organizations/ORGANIZATION_NUMBER/ o /folders/FOLDER_NUMBER/.

Crea un feed

Puedes crear hasta 200 feeds en un recurso. Este límite solo se aplica a los feeds que siguen directamente a ese recurso y no cuentan los feeds de sus recursos secundarios. Por ejemplo, si tienes 10 proyectos en una organización, cada proyecto puede tener hasta 200 feeds y la organización también puede tener hasta 200 feeds.

Para crear un feed, puede usar una de las siguientes opciones:

  • FEED_ID es el identificador único de feed de recursos asignado por el cliente.
  • ASSET_NAME es una lista de nombres completos de los recursos sobre los que quieres recibir notificaciones de cambios.
  • ASSET_TYPE es una lista de los tipos de recursos para los que quieres recibir notificaciones de cambios.
  • CONTENT_TYPE es el tipo de contenido del recurso del que deseas recibir notificaciones de cambios.
  • TOPIC_NAME es el nombre del tema de Pub/Sub para publicar notificaciones.
  • CONDITION_TITLE es el título de la condición que se aplicará al feed.
  • CONDITION_DESCRIPTION es la descripción de la condición que se aplicará al feed.
  • CONDITION_EXPRESSION es la expresión de la condición que se aplicará al feed.

GCLOUD

Para crear un feed con el comando gcloud asset feeds create en proyectos, carpetas y organizaciones, ejecuto los siguientes comandos:

  • Proyectos:

    gcloud asset feeds create FEED_ID --project=PROJECT_ID --asset-names="ASSET_NAME"
    --content-type=CONTENT_TYPE --asset-types="ASSET_TYPE"
    --pubsub-topic="TOPIC_NAME" --condition-title="CONDITION_TITLE"
    --condition-description="CONDITION_DESCRIPTION"
    --condition-expression="CONDITION_EXPRESSION"
    

  • Carpetas:

    gcloud asset feeds create FEED_ID --folder=FOLDER_ID --asset-names="ASSET_NAME"
    --content-type=CONTENT_TYPE --asset-types="ASSET_TYPE"
    --pubsub-topic="TOPIC_NAME" --condition-title="CONDITION_TITLE"
    --condition-description="CONDITION_DESCRIPTION"
    --condition-expression="CONDITION_EXPRESSION"
    

  • Organizaciones:

    gcloud asset feeds create FEED_ID --organization=ORGANIZATION_ID --asset-names="ASSET_NAME"
    --content-type=CONTENT_TYPE --asset-types="ASSET_TYPE"
    --pubsub-topic="TOPIC_NAME" --condition-title="CONDITION_TITLE"
    --condition-description="CONDITION_DESCRIPTION"
    --condition-expression="CONDITION_EXPRESSION"
    

API

A fin de crear un feed con la API feeds.create() para proyectos, carpetas y organizaciones, ejecuta lo siguiente:

  • Proyectos:
    curl -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" -X POST \
      -d '{"feedId": "FEED_ID",
           "feed": { "assetNames": ["ASSET_NAME"],
           "assetTypes": ["ASSET_TYPE"], "contentType": "CONTENT_TYPE",
           "feedOutputConfig": {"pubsubDestination": {"topic":"TOPIC_NAME"}},
           "condition": {"title": "CONDITION_TITLE",
           "description": "CONDITION_DESCRIPTION",
           "expression": "CONDITION_EXPRESSION"}}}' \
      https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds
    
  • Carpetas:
    curl -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" -X POST \
      -d '{"feedId": "FEED_ID",
           "feed": { "assetNames": ["ASSET_NAME"],
           "assetTypes": ["ASSET_TYPE"], "contentType": "CONTENT_TYPE",
           "feedOutputConfig": {"pubsubDestination": {"topic":"TOPIC_NAME"}},
           "condition": {"title": "CONDITION_TITLE",
           "description": "CONDITION_DESCRIPTION",
           "expression": "CONDITION_EXPRESSION"}}}' \
      https://cloudasset.googleapis.com/v1/folders/FOLDER_NUMBER/feeds
    
  • Organizaciones:
    curl -H "Authorization: Bearer $TOKEN" \
      -H "Content-Type: application/json" -X POST \
      -d '{"feedId": "FEED_ID",
           "feed": { "assetNames": ["ASSET_NAME"],
           "assetTypes": ["ASSET_TYPE"], "contentType": "CONTENT_TYPE",
           "feedOutputConfig": {"pubsubDestination": {"topic":"TOPIC_NAME"}},
           "condition": {"title": "CONDITION_TITLE",
           "description": "CONDITION_DESCRIPTION",
           "expression": "CONDITION_EXPRESSION"}}}' \
      https://cloudasset.googleapis.com/v1/organizations/ORGANIZATION_NUMBER/feeds
    

Cloud Asset Inventory establece una notificación en cualquier recurso que coincida con al menos uno de los parámetros de RECURSO del feed Y también coincide con la expresión de condición, si se especifica. Por ejemplo, si especificas ASSET_TYPE, ASSET_NAME y CONDITION_EXPRESSION, se configurarán las notificaciones en los recursos que coincidan con ASSET_TYPE o ASSET_NAME, y cumple con CONDITION_EXPRESSION.

Con los siguientes comandos, se crean notificaciones a partir del tema de Pub/Sub quick_start_topic cuando el contenido cambia dentro del depósito quick_start_bucket de Cloud Storage o de cualquier tabla de BigQuery:

GCLOUD

 gcloud asset feeds create quick_start_feed --project=PROJECT_ID --asset-names="//storage.googleapis.com/quick_start_bucket"
  --content-type=resource --asset-types="bigquery.googleapis.com/Table"
  --pubsub-topic="projects/PROJECT_ID/topics/quick_start_topic"
 

API

 curl -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -X POST \
  -d '{"feedId": "quick_start_feed",
       "feed": { "assetNames": ["storage.googleapis.com/quick_start_bucket"],
       "assetTypes": ["bigquery.googleapis.com/Table"],
       "contentType": "RESOURCE",
       "feedOutputConfig": {"pubsubDestination": {"topic":"projects/PROJECT_ID/topics/quick_start_topic"}}}}' \
        https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds
 

Las expresiones regulares también se admiten para el campo ASSET_TYPE. Los siguientes comandos crean notificaciones a partir del tema quick_start_topic de Pub/Sub cuando el contenido cambia dentro de los recursos cuyo tipo de recurso comienza con "compute.googleapis.com". Consulta RE2 para ver toda la sintaxis de expresión regular admitida.

GCLOUD

 gcloud asset feeds create quick_start_feed --project=PROJECT_ID
  --content-type=resource --asset-types="compute.googleapis.com.*"
  --pubsub-topic="projects/PROJECT_ID/topics/quick_start_topic"
 

API

 curl -H "Authorization: Bearer $TOKEN" 
-H "Content-Type: application/json" -X POST
-d '{"feedId": "quick_start_feed", "feed": { "assetTypes": ["compute.googleapis.com.*"], "contentType": "RESOURCE", "feedOutputConfig": {"pubsubDestination": {"topic":"projects/PROJECT_ID/topics/quick_start_topic"}}}}'
https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds

Para ver un feed que creaste, usa el siguiente comando:

GCLOUD

 gcloud asset feeds describe FEED_ID --project=PROJECT_ID
 

API

 curl -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds/FEED_ID
 

El feed se muestra en el siguiente formato, en el que FULL_NAME_FEED es el identificador del feed junto con su recurso principal:

{
  "name": "FULL_NAME_FEED",
  "assetTypes": ["ASSET_TYPES"],
  "assetNames": ["ASSET_NAMES"],
  "contentType": "CONTENT_TYPES",
  "feedOutputConfig": {
    "pubsubDestination": {
      "topic": "TOPIC_NAME"
    }
  },
  "condition": {
    "title": "CONDITION_TITLE",
    "description": "CONDITION_DESCRIPTION",
    "expression": "CONDITION_EXPRESSION"
  }
}

Recibe actualizaciones

Después de crear un feed, suscríbete a las actualizaciones del tema de Pub/Sub que especificaste en el feed. Un feed nuevo puede tardar hasta cinco minutos en comenzar a enviar notificaciones. Se envía una notificación por cada cambio que se realice en un recurso que coincida con assetNames o assetTypes y que cumpla con la condition del feed.

Para obtener más información sobre Pub/Sub, consulta la Guía de Pub/Sub.

Actualiza un feed

Para actualizar los atributos de un feed, debes especificar la ruta de acceso del atributo en el update_mask y el valor de ese atributo. El siguiente comando actualiza el valor assetNames y topic de un feed en un proyecto.

GCLOUD

gcloud asset feeds update FEED_ID --project=PROJECT_ID --add-asset-names=ASSET_NAME
   --pubsub-topic="TOPIC"

API

 curl -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -X PATCH \
  -d '{"feed": {"assetNames": [ASSET_NAME], "feedOutputConfig": {"pubsubDestination": {"topic":TOPIC}}},
       "update_mask": {"paths": ["asset_names", "feed_output_config.pubsub_destination.topic"]}}' \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds/FEED_ID
 

Elimina un feed

Si ya no deseas recibir notificaciones de los cambios de recursos, usa el siguiente comando para borrar un feed de un proyecto.

GCLOUD

gcloud asset feeds delete FEED_ID --project=PROJECT_ID

API

 curl -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" -X DELETE \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds/FEED_ID
 

Agrega una condición a un feed

Para ver solo un tipo de cambio en un recurso determinado, puedes agregar una condición a tu feed.

El objeto condition es opcional. Si un feed no tiene un objeto condition, el destino configurado recibe todas las notificaciones de cambios en los recursos.

El objeto condition tiene la siguiente estructura:

"condition": {
    "title": ...
    "description": ...
    "expression": ...
}

Title y description son opcionales. Estos campos pueden ayudarte a identificar y describir la condición.

El campo expression define la expresión usada para evaluar la notificación en Common Expression Language (CEL). La expresión de la condición puede contener varias declaraciones y estas se combinan con operadores lógicos, según la especificación del lenguaje CEL.

Usa CEL

Common Expression Language (CEL) es el lenguaje de expresión que se usa para especificar una condición de feed. Está diseñado para expresar expresiones lógicas basadas en atributos. Para obtener más información, consulta la especificación de CEL y su definición de lenguaje.

En las condiciones de feed, CEL se usa para tomar decisiones booleanas basadas en datos de atributos. Una expresión de condición consiste en una o más declaraciones que se unen mediante operadores lógicos (&&, || o !). Cada declaración expresa una regla de control basada en atributos que se aplica a TemporalAssetla vinculación de la función para determinar si se permite la autorización.

Las siguientes funciones de CEL son las más importantes para las condiciones del feed:

  • Variables: Las condiciones usan variables para expresar un atributo determinado, como temporal_asset.deleted (de tipo booleano) o temporal_asset.asset.name (de tipo string). Estas variables se propagan con valores en función del contexto en el entorno de ejecución.
  • Operadores: Todos los tipos de datos, como las strings, admiten un conjunto de operadores que se pueden usar para crear una expresión lógica. Por lo general, los operadores se usan para comparar el valor que contiene una variable con un valor literal, como temporal_asset.asset.name == "//cloudresourcemanager.googleapis.com/projects/12345". En este ejemplo, si el valor de entrada de temporal_asset.asset.name es //cloudresourcemanager.googleapis.com/projects/12345, la expresión se evalúa como true.
  • Funciones: Una función es un operador compuesto para los tipos de datos que admiten operaciones más complejas. En las expresiones de condición, hay funciones predefinidas que se pueden usar junto con un tipo de datos determinado. Por ejemplo, temporal_asset.asset.name.contains("keyword") usa una función de string de contains y se evalúa como true si el valor de temporal_asset.asset.name contiene "keyword".
  • Operadores lógicos: Las condiciones admiten tres operadores lógicos que se pueden usar para compilar expresiones lógicas complejas a partir de declaraciones de expresiones simples: &&, || y !. Estos operadores lógicos permiten usar múltiples variables de entrada en una expresión de condición. Por ejemplo: temporal_asset.deleted && temporal_asset.window.start_time.getFullYear() > 2020 une dos declaraciones simples y requiere que se cumplan ambas declaraciones para producir un resultado de evaluación general true.

Para obtener más información sobre las características de CEL, consulta la definición del lenguaje.

Usa variables de condición

Las variables de condición le permiten crear condiciones para diferentes atributos. Las variables de condición admitidas son las siguientes:

  • temporal_asset: el cambio actual de un recurso con el formato TemporalAsset. Si la condición se evalúa como verdadera, el TemporalAsset se enviará al destino configurado.

Ejemplos de expresiones de condición

La siguiente expresión de condición envía notificaciones sobre eventos de creación:

!temporal_asset.deleted &&
temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST

La siguiente expresión de condición envía notificaciones para los recursos ubicados en carpetas 12345 y 23456:

"folders/12345" in temporal_asset.asset.ancestors ||
"folders/23456" in temporal_asset.asset.ancestors

La siguiente expresión de condición envía notificaciones cuando se agregan nuevas reglas permitidas a los firewalls si asset_type ya está configurado como compute.googleapis.com/Firewall en el feed.

size(temporal_asset.asset.resource.data.allowed) >
size(temporal_asset.prior_asset.resource.data.allowed)

La siguiente expresión de condición envía notificaciones para las instancias de VM con el tipo de máquina n1-standard-1 si asset_type ya está configurado como compute.googleapis.com/Instance en el feed.

temporal_asset.asset.resource.data.machineType.endsWith("/machineTypes/n1-standard-1")

La siguiente expresión de condición envía notificaciones para depósitos de almacenamiento con alguna política de IAM para allUsers, si suponemos que asset_type se establece en storage.googleapis.com/Bucket y content_type se establece en IAM_POLICY en el feed.

temporal_asset.asset.iam_policy.bindings.exists(b, b.members.exists(m, m == "allUsers"))

Limitaciones conocidas

  • La mayoría de los nombres de variables en las expresiones de condiciones se muestran con snake_case. La única excepción son los nombres de variables de los subcampos de data en el objeto Recurso, que se muestran con CamelCase.

  • Las expresiones de condiciones tienen un límite de longitud de 1,000 caracteres.

  • Algunas validaciones en las expresiones de condiciones se realizan durante el momento de la creación o actualización del feed. Sin embargo, esas validaciones no son integrales, especialmente las de las condiciones establecidas en el campo temporal_asset.asset.resource.data, que tiene un tipo dinámico. Recomendamos las condiciones simples para feeds con el asset_type adecuado especificado en el feed. Si se producen errores de validación durante el momento de la evaluación, no se enviará la notificación y se registrarán los errores. Más información sobre cómo ver los registros.

  • Para los tipos dinámicos de temporal_asset.asset.resource.data, las condiciones especificadas en campos faltantes activan errores de entorno de ejecución, y no se publican notificaciones. Por ejemplo, para la condición temporal_asset.asset.resource.data.name != "my_name", si falta el campo name en una actualización, la evaluación fallará y no recibirás notificaciones. Si tu condición solo funciona en presencia de ciertos campos, verifica la existencia en la condición para asegurarte de que se evalúe de forma apropiada.

  • Los tipos de enumeración estáticas pueden aparecer como nombres de rutas completamente calificados o números enteros sin procesar. Por ejemplo, las siguientes expresiones son válidas para prior_asset_state:

    temporal_asset.prior_asset_state == google.cloud.asset.v1.TemporalAsset.PriorAssetState.DOES_NOT_EXIST
    

    y

    temporal_asset.prior_asset_state == 3
    

    Los tipos de enumeración dinámicos de temporal_asset.asset.resource.data se representan como strings sin procesar. Por ejemplo, la siguiente expresión es válida para el tipo de recurso cloudresourcemanager.googleapis.com/Project:

    temporal_asset.asset.resource.data.lifecycleState == "ACTIVE"
    

Soluciona problemas

En esta sección, se muestra cómo solucionar problemas conocidos.

Errores en la creación o actualización de feeds

Si no puedes crear o actualizar un feed con el mensaje de error Fail to use [TOPIC_NAME] as feed output destination, significa que hay un problema durante la publicación del mensaje en el tema que especificaste en el destino de salida del feed. Para resolver el problema, sigue estos pasos:

  • Asegúrate de haber especificado el nombre de tema correcto
  • Asegúrate de que la cuenta de servicio (service-[PROJECT_NUMBER]@gcp-sa-cloudasset.iam.gserviceaccount.com) tenga el permiso pubsub.topics.publish sobre el tema, en el que [PROJECT_NUMBER] es el número de proyecto del proyecto habilitado para Cloud Asset Inventory en el que planeas crear el feed.

Errores en la recepción de actualizaciones de recursos o actualizaciones de políticas de IAM

Si no recibes notificaciones sobre las actualizaciones de los recursos o las políticas de IAM, verifica las siguientes configuraciones.

  • Asegúrate de que los metadatos hayan cambiado en tus recursos. El feed en tiempo real solo envía actualizaciones cuando los metadatos de los tipos de recursos admitidos cambian. Las operaciones como subir un archivo nuevo a tu depósito de Cloud Storage no modifican los metadatos.
  • Asegúrate de que tus recursos cumplan con uno de los criterios que especificaste en el feed, que son los nombres de los recursos y los tipos de recursos.
  • Revisa los registros para ver si hay errores cuendo se publican actualizaciones en el tema.

Usa Cloud Logging

En esta sección, se describe cómo configurar y ver Logging para los feeds en tiempo real de Cloud Asset Inventory.

Cuando los feeds en tiempo real no pueden enviar recursos ni actualizaciones de las políticas de IAM a través de Pub/Sub, Cloud Asset Inventory registra el estado de error y el mensaje a través de Logging. Logging está habilitado de forma predeterminada. Obtén más información sobre los precios de Google Cloud's operations suite.

Visualiza los registros de Google Cloud's operations suite

Para ver los registros, ve al visor de registros.

El registro de feeds en tiempo real está indexado por un tema de Pub/Sub. Para ver todos los registros, selecciona Tema de Cloud Pub/Sub > Todos los ID de tema en el primer menú desplegable. Para ver los registros del tema especificado en tu feed, selecciona un solo ID de tema de la lista.

Se aplica la codificación UTF-8 a los campos de registro. Los caracteres que no son caracteres UTF-8 se reemplazan con signos de interrogación.

Información registrada

Las entradas de registro de feed en tiempo real contienen los siguientes tipos de información:

  • Información general que se muestra en la mayoría de los registros de Google Cloud, como la gravedad, el ID del proyecto, el número del proyecto o la marca de tiempo.
  • Campos de registro de feeds en tiempo real en jsonPayload, que contienen el nombre del recurso, la configuración de salida del feed y el estado de error cuando se publican recursos o actualizaciones de la política de IAM.

En la siguiente tabla, se muestra qué tipo de información contiene cada campo.

Campo Tipo y descripción
name

string

Nombre completo del feed El formato es uno de los siguientes:
  • projects/{project_number}/feeds/{feed_id}
  • folders/{folder_number}/feeds/{feed_id}
  • organizations/{organization_number}/feeds/{client-assigned_feed_identifier}
asset_name

string

El nombre completo del recurso para recibir actualizaciones. Por ejemplo: //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1

Consulta Nombres de recursos para obtener más información.

feed_output_config

FeedOutputConfig

Configuración de salida del feed, en la que se define dónde se publican las actualizaciones de recursos.

condition

Expr

Condición del feed que determina si debe publicarse una actualización del recurso.

error_status

Status

Estado que se muestra cuando se produce un error al publicar las actualizaciones del recurso en un feed.