Questions fréquentes et dépannage

La section ci-après répertorie certains des problèmes courants qui peuvent survenir lors des interactions avec l'API Cloud Asset, ainsi que leurs solutions respectives.

Pourquoi ma requête contient-elle des identifiants d'authentification non valides ?

Si vous n'avez pas configuré correctement l'en-tête OAuth, les appels génèrent l'erreur suivante :

{
  "error": {
    "code": 401,
    "message": "Request had invalid authentication credentials. Expected
               OAuth 2 access token, login cookie or other valid
               authentication credential. See
               https://developers.google.com/identity/sign-in/web/devconsole-project.",
    "status": "UNAUTHENTICATED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "Authentication error: 2"
      }
    ]
  }
}

Pour résoudre ce problème, appliquez la procédure permettant de vérifier la configuration initiale.

Pourquoi n'ai-je pas l'autorisation d'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 :

gcurl -d '{"outputConfig":{"gcsDestination": \
{"uri":gs://YOUR_BUCKET/NEW_FILE}}}' \
https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets

L'erreur suivante est renvoyée :

{
 "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. Selon les éléments que vous essayez d'exporter ou dont vous souhaitez obtenir l'historique, vous aurez besoin de l'un des rôles suivants, ou d'autres rôles qui incluent les autorisations de l'API Cloud Asset requises :

  • 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 commandes d'exportation vers Cloud Storage échouent-elles ?

Si le bucket Cloud Storage que vous utilisez pour stocker les données exportées ne fait pas partie du projet compatible avec l'API Cloud Asset depuis lequel vous exécutez l'exportation, l'exécution de la requête entraîne l'erreur de refus d'autorisation suivante :

    {
     "error": {
      "code": 7,
      "message": "Failed to write to: YOUR_BUCKET/FILE",
     }
    }
    

Pour résoudre ce problème, utilisez un bucket Cloud Storage appartenant au projet compatible avec l'API Cloud Asset depuis lequel vous effectuez l'exportation, ou accordez le rôle roles/storage.admin au compte de service service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com. PROJECT_NUMBER correspond au numéro du projet compatible avec l'API Cloud Asset depuis lequel vous effectuez l'exportation.

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 la plupart des mises à jour d'éléments soient disponibles pour les clients en quelques minutes, il est possible que, dans de rares cas, le résultat des méthodes de l'API Cloud Asset n'inclue pas les mises à jour 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.

Que se passe-t-il si l'URL de ma requête est trop longue pour BatchGetAssetsHistory ?

La méthode BatchGetAssetsHistory est une action HTTP GET qui envoie toutes les données de la requête dans une URL dont la longueur est limitée. En conséquence, une erreur est générée si la requête est trop longue.

Pour éviter ce problème, le code client doit utiliser HTTP POST pour envoyer une requête avec le type de Content-Type défini sur application/x-www-form-urlencoded avec un en-tête HTTP X-HTTP-Method-Override: GET. Pour en savoir plus, consultez la section URL de requêtes longues.

Voici un exemple de requête pour BatchGetAssetsHistory utilisant HTTP POST :

curl -X POST -H "X-HTTP-Method-Override: GET" \
     -H "Content-Type: application/x-www-form-urlencoded" \
     -H "Authorization: Bearer " \
     -d 'assetNames=&contentType=1&readTimeWindow.startTime=2018-09-01T09:00:00Z' \
     https://cloudasset.googleapis.com/v1/projects/:batchGetAssetsHistory

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

Si un projet utilisateur dans une requête est envoyé à cloudasset.googleapis.com depuis le SDK Cloud ou Cloud Shell, un message d'erreur semblable à celui-ci s'affiche :

Your application has authenticated using end user credentials from the
Cloud SDK 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 compatible avec l'API Cloud Asset. 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 pour cela ajouter le paramètre suivant :

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

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

gcloud config set billing/quota_project PROJECT_ID

Comment exporter des éléments vers des tables BigQuery n'appartenant pas au projet actuel ?

Lorsque vous appelez l'API ExportAssets à partir du projet compatible avec l'API Cloud Asset (A), il utilise le compte de service service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com pour écrire dans la table BigQuery de destination. Pour diriger la sortie vers une table BigQuery d'un autre projet (B) :

Dans la stratégie IAM (Identity and Access Management) du projet B, attribuez au compte de service (service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com) les rôles roles/bigquery.user et roles/bigquery.dataEditor.

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. Cela est dû au fait qu'il existe des programmations d'ingestion de données différentes pour chaque type de contenu, et tant que le processus d'ingestion n'est pas terminé, ils peuvent être incohérents. Vérifiez le champ update_time pour vous assurer que l'élément dispose des informations les plus récentes.

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 la même organisation/dossier/projet de façon séquentielle. Par exemple, effectuez le deuxième appel une fois l'appel précédent terminé. 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 relance automatique de la tentative de distribution, car Pub/Sub ne garantit pas la distribution de type "au moins une fois".

Pourquoi n'ai-je pas reçu de notification concernant 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 supprimé définitivement. Pour surveiller les projets en attente de suppression, vous pouvez définir un flux avec une condition dans l'élément lifecycleState du projet, par exemple temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED".