Häufig gestellte Fragen und Fehlerbehebung

Ist Cloud Asset Inventory ein globaler Dienst?

Ja. Die Cloud Asset API ist unabhängig vom Standort. Sie hat einen globalen Endpunkt, der die Metadaten aller unterstützten regionalen und globalen Assets in Cloud Asset Inventory bereitstellt. Auf die Cloud Asset API kann in jeder Zone zugegriffen werden.

Welche Art von Datenkonsistenz bietet Cloud Asset Inventory?

Cloud Asset Inventory bietet Eventual Consistency für aktuelle Daten und Best-Effort-Konsistenz bei Verlaufsdaten. Trotz der geringen Wahrscheinlichkeit in der Praxis ist es möglich, dass Cloud Asset Inventory einige Aktualisierungen eines Assets in der Vergangenheit übersehen hat.

Warum habe ich keine Berechtigung zur Verwendung der Cloud Asset API?

Wenn Sie nicht berechtigt sind, Assets zu exportieren oder den Verlauf für eine Organisation, ein Projekt oder einen Ordner abzurufen, wird ein Fehler zurückgegeben.

Wenn Sie beispielsweise keine Berechtigung haben und folgenden Befehl ausführen:

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

Gibt den folgenden Fehler zurück:

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

Bitten Sie Ihren Projekt-, Ordner- oder Organisationsadministrator um Zugriff, damit Sie dieses Problem beheben können. Abhängig von den Assets, die Sie exportieren oder für die Sie einen Verlauf abrufen möchten, benötigen Sie eine der folgenden Rollen oder anderen Rollen mit den erforderlichen Cloud Asset API-Berechtigungen:

  • cloudasset.viewer

  • cloudasset.owner

Weitere Informationen zu Rollen und Berechtigungen finden Sie unter Informationen zu Rollen.

Weitere Informationen zu Zugriffssteuerungsoptionen für Cloud Asset APIs finden Sie unter Zugriffssteuerung.

Warum wird bei meinen Exporten die Fehlermeldung „Berechtigung verweigert“ zurückgegeben?

Sofern nicht anders angegeben, verwendet Cloud Asset Inventory das standardmäßige Cloud Asset Inventory-Dienstkonto im aktiven Projekt, um Ressourcen wie Pub/Sub-Themen, Cloud Storage-Buckets und BigQuery-Tabellen zu verwalten. Dieses Dienstkonto wird erstellt, wenn Sie die Cloud Asset Inventory API zum ersten Mal aus einem Projekt aufrufen. Es hat standardmäßig die Berechtigung zum Verwalten dieser Ressourcen, sofern sie sich im selben Projekt befinden.

In den folgenden Situationen können Sie Fehlermeldungen aufgrund verweigerter Berechtigungen erhalten:

  • Bei Verwendung der REST API, mit der kein aktives Projekt festgelegt wird und Cloud Asset Inventory nicht weiß, welches Dienstkonto verwendet werden soll.

  • Wenn die gcloud CLI von einem anderen Projekt aus verwendet wird als dem, in dem sich das Pub/Sub-Thema, der Cloud Storage-Bucket oder die BigQuery-Tabelle befindet. Dies bedeutet, dass das standardmäßige Cloud Asset Inventory-Dienstkonto des aktiven Projekts zum Ausführen der Aufgabe verwendet wird (falls vorhanden) und möglicherweise nicht berechtigt ist, in die Ressourcen des anderen Projekts zu schreiben.

Damit bei Anfragen zum Exportieren in Pub/Sub-Themen, Cloud Storage-Buckets oder BigQuery-Tabellen das richtige Dienstkonto verwendet wird, können Sie die Projekt-ID angeben, die das richtige Cloud Asset Inventory-Standarddienstkonto enthält. Wenn Sie Daten von einem Projekt in ein anderes exportieren, müssen Sie dem Dienstkonto bestimmte Rollen zuweisen.

gcloud

Fügen Sie für die gcloud CLI das Flag --billing-project in den Befehl ein, um die Projekt-ID anzugeben, die das richtige Dienstkonto enthält:

--billing-project=BILLING_PROJECT_ID

Alternativ können Sie das Abrechnungsprojekt festlegen, bevor Sie Befehle über die gcloud CLI ausführen. Prüfen Sie zuerst, ob sich das Abrechnungsprojekt vom Kernprojekt unterscheidet:

gcloud config list

Legen Sie dann bei Bedarf das Abrechnungsprojekt fest:

gcloud config set billing/quota_project BILLING_PROJECT_ID

Geben Sie folgende Werte an:

  • BILLING_PROJECT_ID: Eine Projekt-ID, für die die Cloud Asset Inventory API aktiviert ist, und ein Dienstkonto mit Berechtigungen zum Verwalten des Pub/Sub-Zielthemas, des Cloud Storage-Bucket oder der BigQuery-Tabelle.

REST

Fügen Sie für die REST API den Header X-Goog-User-Project hinzu, um die Projekt-ID anzugeben, die das richtige Dienstkonto enthält. Wenn Sie curl verwenden, legen Sie den Header mit dem Flag -H fest:

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

Geben Sie folgende Werte an:

  • BILLING_PROJECT_ID: Eine Projekt-ID, für die die Cloud Asset Inventory API aktiviert ist, und ein Dienstkonto mit Berechtigungen zum Verwalten des Pub/Sub-Zielthemas, des Cloud Storage-Bucket oder der BigQuery-Tabelle.

Asset-Metadaten von einem Projekt in ein anderes exportieren

Wenn Sie Asset-Metadaten aus einem Projekt (PROJECT_A) in ein anderes Projekt (PROJECT_B) exportieren möchten, müssen Sie dem standardmäßigen Cloud Asset Inventory-Dienstkonto in PROJECT_A Zugriff auf die Ressourcen in PROJECT_B gewähren. Dies ermöglicht zwei Dinge:

  • Sie können Asset-Metadaten aus PROJECT_A in ein Pub/Sub-Thema, einen Cloud Storage-Bucket oder eine BigQuery-Tabelle in PROJECT_B exportieren.

  • Sie können PROJECT_A verwenden, um Asset-Metadaten aus PROJECT_B in ein Pub/Sub-Thema, einen Cloud Storage-Bucket oder eine BigQuery-Tabelle im Verzeichnis PROJECT_B zu exportieren.

So exportieren Sie Asset-Metadaten von einem Projekt in ein anderes:

  1. Prüfen Sie, ob die Cloud Asset Inventory API in dem Projekt PROJECT_A aktiviert ist, von dem Sie die Anfrage ausführen möchten.

  2. Rufen Sie mindestens einen Aufruf der Cloud Asset Inventory API in PROJECT_A auf, um das standardmäßige Cloud Asset Inventory-Dienstkonto zu erstellen. Alternativ können Sie sie manuell erstellen:

    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
    

    Google Cloud-Projektnummer ermitteln

    Console

    Führen Sie die folgenden Schritte aus, um eine Google Cloud-Projektnummer zu ermitteln:

    1. Rufen Sie in der Google Cloud Console die Seite Dashboard auf.

      Zu Google Dashboard

    2. Klicken Sie in der Menüleiste auf das Wechsler-Feld.
    3. Wählen Sie Ihre Organisation im Feld Auswählen aus aus und suchen Sie dann nach dem Namen Ihres Projekts.
    4. Klicken Sie auf den Projektnamen, um zu diesem Projekt zu wechseln. Die Projektnummer wird auf der Karte Projektinformationen angezeigt.

    gcloud-CLI

    Mit dem folgenden Befehl können Sie eine Google Cloud-Projektnummer abrufen:

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

  3. Gewähren Sie dem Dienstkonto die richtigen Berechtigungen.

    • Zum Veröffentlichen in einem Feed über Pub/Sub weisen Sie dem Dienstkonto für das Thema die Rolle roles/pubsub.publisher zu:

      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
      
    • Zum Schreiben in einen Cloud Storage-Bucket weisen Sie dem Dienstkonto im Bucket die Rolle roles/storage.admin zu:

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • Zum Schreiben in eine BigQuery-Tabelle weisen Sie dem Dienstkonto für das Projekt die Rollen roles/bigquery.dataEditor und roles/bigquery.user zu:

      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
      

Geben Sie beim Senden von Cloud Asset Inventory-Anfragen PROJECT_A als Projekt an, das Sie verwenden möchten. Legen Sie dazu für die gcloud CLI das Flag --billing-project auf PROJECT_A_ID fest. Legen Sie für REST den Header X-Goog-User-Project auf PROJECT_A_ID fest.

Warum ist das Ergebnis der Cloud Asset API veraltet?

Die Datenaktualität in der Cloud Asset API folgt dem Best-Effort-Prinzip. Fast alle Asset-Aktualisierungen stehen Clients innerhalb weniger Minuten zur Verfügung. In seltenen Fällen kann es jedoch vorkommen, dass das Ergebnis der Cloud Asset API-Methoden nicht die neuesten Asset-Updates enthält.

Warum werden temporäre Dateien nach der Ausführung von ExportAssets ausgegeben?

Der Vorgang ExportAssets kann temporäre Dateien im Ausgabeordner erstellen. Entfernen Sie diese temporären Dateien nicht, während der Vorgang ausgeführt wird. Nach Abschluss des Vorgangs werden die temporären Dateien automatisch entfernt.

Wenn die temporären Dateien weiterhin vorhanden sind, können Sie sie nach Abschluss des ExportAssets-Vorgangs sicher entfernen.

Warum werden meine Anmeldedaten für die Google Cloud CLI oder Cloud Shell abgelehnt?

Wenn ein Nutzerprojekt in einer Anfrage über die Google Cloud CLI oder Cloud Shell an cloudasset.googleapis.com gesendet wird, erhalten Sie eine Fehlermeldung wie die folgende:

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

Um dieses Problem zu beheben, legen Sie für das Nutzerprojekt die Projekt-ID des Nutzers fest, der die Cloud Asset API aktiviert. Geben Sie dazu den HTTP-Header X-Goog-User-Project in der HTTP-Anfrage an.

Wenn Sie curl verwenden, können Sie dazu den folgenden Parameter hinzufügen:

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

Wenn Sie die gcloud CLI verwenden, geben Sie das Flag --billing-project PROJECT_ID zusammen mit dem Befehl gcloud asset an oder verwenden Sie den folgenden Befehl:

gcloud config set billing/quota_project PROJECT_ID

Warum sehe ich unterschiedliche Ancestors für dieselben Assets?

Wenn Sie mit der Cloud Asset API verschiedene Metadatentypen abrufen, z. B. RESOURCE-Metadaten und IAM POLICY-Metadaten für dasselbe Asset, ist es möglich, dass das Feld ancestors für die unterschiedlichen Inhaltstypen nicht konsistent ist. Das liegt daran, dass es für jeden Inhaltstyp unterschiedliche Zeitpläne für die Datenaufnahme gibt und diese bis zum Abschluss des Aufnahmeprozesses unter Umständen inkonsistent sind. Prüfe im Feld update_time, ob das Asset die aktuellsten Informationen enthält.

Kontaktieren Sie uns, wenn die Inkonsistenzen länger als 24 Stunden andauern.

Wie oft sollte ich die ExportAssets API aufrufen?

Wir empfehlen, die ExportAssets API für dasselbe Projekt, denselben Ordner oder dieselbe Organisation nacheinander aufzurufen. Führen Sie beispielsweise den zweiten Aufruf aus, nachdem der vorherige Aufruf abgeschlossen ist. Wenn Sie Asset-Aktualisierungen in Echtzeit erfassen möchten, sollten Sie Echtzeitbenachrichtigungen in Betracht ziehen.

Warum erhalte ich doppelte Asset-Aktualisierungen?

Nach dem Einrichten von Echtzeitbenachrichtigungen erhalten Sie möglicherweise doppelte Asset-Updates in Ihrem Pub/Sub-Thema. Dies wird durch einen automatischen Versuch verursacht, die Zustellung noch einmal zu senden, da Pub/Sub keine mindestens einmalige Zustellung garantiert.

Warum habe ich keine Benachrichtigungen zum Löschen von Projekten erhalten?

Nachdem Sie ein Projekt beendet haben, haben Sie 30 Tage Zeit, den Vorgang rückgängig zu machen. Das Feld deleted in der Benachrichtigung wird erst festgelegt, wenn das Projekt endgültig gelöscht wird. Wenn Sie Projekte überwachen möchten, deren Löschung aussteht, können Sie einen Feed mit einer Bedingung für die lifecycleState des Projekts festlegen, z. B. temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED".

Wie rufe ich die JSON-Darstellung einer Ressource mit der SearchAllResources API ab?

Standardmäßig gibt SearchAllResources die folgenden Standardfelder zurück, wenn read_mask nicht angegeben ist:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Wenn Sie zusätzlich zu den oben aufgeführten Feldern alle Felder in den Ressourcenmetadaten abrufen möchten, können Sie das Flag read_mask (--read-mask in gcloud) in der Suchanfrage angeben.

Ein read_mask ist eine Liste von durch Kommas getrennten Feldern, die in den Ergebnissen zurückgegeben werden sollen. Einige Felder sind zu groß, z. B. versionedResources und attachedResources, und daher standardmäßig nicht in den Ergebnissen enthalten. Wenn Sie diese Felder einschließen möchten, können Sie sie in der read_mask angeben oder mit "*" alle verfügbaren Felder einschließen. Beispiele für read_mask-Werte: "name,location", "name,versionedResources" und "*".

Hier ein gcloud-Beispiel:

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