Questions fréquentes et dépannage

Cloud Asset Inventory est-il un service mondial ?

Oui. L'API Cloud Asset fonctionne indépendamment de l'emplacement. Il dispose d'un point de terminaison mondial qui diffuse les métadonnées de tous les éléments régionaux et mondiaux compatibles dans l'inventaire des éléments cloud. L'API Cloud Asset est accessible dans n'importe quelle zone.

Quel type de cohérence des données l'inventaire des éléments cloud offre-t-il ?

L'inventaire des éléments cloud offre une cohérence à terme sur les données actuelles et une cohérence optimale sur les données historiques. Malgré les faibles chances en pratique, il est possible que l'inventaire des éléments cloud manque certaines mises à jour d'un élément par le passé.

Pourquoi ne suis-je pas autorisé à utiliser l'API Cloud Asset ?

Une erreur est renvoyée si vous n'êtes pas autorisé à exporter des éléments ou à obtenir l'historique d'une organisation, d'un projet ou d'un dossier.

Par exemple, si vous exécutez la commande suivante sans posséder l'autorisation requise :

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
          "outputConfig": {
            "gcsDestination": {
              "uri": "gs://BUCKET_NAME/FILENAME"
            }
          }
         }' \
         https://cloudasset.googleapis.com/v1/projects/PROJECT_ID:exportAssets

Renvoie l'erreur suivante:

{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "[ORIGINAL ERROR] generic::permission_denied: Request
        denied by Cloud IAM."
      }
    ]
  }
}

Pour résoudre ce problème, demandez l'accès à l'administrateur du projet, du dossier ou de l'organisation. En fonction des éléments que vous essayez d'exporter ou d'obtenir l'historique, vous devez disposer de l'un des rôles suivants ou d'autres rôles qui incluent les autorisations requises pour l'API Cloud Asset:

  • cloudasset.viewer

  • cloudasset.owner

Pour plus d'informations sur les rôles et les autorisations, consultez la page Comprendre les rôles.

Pour en savoir plus sur les options de contrôle des accès pour les API Cloud Asset, consultez la section Contrôle des accès.

Pourquoi mes exportations renvoient-elles une erreur "Autorisation refusée" ?

Sauf indication contraire, l'inventaire des éléments cloud utilise le compte de service Cloud Asset Inventory par défaut du projet actif pour gérer les ressources telles que les sujets Pub/Sub, les buckets Cloud Storage et les tables BigQuery. Ce compte de service est créé la première fois que vous appelez l'API Cloud Asset Inventory à partir d'un projet. Il est par défaut autorisé à gérer ces ressources tant qu'elles se trouvent dans le même projet.

Vous pouvez recevoir des erreurs d'autorisation refusée dans les situations suivantes:

  • Lorsque vous utilisez l'API REST, qui ne définit pas de projet actif et l'inventaire des éléments cloud ne sait donc pas quel compte de service utiliser.

  • Lorsque vous utilisez la gcloud CLI à partir d'un projet différent de celui où se trouvent le sujet Pub/Sub, le bucket Cloud Storage ou la table BigQuery. Cela signifie que le compte de service Inventaire des éléments cloud par défaut du projet actif est utilisé pour effectuer la tâche (s'il existe) et qu'il n'est peut-être pas autorisé à écrire dans les ressources de l'autre projet.

Pour vous assurer que le bon compte de service est utilisé lors des requêtes d'exportation vers des sujets Pub/Sub, des buckets Cloud Storage ou des tables BigQuery, vous pouvez spécifier l'ID de projet contenant le bon compte de service inventaire des éléments cloud par défaut. Si vous effectuez une exportation d'un projet vers un autre, vous devez également attribuer des rôles spécifiques au compte de service.

gcloud

Pour la gcloud CLI, ajoutez l'option --billing-project à votre commande pour spécifier l'ID du projet contenant le compte de service approprié:

--billing-project=BILLING_PROJECT_ID

Vous pouvez également définir le projet de facturation avant d'exécuter des commandes avec la gcloud CLI. Tout d'abord, vérifiez si le projet de facturation est différent du projet principal:

gcloud config list

Ensuite, si nécessaire, définissez le projet de facturation:

gcloud config set billing/quota_project BILLING_PROJECT_ID

Indiquez les valeurs suivantes :

  • BILLING_PROJECT_ID: ID de projet sur lequel l'API Cloud Asset Inventory est activée, et compte de service disposant des autorisations nécessaires pour gérer votre sujet Pub/Sub cible, votre bucket Cloud Storage ou votre table BigQuery.

REST

Pour l'API REST, ajoutez l'en-tête X-Goog-User-Project pour spécifier l'ID du projet contenant le compte de service approprié. Lorsque vous utilisez curl, vous définissez l'en-tête avec l'indicateur -H:

-H "X-Goog-User-Project: BILLING_PROJECT_ID"

Indiquez les valeurs suivantes :

  • BILLING_PROJECT_ID: ID de projet sur lequel l'API Cloud Asset Inventory est activée, et compte de service disposant des autorisations nécessaires pour gérer votre sujet Pub/Sub cible, votre bucket Cloud Storage ou votre table BigQuery.

Exporter des métadonnées d'éléments d'un projet à un autre

Pour exporter des métadonnées d'éléments d'un projet, PROJECT_A, vers un autre, PROJECT_B, vous devez accorder au compte de service Inventaire des éléments cloud par défaut de PROJECT_A l'accès aux ressources de PROJECT_B. Cela permet deux actions:

  • Vous pouvez exporter des métadonnées d'éléments depuis PROJECT_A dans un sujet Pub/Sub, un bucket Cloud Storage ou une table BigQuery située dans PROJECT_B.

  • Vous pouvez utiliser PROJECT_A pour exporter des métadonnées d'éléments depuis PROJECT_B vers un sujet Pub/Sub, un bucket Cloud Storage ou une table BigQuery située dans PROJECT_B.

Pour exporter des métadonnées d'éléments d'un projet vers un autre, procédez comme suit:

  1. Assurez-vous que l'API Cloud Asset Inventory est activée dans le projet à partir duquel vous souhaitez exécuter votre requête, PROJECT_A.

  2. Effectuez au moins un appel à l'API Cloud Asset Inventory dans PROJECT_A pour créer le compte de service par défaut. Vous pouvez également le créer manuellement:

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

    Trouver un numéro de projet Google Cloud

    Console

    Pour trouver un numéro de projet Google Cloud, procédez comme suit:

    1. Accédez à la page Tableau de bord dans la console Google Cloud.

      Accéder à Google Dashboard

    2. Cliquez sur le sélecteur dans la barre de menu.
    3. Sélectionnez votre organisation dans la zone Sélectionner à partir de, puis recherchez le nom de votre projet.
    4. Cliquez sur le nom du projet pour passer à celui-ci. Le numéro du projet est indiqué sur la fiche Informations sur le projet.

    gcloud CLI

    Vous pouvez récupérer un numéro de projet Google Cloud à l'aide de la commande suivante:

    gcloud projects describe PROJECT_ID --format="value(projectNumber)"

  3. Accordez les autorisations appropriées au compte de service.

    • Pour publier dans un flux via Pub/Sub, accordez le rôle roles/pubsub.publisher au compte de service sur le sujet:

      gcloud pubsub topics add-iam-policy-binding projects/PROJECT_B_ID/topics/TOPIC_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/pubsub.publisher
      
    • Pour écrire dans un bucket Cloud Storage, attribuez le rôle roles/storage.admin au compte de service sur le bucket:

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • Pour écrire dans une table BigQuery, attribuez les rôles roles/bigquery.dataEditor et roles/bigquery.user au compte de service sur le projet:

      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.user
      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.dataEditor
      

Lorsque vous effectuez des requêtes d'inventaire des éléments cloud, veillez à spécifier PROJECT_A comme projet que vous souhaitez utiliser. Pour ce faire, pour la gcloud CLI, définissez l'option --billing-project sur PROJECT_A_ID. Pour REST, définissez l'en-tête X-Goog-User-Project sur PROJECT_A_ID.

Pourquoi le résultat de l'API Cloud Asset n'est-il pas actualisé ?

La fraîcheur des données dans l'API Cloud Asset répond à un objectif d'optimisation. Bien que presque toutes les mises à jour d'éléments soient disponibles pour les clients en quelques minutes, il est possible, dans de rares cas, que le résultat des méthodes de l'API Cloud Asset n'inclue pas les mises à jour d'éléments les plus récentes.

Pourquoi les fichiers temporaires sont-ils générés après l'exécution de ExportAssets ?

L'opération ExportAssets peut créer des fichiers temporaires dans le dossier de sortie. Ne supprimez pas ces fichiers temporaires lorsque l'opération est en cours. Une fois l'opération terminée, les fichiers temporaires sont automatiquement supprimés.

Si les fichiers temporaires subsistent, vous pouvez les supprimer en toute sécurité une fois l'opération ExportAssets terminée.

Pourquoi mes identifiants Google Cloud CLI ou Cloud Shell sont-ils refusés ?

Si un projet utilisateur dans une requête est envoyé à cloudasset.googleapis.com depuis Google Cloud CLI ou Cloud Shell, vous recevez un message d'erreur semblable à celui-ci:

Your application has authenticated using end user credentials from the
Google Cloud CLI or Cloud Shell which are not supported by the
cloudasset.googleapis.com. We recommend that most server applications
use service accounts instead. For more information about service accounts
and how to use them in your application, see
https://cloud.google.com/docs/authentication/.

Pour résoudre ce problème, définissez le projet utilisateur sur l'ID de projet de l'utilisateur pour lequel l'API Cloud Asset est activée. Pour ce faire, spécifiez l'en-tête HTTP X-Goog-User-Project dans la requête HTTP.

Si vous utilisez curl, vous pouvez le faire en ajoutant le paramètre suivant:

-H "X-Goog-User-Project: PROJECT_ID"

Si vous utilisez la gcloud CLI, spécifiez l'option --billing-project PROJECT_ID avec la commande gcloud asset ou exécutez la commande suivante:

gcloud config set billing/quota_project PROJECT_ID

Pourquoi les ancêtres sont-ils différents pour les mêmes éléments ?

Lorsque vous appelez l'API Cloud Asset pour obtenir différents types de métadonnées, tels que les métadonnées RESOURCE et IAM POLICY pour le même élément, il est possible que le champ ancestors soit incohérent entre les types de contenus. En effet, les calendriers d'ingestion des données diffèrent pour chaque type de contenu et peuvent être incohérents tant que le processus n'est pas terminé. Vérifiez le champ update_time pour vous assurer que l'élément dispose des informations les plus à jour.

Veuillez nous contacter si ces incohérences durent plus de 24 heures.

À quelle fréquence dois-je appeler l'API ExportAssets ?

Nous vous recommandons d'appeler l'API ExportAssets pour le même projet, le même dossier ou la même organisation de manière séquentielle (par exemple, émettez le deuxième appel à la fin du précédent). Si vous souhaitez capturer les mises à jour des éléments en temps réel, vous pouvez envisager d'utiliser des notifications en temps réel.

Recevoir des mises à jour concernant des éléments en double

Après avoir configuré les notifications en temps réel, vous pouvez recevoir des mises à jour d'éléments en double dans votre sujet Pub/Sub. Cela est dû à une tentative automatique de nouvelle distribution, car Pub/Sub ne garantit pas une distribution "au moins une fois".

Pourquoi n'ai-je pas reçu de notifications pour la suppression de projets ?

Lorsque vous arrêtez un projet, vous disposez de 30 jours pour annuler l'opération. Le champ deleted de la notification n'est pas défini tant que le projet n'est pas définitivement supprimé. Pour surveiller les projets en attente de suppression, vous pouvez définir un flux avec une condition sur le lifecycleState du projet (par exemple, temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED").

Comment récupérer la représentation JSON d'une ressource avec l'API SearchAllResources ?

Par défaut, SearchAllResources renvoie les champs standards suivants lorsque read_mask n'est pas spécifié:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Si vous souhaitez récupérer tous les champs des métadonnées de ressource en plus de ceux répertoriés ci-dessus, vous pouvez spécifier l'option read_mask (--read-mask dans gcloud) dans la requête de recherche.

Un read_mask est une liste de champs, séparés par une virgule, que vous souhaitez afficher dans vos résultats. Certains champs, tels que versionedResources et attachedResources, sont trop volumineux et ne sont donc pas inclus dans les résultats par défaut. Pour inclure ces champs, vous pouvez les spécifier dans read_mask ou utiliser "*" pour inclure tous les champs disponibles. Voici quelques exemples de valeurs read_mask: "name,location", "name,versionedResources" et "*".

Voici un exemple gcloud:

gcloud asset search-all-resources \
    --scope=organizations/123456 \
    --query="state=RUNNING" \
    --asset-types=compute.googleapis.com/Instance \
    --read-mask="name,versionedResources"