Contrôler les modifications apportées aux éléments

Cette page explique comment créer et gérer des flux dans un projet.

Présentation

Pour recevoir des notifications en temps réel concernant les modifications de ressources et de stratégies, vous pouvez créer un flux et vous y abonner. Lors de la configuration du flux, vous pouvez spécifier que vous souhaitez surveiller les modifications des types de ressources, des stratégies IAM, des règles d'accès et des règles d'administration au sein d'une organisation, un dossier, un projet ou des ressources spécifiques. Vous pouvez également ajouter des conditions à votre flux, de façon à recevoir des notifications uniquement pour certains types de modifications apportées à un élément. Une fois votre flux configuré, vous recevez immédiatement des notifications à chaque modification des éléments spécifiés, envoyés via Pub/Sub (au format TemporalAsset). Les notifications en temps réel se connectent à vos charges de travail existantes. Cette fonctionnalité vous permet de fusionner des actions. Par exemple, vous pouvez créer une fonction Cloud pour annuler une modification de ressource une fois celle-ci détectée.

Avant de commencer

  1. Activez l'API Cloud Asset pour votre projet.

  2. (Facultatif) Lorsque vous devez accéder à l'API Cloud Asset avec des comptes de service, créez un compte de service si vous n'en avez pas dans votre projet.

  3. Accordez à votre utilisateur ou compte de service les autorisations afin d'appeler l'API pour les flux en temps réel. Les autorisations suivantes sont nécessaires pour chaque opération :

    Autorisation Description
    cloudasset.feeds.create et cloudasset.assets.exportResource Créez des flux
    cloudasset.feeds.update et cloudasset.assets.exportResource Mettre à jour des flux
    cloudasset.feeds.delete Supprimer des flux
    cloudasset.feeds.get Obtenir des flux
    cloudasset.feeds.list Répertorier des flux

    Le rôle de propriétaire d'éléments Cloud (roles/cloudasset.owner) accorde toutes les autorisations liées à l'API Cloud Asset, y compris celles répertoriées dans le tableau précédent. Pour en savoir plus sur les rôles et les autorisations, consultez les pages Comprendre les rôles et Configurer des autorisations.

  4. Créez un sujet Pub/Sub si vous n'en avez pas déjà un.

  5. (Facultatif) Si le sujet Pub/Sub se trouve dans un projet autre que celui dans lequel vous créez le flux, assurez-vous que service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com dispose de l'autorisation pubsub.topics.publish sur le sujet, où PROJECT_NUMBER correspond au projet dans lequel vous créez le flux.

    Le compte de service sera créé en appelant l'API une fois. Vous pouvez également utiliser les commandes suivantes pour créer le compte de service et attribuer le rôle d'agent de service manuellement :

      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
    

    Exécutez la commande suivante pour accorder l'autorisation de publication au compte de service :

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

Configurer votre environnement

GCLOUD

  1. Si le SDK Cloud n'est pas installé, installez le SDK Cloud sur votre client local.

  2. Mettez à jour tous vos composants installés vers la dernière version si vous avez installé le SDK Cloud.

  3. Activez l'API Resource Manager pour votre projet.

API

  1. Configurez une nouvelle instance de VM Compute Engine en accédant à la page Créer une instance et en sélectionnant le compte de service dans votre projet.

  2. Dans la section Champs d'application de l'accès, sélectionnez Autoriser l'accès complet à toutes les API Cloud.

  3. Lancez votre instance en cliquant sur Créer.

  4. Accédez à la page Instance de VM.

  5. Ouvrez un client Web SSH connecté à l'instance en cliquant sur SSH à côté de la liste des instances.

  6. Dans le client Web SSH, générez un jeton d'authentification pour votre compte de service en exécutant l'appel suivant :

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

Les appels d'API suivants supposent que vous créez et gérez des flux sur un projet. Si vous souhaitez créer et gérer des flux pour une organisation ou un dossier, utilisez /projects/PROJECT_NUMBER/ avec /organizations/ORGANIZATION_NUMBER/ ou /folders/FOLDER_NUMBER/.

Créer un flux

Vous pouvez créer jusqu'à 200 flux par élément. Cette limite ne s'applique qu'aux flux qui suivent directement cet élément et ne compte pas les flux de ses enfants. Par exemple, si vous avez 10 projets sous une organisation, chaque projet peut comporter jusqu'à 200 flux, et chaque organisation peut également comporter jusqu'à 200 flux.

Pour créer un flux, vous pouvez utiliser les options suivantes :

  • FEED_ID est l'identifiant unique du flux d'éléments attribué par le client. Obligatoire.
  • ASSET_NAME est une liste des noms complets d'éléments pour lesquels vous souhaitez recevoir des notifications de modification. Vous devez ajouter au moins un élément [ASSET_NAME, ASSET_TYPE].
  • ASSET_TYPE est une liste des types d'éléments pour lesquels vous souhaitez recevoir des notifications de modification. Vous devez ajouter au moins un élément [ASSET_NAME, ASSET_TYPE].
  • CONTENT_TYPE est le type de contenu d'éléments pour lesquels vous souhaitez recevoir des notifications de modification.
  • TOPIC_NAME est le nom du sujet Pub/Sub pour publier des notifications. Obligatoire.
  • CONDITION_TITLE est le titre de la condition à appliquer au flux.
  • CONDITION_DESCRIPTION est la description de la condition à appliquer au flux.
  • CONDITION_EXPRESSION est l'expression de la condition à appliquer au flux.

GCLOUD

Pour créer un flux à l'aide de la commande gcloud asset feeds create pour des projets, des dossiers et des organisations, procédez comme suit :

  • Projets :

    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"
    

  • Dossiers :

    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"
    

  • Organisations :

    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

Pour créer un flux à l'aide de l'API feeds.create() pour des projets, des dossiers et des organisations, procédez comme suit :

  • Projets :
    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
    
  • Dossiers :
    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
    
  • Organisations :
    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 définit une notification pour tout élément qui correspond à au moins un des paramètres ASSET de votre flux ET correspond également à l'expression de condition, si elle est spécifiée. Par exemple, si vous spécifiez ASSET_TYPE, ASSET_NAME et CONDITION_EXPRESSION, vous définissez des notifications pour les éléments qui correspondent à ASSET_TYPE ou ASSET_NAME, et respectent la condition CONDITION_EXPRESSION.

Les commandes suivantes créent des notifications à partir du sujet Pub/Sub quick_start_topic lorsque du contenu est modifié dans le bucket Cloud Storage quick_start_bucket ou dans des tables 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
 

Les expressions régulières sont également acceptées pour le champ ASSET_TYPE. Les commandes suivantes créent des notifications à partir du sujet Pub/Sub quick_start_topic lorsque du contenu est modifié dans les ressources dont le type d'élément commence par "compute.googleapis.com". Consultez la section RE2 pour connaître la syntaxe d'expression régulière acceptée.

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

Pour obtenir un flux que vous avez créé, utilisez la commande suivante :

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
 

Le flux est renvoyé au format suivant, où FULL_NAME_FEED est l'identifiant du flux avec sa ressource parent :

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

Recevoir des mises à jour

Après avoir créé un flux, abonnez-vous aux mises à jour à partir du sujet Pub/Sub que vous avez spécifié dans le flux. Un nouveau flux peut prendre jusqu'à dix minutes pour commencer à envoyer des notifications. Une notification est envoyée pour chaque modification apportée à un élément qui correspond à assetNames ou assetTypes, et satisfait la condition dans le flux.

Les messages publiés dans le sujet Pub/Sub seront au format TemporalAsset. Voici un exemple de message pour le type de contenu 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]"
  }
}

Pour en savoir plus sur Pub/Sub ou sur la configuration des abonnés, consultez le Guide Pub/Sub.

Gérer les flux

Obtenir un flux

Pour obtenir un flux spécifique, utilisez la commande suivante :

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
 

Répertorier les flux

Pour répertorier tous les flux d'un projet, d'un dossier ou d'une organisation, exécutez la commande suivante :

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
 

Mettre à jour un flux

Pour mettre à jour les attributs d'un flux, vous devez spécifier le chemin d'accès à l'attribut dans update_mask et la valeur de cet attribut. La commande suivante met à jour les valeurs assetNames et topic d'un flux sur un projet.

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
 

Supprimer un flux

Si vous ne souhaitez plus être informé des modifications apportées aux éléments, exécutez la commande suivante pour supprimer un flux dans un projet.

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
 

Limites connues

  • La prise en compte des créations, des mises à jour et des suppressions de flux peut prendre jusqu'à dix minutes.

  • Le projet client dans lequel le flux est créé doit survivre au flux, car le compte de service utilisé pour publier sur le sujet Pub/Sub de destination se trouve dans le projet client. Si le projet client est supprimé, Cloud Asset Inventory ne peut pas publier sur la destination. Le flux ne fonctionnera plus et sera supprimé dès que la suppression de projet sera permanente.

Dépannage

Cette section explique comment résoudre les problèmes courants.

Échec de la création ou de la mise à jour d'un flux

Si la création ou la mise à jour d'un flux échoue, cela peut être dû à un problème d'autorisations. Chaque requête de création ou de mise à jour de flux comprend trois parties: le projet client utilisé pour appeler l'API, le parent cible à surveiller et le sujet Pub/Sub de destination recevant la notification.

Pour créer ou mettre à jour un flux, les autorisations suivantes sont requises:

  • L'auteur de l'appel ou du compte de service doit disposer d'autorisations d'éléments dans le parent cible (il peut s'agir d'un projet, d'un dossier ou d'une organisation).
  • Le compte de service de ressources (service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com) dans le projet client compatible avec l'API Cloud Asset doit disposer de l'autorisation pubsub.topics.publish sur le sujet Pub/Sub de destination.

Un message d'erreur contenant does not have permission peut indiquer que l'utilisateur ou le compte de service ne dispose pas des autorisations requises sur les éléments. En savoir plus sur les autorisations requises

Un message d'erreur contenant Fail to use [TOPIC_NAME] as feed output destination peut indiquer un problème de publication du message dans le sujet que vous avez spécifié dans la destination du résultat de flux. Pour résoudre ce problème:

  • Si vous utilisez l'outil de ligne de commande gcloud, assurez-vous d'utiliser le bon projet:
    gcloud config list project
    
  • Vérifiez que vous avez spécifié le bon nom de sujet.
  • Assurez-vous que le compte de service (service-[PROJECT_NUMBER]@gcp-sa-cloudasset.iam.gserviceaccount.com) dispose de l'autorisation pubsub.topics.publish sur le sujet, où [PROJECT_NUMBER] est le numéro du projet compatible avec Cloud Asset Inventory à partir duquel vous envisagez de créer le flux.

Échec de réception des mises à jour de ressources ou de stratégies IAM

Si vous ne recevez pas de notifications pour les mises à jour de ressources ou de stratégies IAM, la vérification des détails de configuration suivants peut vous aider à résoudre le problème :

  • Assurez-vous que les métadonnées ont été modifiées sur vos éléments. Le flux en temps réel n'envoie des mises à jour que lorsque les métadonnées des types de ressources acceptés sont modifiées. Les opérations telles que l'importation d'un nouveau fichier dans votre bucket Cloud Storage ne déclenchent pas de modification des métadonnées.
  • Assurez-vous que vos éléments correspondent à l'un des critères que vous avez spécifiés dans le flux, à savoir les noms et les types d'éléments.
  • Consultez les journaux pour voir si des erreurs se sont produites lors de la publication des mises à jour sur votre sujet.

Utiliser Cloud Logging

Cette section explique comment configurer et afficher Logging pour les flux en temps réel de Cloud Asset Inventory.

Lorsque les flux en temps réel ne parviennent pas à envoyer des ressources ou des mises à jour de stratégie IAM via Pub/Sub, Cloud Asset Inventory consigne l'état et le message d'erreur via Logging. Logging est activé par défaut. Découvrez les tarifs de la suite Google Cloud Operations.

Afficher les journaux de la suite Google Cloud Operations

Pour afficher les journaux, accédez à la visionneuse de journaux.

La journalisation du flux en temps réel est indexée par un sujet Pub/Sub. Pour afficher tous les journaux, sélectionnez Sujet Cloud Pub/Sub > Tous les ID de sujet dans le premier menu déroulant. Pour afficher les journaux correspondant au sujet spécifié dans votre flux, sélectionnez un seul ID de sujet dans la liste.

Le codage UTF-8 est appliqué aux champs de journaux. Les caractères qui ne sont pas au format UTF-8 sont remplacés par des points d'interrogation.

Informations consignées

Les entrées de journal de flux en temps réel contiennent les types d'informations suivants :

  • Informations générales figurant dans la plupart des journaux Google Cloud, telles que la gravité, l'ID de projet, le numéro de projet ou l'horodatage.
  • Champs de journal de flux en temps réel dans jsonPayload, qui contiennent le nom de l'élément, la configuration de sortie du flux, l'état d'erreur lors de la publication de mises à jour de ressources ou de stratégies IAM.

Le tableau suivant indique les types d'informations contenus dans chaque champ.

Champ Type et description
name

string

Nom complet du flux. Le format est l'un des suivants :
  • projects/{project_number}/feeds/{feed_id}
  • folders/{folder_number}/feeds/{feed_id}
  • organizations/{organization_number}/feeds/{client-assigned_feed_identifier}
asset_name

string

Nom complet de l'élément qui doit recevoir les mises à jour. Par exemple : //compute.googleapis.com/projects/my_project_123/zones/zone1/instances/instance1

Consultez la section Noms de ressources pour en savoir plus.

feed_output_config

FeedOutputConfig

Configuration de sortie du flux définissant où les mises à jour des éléments sont publiées.

condition

Expr

Condition de flux qui détermine si une mise à jour d'éléments doit être publiée.

error_status

Status

État en cas d'échec de publication des mises à jour d'éléments dans un flux.