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. Cuando necesitas acceder a la API de Cloud Asset con cuentas de servicio, crea una cuenta de servicio nueva si no tienes una cuenta de servicio existente dentro de tu proyecto (opcional).

  3. Otórgale permisos a tu cuenta de servicio o a tu usuario para llamar 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

    La función de propietario de Cloud Asset (roles/cloudasset.owner) otorga todos los permisos relacionados con la API de Cloud Asset, incluidos los permisos que se enumeran en la tabla anterior. Para obtener más información sobre las funciones y los permisos, consulta Información sobre las funciones y Configura permisos.

  4. Crea un tema de Pub/Sub si no tienes un tema de Pub/Sub existente.

  5. (Opcional) Si el tema de Pub/Sub se encuentra en un proyecto que no es el que creaste para el feed, asegúrate de que service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com tenga el permiso pubsub.topics.publish en el tema, en el que PROJECT_NUMBER es para el proyecto en el que creas el feed.

    La cuenta de servicio se creará mediante un solo llamado a la API, o puedes usar los siguientes comandos para crear la cuenta de servicio y otorgar la función de agente de servicio de forma manual:

      gcloud beta services identity create --service=cloudasset.googleapis.com --project=PROJECT_ID
      gcloud projects add-iam-policy-binding PROJECT_ID --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com --role=roles/cloudasset.serviceAgent
    

    Y usa el siguiente comando para otorgar permiso de publicación a la cuenta de servicio:

      gcloud pubsub topics add-iam-policy-binding TOPIC_NAME --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com --role=roles/pubsub.publisher
    

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, puedes usar las siguientes opciones:

  • FEED_ID es el identificador único de feed de recursos asignado por el cliente. Obligatorio.
  • ASSET_NAME es una lista de nombres completos de los recursos sobre los que quieres recibir notificaciones de cambios. Se requiere al menos uno de los elementos [ASSET_NAME] y ASSET_TYPE.
  • ASSET_TYPE es una lista de los tipos de recursos para los que quieres recibir notificaciones de cambios. Se requiere al menos uno de los elementos [ASSET_NAME] y ASSET_TYPE.
  • 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. Obligatorio.
  • 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 10 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.

Los mensajes publicados en el tema de Pub/Sub tendrán el formato de TemporalAsset. Este es un mensaje de muestra del tipo de contenido de los recursos RESOURCE.

{
  "asset": {
    "ancestors": [
      "projects/[PROJECT_NUMBER]",
      "folders/[FOLDER_NUMBER]",
      "organizations/[ORGANIZATION_NUMBER]"
    ],
    "assetType": "[ASSET_TYPE]",
    "name": "[ASSET_NAME]",
    "resource": {
      "data": {
        ...detailed resource metadata...
      },
      "discoveryDocumentUri": "[DISCOVERY_URI]",
      "discoveryName": "[DISCOVERY_NAME]",
      "location": "[LOCATION]",
      "parent": "[PARENT_ASSET_NAME]",
      "version": "[VERSION]"
    },
    "updateTime": "[UPDATE_TIME]"
  },
  "priorAsset": {
    ...prior asset information...
  },
  "priorAssetState": "[PRIOR_ASSET_STATE]",
  "window": {
    "startTime": "[UPDATE_TIME]"
  }
}

Si quieres obtener más información sobre Pub/Sub o cómo configurar los suscriptores, consulta la guía de Pub/Sub.

Cómo administrar los feeds

Obteniendo un feed

Para obtener un feed específico, 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" -X GET \
  https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER/feeds/FEED_ID
 

Enumerar los feeds

Para enumerar todos los feeds de un proyecto, una carpeta o una organización, usa el siguiente comando:

GCLOUD

gcloud asset feeds list --project=PROJECT_ID

API

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

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
 

Limitaciones conocidas

  • La creación, actualización o eliminación de feeds puede tardar hasta 10 minutos en aplicarse.

  • El proyecto de consumidor en el que se crea el feed debe sobrevivir más el feed porque la cuenta de servicio que se usa para publicar en el tema de Pub/Sub de destino se encuentra en el proyecto de consumidor. Si se borra el proyecto de consumidor, Cloud Asset Inventory no puede publicar en el destino. El feed dejará de funcionar y se borrará cuando el borrado de un proyecto sea permanente.

Soluciona problemas

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

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

Si la creación o actualización de un feed falla, es posible que se deba a un problema con los permisos. Cada solicitud de actualización o creación de un feed incluye tres partes: el proyecto de consumidor que se usa para llamar a la API, el superior de destino que se supervisará y el tema de Pub/Sub de destino para recibir la notificación.

Para crear o actualizar un feed, se requieren los siguientes permisos:

  • El emisor o la cuenta de servicio deben tener permisos de recursos en el superior de destino (puede ser un proyecto, una carpeta o una organización).
  • La cuenta de servicio de elementos (service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com) del proyecto del consumidor habilitado para la API de Cloud Asset debe tener el permiso pubsub.topics.publish en el tema de Pub/Sub de destino.

Un mensaje de error que contiene does not have permission podría indicar que el usuario o la cuenta de servicio no tienen los permisos de los elementos. Obtén más información sobre los permisos necesarios.

Un mensaje de error que contiene Fail to use [TOPIC_NAME] as feed output destination podría indicar que hay un problema al publicar el mensaje en el tema que especificaste en el destino de salida del feed. Para resolver el problema, sigue estos pasos:

  • Si usas la herramienta de línea de comandos de gcloud, asegúrate de usar el proyecto correcto:
    gcloud config list project
    
  • 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 de actualizaciones de políticas de IAM o de recursos, verificar los siguientes detalles de configuración puede ayudar a resolver el problema:

  • 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.