Domande frequenti e risoluzione dei problemi

Cloud Asset Inventory è un servizio globale?

Sì. L'API Cloud Asset non ha alcuna dipendenza dalla località. Dispone di un endpoint globale che fornisce i metadati di tutti gli asset regionali e globali supportati in Cloud Asset Inventory. È possibile accedere all'API Cloud Asset in qualsiasi zona.

Che tipo di coerenza dei dati offre Cloud Asset Inventory?

Cloud Asset Inventory offre coerenza finale sui dati attuali e coerenza secondo il criterio del "best effort" sui dati storici. Nonostante la bassa probabilità in pratica, è possibile che Cloud Asset Inventory perda alcuni aggiornamenti di un asset in passato.

Perché non ho l'autorizzazione per utilizzare l'API Cloud Asset?

Se non hai l'autorizzazione per esportare gli asset o recuperare la cronologia su un'organizzazione, un progetto o una cartella, viene restituito un errore.

Ad esempio, se non hai l'autorizzazione, esegui questo comando:

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

Restituisce il seguente errore:

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

Per risolvere questo problema, richiedi l'accesso all'amministratore del progetto, della cartella o dell'organizzazione. A seconda degli asset che stai cercando di esportare o per cui vuoi ottenere la cronologia, devi avere uno dei seguenti ruoli o altri ruoli che includono le autorizzazioni richieste per l'API Cloud Asset:

  • cloudasset.viewer

  • cloudasset.owner

Per ulteriori informazioni sui ruoli e sulle autorizzazioni, consulta la sezione Informazioni sui ruoli.

Per ulteriori informazioni sulle opzioni di controllo dell'accesso per le API Cloud Asset, consulta Controllo degli accessi.

Perché le mie esportazioni restituiscono un errore di autorizzazione negata?

Se non diversamente specificato, Cloud Asset Inventory utilizza l'account di servizio Cloud Asset Inventory predefinito nel progetto attivo per gestire risorse come gli argomenti Pub/Sub, i bucket Cloud Storage e le tabelle BigQuery. Questo account di servizio viene creato la prima volta che chiami l'API Cloud Asset Inventory da un progetto e per impostazione predefinita dispone dell'autorizzazione per gestire queste risorse purché si trovino nello stesso progetto.

Puoi ricevere errori di autorizzazione negata nelle seguenti situazioni:

  • Quando utilizzi l'API REST, che non imposta un progetto attivo e quindi Cloud Asset Inventory non sa quale account di servizio utilizzare.

  • Quando utilizzi gcloud CLI da un progetto diverso da quello in cui si trova l'argomento Pub/Sub, il bucket Cloud Storage o la tabella BigQuery. Ciò significa che l'account di servizio Cloud Asset Inventory predefinito del progetto attivo viene utilizzato per eseguire l'attività (se esistente) e potrebbe non disporre delle autorizzazioni per scrivere nelle risorse dell'altro progetto.

Per assicurarti che venga utilizzato l'account di servizio corretto quando effettui richieste di esportazione in argomenti Pub/Sub, bucket Cloud Storage o tabelle BigQuery, puoi specificare l'ID progetto che contiene l'account di servizio Cloud Asset Inventory predefinito corretto. Se stai esportando da un progetto a un altro, devi anche concedere ruoli specifici all'account di servizio.

gcloud

Per gcloud CLI, aggiungi il flag --billing-project al comando per specificare l'ID progetto che contiene l'account di servizio corretto:

--billing-project=BILLING_PROJECT_ID

In alternativa, puoi impostare il progetto di fatturazione prima di eseguire i comandi con gcloud CLI. Per prima cosa, verifica se il progetto di fatturazione è diverso da quello principale:

gcloud config list

Quindi, se necessario, imposta il progetto di fatturazione:

gcloud config set billing/quota_project BILLING_PROJECT_ID

Specifica i seguenti valori:

  • BILLING_PROJECT_ID: un ID progetto con l'API Cloud Asset Inventory abilitata e un account di servizio con autorizzazioni per gestire l'argomento Pub/Sub di destinazione, il bucket Cloud Storage o la tabella BigQuery.

REST

Per l'API REST, aggiungi l'intestazione X-Goog-User-Project per specificare l'ID progetto che contiene l'account di servizio corretto. Quando utilizzi curl, imposti l'intestazione con il flag -H:

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

Specifica i seguenti valori:

  • BILLING_PROJECT_ID: un ID progetto con l'API Cloud Asset Inventory abilitata e un account di servizio con autorizzazioni per gestire l'argomento Pub/Sub di destinazione, il bucket Cloud Storage o la tabella BigQuery.

Esportare i metadati delle risorse da un progetto a un altro

Per esportare i metadati degli asset da un progetto, PROJECT_A, a un altro, PROJECT_B, devi concedere all'account di servizio Cloud Asset Inventory predefinito in PROJECT_A l'accesso alle risorse in PROJECT_B. Ciò consente due cose:

  • Puoi esportare i metadati degli asset da PROJECT_A in un argomento Pub/Sub, un bucket Cloud Storage o una tabella BigQuery in PROJECT_B.

  • Puoi utilizzare PROJECT_A per esportare i metadati degli asset da PROJECT_B in un argomento Pub/Sub, in un bucket Cloud Storage o in una tabella BigQuery situata in PROJECT_B.

Per esportare i metadati delle risorse da un progetto a un altro, segui queste istruzioni:

  1. Assicurati che l'API Cloud Asset Inventory sia abilitata nel progetto da cui vuoi eseguire la richiesta, PROJECT_A.

  2. Effettua almeno una chiamata all'API Cloud Asset Inventory in PROJECT_A per creare l'account di servizio predefinito di Cloud Asset Inventory. In alternativa, puoi crearlo manualmente:

    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
    

    Come trovare il numero di un progetto Google Cloud

    Console

    Per trovare il numero di un progetto Google Cloud, completa questi passaggi:

    1. Vai alla pagina Dashboard nella console Google Cloud.

      Vai alla dashboard

    2. Fai clic sulla casella del selettore nella barra dei menu.
    3. Seleziona la tua organizzazione dalla casella Seleziona da, quindi cerca il nome del tuo progetto.
    4. Fai clic sul nome del progetto per passare a quel progetto. Il numero di progetto è visualizzato nella scheda Informazioni sul progetto.

    Interfaccia a riga di comando gcloud

    Puoi recuperare il numero di un progetto Google Cloud con il seguente comando:

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

  3. Concedi le autorizzazioni corrette all'account di servizio.

    • Per pubblicare in un feed tramite Pub/Sub, concedi il ruolo roles/pubsub.publisher all'account di servizio nell'argomento:

      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
      
    • Per scrivere in un bucket Cloud Storage, concedi il ruolo roles/storage.admin all'account di servizio nel bucket:

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • Per scrivere in una tabella BigQuery, concedi i ruoli roles/bigquery.dataEditor e roles/bigquery.user all'account di servizio del progetto:

      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
      

Quando effettui richieste Cloud Asset Inventory, assicurati di specificare PROJECT_A come progetto da utilizzare. Per farlo per gcloud CLI, imposta il flag --billing-project su PROJECT_A_ID. Per REST, imposta l'intestazione X-Goog-User-Project su PROJECT_A_ID.

Perché il risultato dell'API Cloud Asset è obsoleto?

L'aggiornamento dei dati nell'API Cloud Asset viene eseguito secondo il criterio del "best effort". Sebbene quasi tutti gli aggiornamenti degli asset siano disponibili per i client in pochi minuti, in rari casi è possibile che i metodi dell'API Cloud Asset non includano gli aggiornamenti più recenti degli asset.

Perché vengono visualizzati i file temporanei dopo l'esecuzione di ExportAssets?

L'operazione ExportAssets potrebbe creare file temporanei nella cartella di output. Non rimuovere questi file temporanei durante l'operazione. Al termine dell'operazione, i file temporanei vengono rimossi automaticamente.

Se i file temporanei rimangono, puoi rimuoverli in modo sicuro dopo il completamento dell'operazione ExportAssets.

Perché la mia credenziale Google Cloud CLI o Cloud Shell è stata rifiutata?

Se un progetto utente in una richiesta viene inviato a cloudasset.googleapis.com da Google Cloud CLI o Cloud Shell, viene visualizzato un messaggio di errore simile al seguente:

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

Per risolvere il problema, imposta il progetto utente sull'ID progetto dell'utente abilitato per l'API Cloud Asset. A questo scopo, specifica l'intestazione HTTP X-Goog-User-Project nella richiesta HTTP.

Se utilizzi curl, aggiungi il seguente parametro:

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

Se utilizzi gcloud CLI, specifica il flag --billing-project PROJECT_ID insieme al comando gcloud asset oppure utilizza il seguente comando:

gcloud config set billing/quota_project PROJECT_ID

Perché vedo predecessori diversi per gli stessi asset?

Quando chiami l'API Cloud Asset per ricevere tipi di metadati diversi, ad esempio metadati RESOURCE e metadati IAM POLICY per la stessa risorsa, è possibile che il campo ancestors non sia coerente tra i tipi di contenuti. Questo perché le pianificazioni di importazione dati sono diverse per ogni tipo di contenuto e, fino al completamento del processo di importazione, potrebbero non essere coerenti. Controlla il campo update_time per assicurarti che la risorsa contenga le informazioni più aggiornate.

Se l'incoerenza persiste per più di 24 ore, contattaci.

Con quale frequenza devo chiamare l'API ExportAssets?

Ti consigliamo di chiamare l'API ExportAssets per lo stesso progetto, la stessa cartella o la stessa organizzazione in modo sequenziale; ad esempio, effettua la seconda chiamata dopo il completamento di quella precedente. Per acquisire gli aggiornamenti degli asset in tempo reale, valuta la possibilità di utilizzare le notifiche in tempo reale.

Ricevere aggiornamenti degli asset duplicati

Dopo aver configurato le notifiche in tempo reale, puoi ricevere aggiornamenti degli asset duplicati nell'argomento Pub/Sub. Ciò è causato da un tentativo automatico di ritentare la consegna, poiché Pub/Sub non garantisce la consegna "at-least-once".

Perché non ho ricevuto notifiche per l'eliminazione dei progetti?

Quando chiudi un progetto, hai 30 giorni di tempo per annullare l'operazione. Il campo deleted nella notifica non viene impostato finché il progetto non viene eliminato definitivamente. Per monitorare i progetti in attesa di eliminazione, puoi impostare un feed con una condizione in lifecycleState del progetto, ad esempio temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED".

Come posso recuperare la rappresentazione JSON di una risorsa con l'API SearchAllResources?

Per impostazione predefinita, SearchAllResources restituisce i seguenti campi standard quando read_mask non è specificato:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Se vuoi recuperare tutti i campi nei metadati della risorsa oltre a quelli elencati in precedenza, puoi specificare il flag read_mask (--read-mask in gcloud) nella richiesta di ricerca.

Un read_mask è un elenco di campi, separati da virgole, che devono essere restituiti nei risultati. Alcuni campi sono troppo grandi, come versionedResources e attachedResources, quindi non sono inclusi nei risultati per impostazione predefinita. Per includere questi campi, puoi specificarli in read_mask oppure utilizzare "*" per includere tutti i campi disponibili. Esempi di valori read_mask includono: "name,location", "name,versionedResources" e "*".

Ecco un esempio di gcloud:

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