Exporter les métadonnées des éléments vers BigQuery

Cet article explique comment exporter un instantané d'éléments de votre organisation, de votre dossier ou de votre projet vers une table BigQuery, puis comment exécuter une analyse de données sur votre inventaire. BigQuery offre aux utilisateurs une expérience semblable à SQL pour analyser des données et produire des insights pertinents sans avoir à utiliser de scripts personnalisés.

Avant de commencer

  1. Activez l'API Cloud Asset Inventory dans le projet à partir duquel vous exécutez les commandes inventaire des éléments cloud.

    Activer l'API Cloud Asset Inventory

  2. Assurez-vous que votre compte dispose du rôle approprié pour appeler l'API Cloud Asset Inventory. Pour connaître les autorisations individuelles pour chaque type d'appel, consultez Autorisations.

  3. Créez un ensemble de données BigQuery pour l'exportation, si vous n'en avez pas déjà un.

Limites

  • Lorsque vous exportez les données d'une table BigQuery, tous les champs ne sont pas compatibles avec inventaire des éléments cloud.

  • Les champs d'éléments qui changent fréquemment, tels que numBytes, numLongTermBytes, numPhysicalBytes et numRows, peuvent être exportés avec une valeur null.

  • L'exportation vers des tables en cluster BigQuery n'est pas prise en charge.

  • Les tables BigQuery chiffrées avec des clés Cloud Key Management Service (Cloud KMS) personnalisées ne sont pas compatibles.

  • L'ajout du résultat de l'exportation à une table existante n'est pas possible, sauf si vous exportez vers une table partitionnée. La table de destination doit être vide ou vous devez l'écraser. Pour l'écraser, utilisez l'option --output-bigquery-force avec gcloud CLI ou "force": true avec l'API REST.

  • Les types de ressources Google Kubernetes Engine (GKE), à l'exception de container.googleapis.com/Cluster et container.googleapis.com/NodePool, ne sont pas compatibles avec l'exportation vers des tables distinctes pour chaque type de ressource.

  • Inventaire des éléments cloud rejette les demandes d'exportation si une demande précédente vers la même destination a commencé il y a moins de 15 minutes et est toujours en cours d'exécution. Toutefois, si une exportation a pris plus de 15 minutes, elle est marquée comme terminée et de nouvelles demandes d'exportation vers la même destination sont autorisées.

  • Le type de contenu ACCESS_POLICY ne peut être exporté qu'au niveau de l'organisation.

  • Si la table vers laquelle vous exportez des données existe déjà et est en cours d'exportation, une erreur 400 est renvoyée.

Schémas BigQuery utilisés pour l'exportation

Chaque table BigQuery est définie par un schéma qui décrit les noms de colonne, les types de données et d'autres informations. La définition du type de contenu pour une exportation détermine le schéma de votre tableau :

  • Ressource ou non spécifié : lorsque vous définissez le type de contenu sur RESOURCE ou que vous ne le spécifiez pas, et que vous définissez l'indicateur per-asset-type sur false ou que vous ne l'utilisez pas, vous créez une table BigQuery dont le schéma est le suivant.

    Schéma de ressources

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_document_uri",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "discovery_name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "resource_url",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "parent",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "data",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "location",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "resource",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]

    La colonne resource.data correspond aux métadonnées de ressource représentées sous forme de chaîne JSON.

    Lorsque vous définissez le type de contenu sur RESOURCE ou que vous ne le définissez pas, et que vous définissez l'indicateur per-asset-type sur true, vous créez des tables distinctes pour chaque type d'élément. Le schéma de chaque table inclut des colonnes de type RECORD mises en correspondance avec les champs imbriqués du champ Resource.data de ce type d'élément (jusqu'au niveau imbriqué 15 compatible avec BigQuery). Pour obtenir des exemples de tables, consultez export-assets-examples dans la console Google Cloud .

  • Stratégie IAM : lorsque vous définissez le type de contenu sur IAM_POLICY dans l'API REST ou sur iam-policy dans gcloud CLI, vous créez une table BigQuery qui présente le schéma suivant.

    Schéma des stratégies IAM

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "INTEGER"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "role",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "members",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "expression",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "description",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "location",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "condition",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "bindings",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "service",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "log_type",
                    "type": "INTEGER"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "exempted_members",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "audit_log_configs",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "audit_configs",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "iam_policy",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • Règle d'administration : lorsque vous définissez le type de contenu sur ORG_POLICY dans l'API REST ou sur org-policy dans gcloud CLI, vous créez une table BigQuery dont le schéma est le suivant.

    Schéma des règles d'administration

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "version",
            "type": "INTEGER"
          },
          {
            "mode": "NULLABLE",
            "name": "constraint",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "update_time",
            "type": "TIMESTAMP"
          },
          {
            "fields": [
              {
                "mode": "REPEATED",
                "name": "allowed_values",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "denied_values",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "all_values",
                "type": "INTEGER"
              },
              {
                "mode": "NULLABLE",
                "name": "suggested_value",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "inherit_from_parent",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "list_policy",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "enforced",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "boolean_policy",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "_present",
                "type": "BOOLEAN"
              }
            ],
            "mode": "NULLABLE",
            "name": "restore_default",
            "type": "RECORD"
          }
        ],
        "mode": "REPEATED",
        "name": "org_policy",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • Stratégie VPCSC : lorsque vous définissez le type de contenu sur ACCESS_POLICY dans l'API REST ou sur access-policy dans gcloud CLI, vous créez une table BigQuery dont le schéma est le suivant.

    Schéma de stratégie VPCSC

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "parent",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "REPEATED",
            "name": "scopes",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "access_policy",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "description",
            "type": "STRING"
          },
          {
            "fields": [
              {
                "fields": [
                  {
                    "mode": "REPEATED",
                    "name": "ip_subnetworks",
                    "type": "STRING"
                  },
                  {
                    "fields": [
                      {
                        "mode": "NULLABLE",
                        "name": "require_screenlock",
                        "type": "BOOLEAN"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "allowed_encryption_statuses",
                        "type": "INTEGER"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "os_type",
                            "type": "INTEGER"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "minimum_version",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "require_verified_chrome_os",
                            "type": "BOOLEAN"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "os_constraints",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "allowed_device_management_levels",
                        "type": "INTEGER"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "require_admin_approval",
                        "type": "BOOLEAN"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "require_corp_owned",
                        "type": "BOOLEAN"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "device_policy",
                    "type": "RECORD"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "required_access_levels",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "negate",
                    "type": "BOOLEAN"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "members",
                    "type": "STRING"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "regions",
                    "type": "STRING"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "network",
                            "type": "STRING"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "vpc_ip_subnetworks",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "vpc_subnetwork",
                        "type": "RECORD"
                      }
                    ],
                    "mode": "REPEATED",
                    "name": "vpc_network_sources",
                    "type": "RECORD"
                  }
                ],
                "mode": "REPEATED",
                "name": "conditions",
                "type": "RECORD"
              },
              {
                "mode": "NULLABLE",
                "name": "combining_function",
                "type": "INTEGER"
              }
            ],
            "mode": "NULLABLE",
            "name": "basic",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "expression",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "description",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "location",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "expr",
                "type": "RECORD"
              }
            ],
            "mode": "NULLABLE",
            "name": "custom",
            "type": "RECORD"
          }
        ],
        "mode": "NULLABLE",
        "name": "access_level",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "title",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "description",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "perimeter_type",
            "type": "INTEGER"
          },
          {
            "fields": [
              {
                "mode": "REPEATED",
                "name": "resources",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "access_levels",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "restricted_services",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "enable_restriction",
                    "type": "BOOLEAN"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "allowed_services",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "vpc_accessible_services",
                "type": "RECORD"
              },
              {
                "fields": [
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "access_level",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "resource",
                            "type": "STRING"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "sources",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "identities",
                        "type": "STRING"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "identity_type",
                        "type": "INTEGER"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "ingress_from",
                    "type": "RECORD"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "service_name",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "method",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "permission",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "method_selectors",
                            "type": "RECORD"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "operations",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "resources",
                        "type": "STRING"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "ingress_to",
                    "type": "RECORD"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "ingress_policies",
                "type": "RECORD"
              },
              {
                "fields": [
                  {
                    "fields": [
                      {
                        "mode": "REPEATED",
                        "name": "identities",
                        "type": "STRING"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "identity_type",
                        "type": "INTEGER"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "access_level",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "resource",
                            "type": "STRING"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "sources",
                        "type": "RECORD"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "source_restriction",
                        "type": "INTEGER"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "egress_from",
                    "type": "RECORD"
                  },
                  {
                    "fields": [
                      {
                        "mode": "REPEATED",
                        "name": "resources",
                        "type": "STRING"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "service_name",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "method",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "permission",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "method_selectors",
                            "type": "RECORD"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "operations",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "external_resources",
                        "type": "STRING"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "egress_to",
                    "type": "RECORD"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "egress_policies",
                "type": "RECORD"
              }
            ],
            "mode": "NULLABLE",
            "name": "status",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "REPEATED",
                "name": "resources",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "access_levels",
                "type": "STRING"
              },
              {
                "mode": "REPEATED",
                "name": "restricted_services",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "enable_restriction",
                    "type": "BOOLEAN"
                  },
                  {
                    "mode": "REPEATED",
                    "name": "allowed_services",
                    "type": "STRING"
                  }
                ],
                "mode": "NULLABLE",
                "name": "vpc_accessible_services",
                "type": "RECORD"
              },
              {
                "fields": [
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "access_level",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "resource",
                            "type": "STRING"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "sources",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "identities",
                        "type": "STRING"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "identity_type",
                        "type": "INTEGER"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "ingress_from",
                    "type": "RECORD"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "service_name",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "method",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "permission",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "method_selectors",
                            "type": "RECORD"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "operations",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "resources",
                        "type": "STRING"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "ingress_to",
                    "type": "RECORD"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "ingress_policies",
                "type": "RECORD"
              },
              {
                "fields": [
                  {
                    "fields": [
                      {
                        "mode": "REPEATED",
                        "name": "identities",
                        "type": "STRING"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "identity_type",
                        "type": "INTEGER"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "access_level",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "resource",
                            "type": "STRING"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "sources",
                        "type": "RECORD"
                      },
                      {
                        "mode": "NULLABLE",
                        "name": "source_restriction",
                        "type": "INTEGER"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "egress_from",
                    "type": "RECORD"
                  },
                  {
                    "fields": [
                      {
                        "mode": "REPEATED",
                        "name": "resources",
                        "type": "STRING"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "service_name",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "method",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "permission",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "method_selectors",
                            "type": "RECORD"
                          }
                        ],
                        "mode": "REPEATED",
                        "name": "operations",
                        "type": "RECORD"
                      },
                      {
                        "mode": "REPEATED",
                        "name": "external_resources",
                        "type": "STRING"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "egress_to",
                    "type": "RECORD"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "title",
                    "type": "STRING"
                  }
                ],
                "mode": "REPEATED",
                "name": "egress_policies",
                "type": "RECORD"
              }
            ],
            "mode": "NULLABLE",
            "name": "spec",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "use_explicit_dry_run_spec",
            "type": "BOOLEAN"
          },
          {
            "mode": "NULLABLE",
            "name": "etag",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "service_perimeter",
        "type": "RECORD"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "authorization_type",
            "type": "INTEGER"
          },
          {
            "mode": "NULLABLE",
            "name": "asset_type",
            "type": "INTEGER"
          },
          {
            "mode": "NULLABLE",
            "name": "authorization_direction",
            "type": "INTEGER"
          },
          {
            "mode": "REPEATED",
            "name": "orgs",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "authorized_orgs_desc",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • Inventaire des instances OSConfig : lorsque vous définissez le type de contenu sur OS_INVENTORY dans l'API REST ou os-inventory dans la gcloud CLI, vous créez une table BigQuery qui présente le schéma suivant.

    Schéma de l'inventaire d'OS

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "name",
            "type": "STRING"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "hostname",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "long_name",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "short_name",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "version",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "architecture",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "kernel_version",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "kernel_release",
                "type": "STRING"
              },
              {
                "mode": "NULLABLE",
                "name": "osconfig_agent_version",
                "type": "STRING"
              }
            ],
            "mode": "NULLABLE",
            "name": "os_info",
            "type": "RECORD"
          },
          {
            "fields": [
              {
                "mode": "NULLABLE",
                "name": "key",
                "type": "STRING"
              },
              {
                "fields": [
                  {
                    "mode": "NULLABLE",
                    "name": "id",
                    "type": "STRING"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "origin_type",
                    "type": "INTEGER"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "create_time",
                    "type": "TIMESTAMP"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "update_time",
                    "type": "TIMESTAMP"
                  },
                  {
                    "mode": "NULLABLE",
                    "name": "type",
                    "type": "INTEGER"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "yum_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "apt_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "zypper_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "googet_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "patch_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "category",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "severity",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "summary",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "zypper_patch",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "title",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "description",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "id",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "name",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "categories",
                            "type": "RECORD"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "kb_article_ids",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "support_url",
                            "type": "STRING"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "more_info_urls",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "update_id",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "revision_number",
                            "type": "INTEGER"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "last_deployment_change_time",
                            "type": "TIMESTAMP"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "wua_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "caption",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "description",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "hot_fix_id",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "install_time",
                            "type": "TIMESTAMP"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "qfe_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "cos_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "display_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "display_version",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "publisher",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "year",
                                "type": "INTEGER"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "month",
                                "type": "INTEGER"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "day",
                                "type": "INTEGER"
                              }
                            ],
                            "mode": "NULLABLE",
                            "name": "install_date",
                            "type": "RECORD"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "help_link",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "windows_application",
                        "type": "RECORD"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "installed_package",
                    "type": "RECORD"
                  },
                  {
                    "fields": [
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "yum_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "apt_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "zypper_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "googet_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "patch_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "category",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "severity",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "summary",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "zypper_patch",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "title",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "description",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "id",
                                "type": "STRING"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "name",
                                "type": "STRING"
                              }
                            ],
                            "mode": "REPEATED",
                            "name": "categories",
                            "type": "RECORD"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "kb_article_ids",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "support_url",
                            "type": "STRING"
                          },
                          {
                            "mode": "REPEATED",
                            "name": "more_info_urls",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "update_id",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "revision_number",
                            "type": "INTEGER"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "last_deployment_change_time",
                            "type": "TIMESTAMP"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "wua_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "caption",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "description",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "hot_fix_id",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "install_time",
                            "type": "TIMESTAMP"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "qfe_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "package_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "architecture",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "version",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "cos_package",
                        "type": "RECORD"
                      },
                      {
                        "fields": [
                          {
                            "mode": "NULLABLE",
                            "name": "display_name",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "display_version",
                            "type": "STRING"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "publisher",
                            "type": "STRING"
                          },
                          {
                            "fields": [
                              {
                                "mode": "NULLABLE",
                                "name": "year",
                                "type": "INTEGER"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "month",
                                "type": "INTEGER"
                              },
                              {
                                "mode": "NULLABLE",
                                "name": "day",
                                "type": "INTEGER"
                              }
                            ],
                            "mode": "NULLABLE",
                            "name": "install_date",
                            "type": "RECORD"
                          },
                          {
                            "mode": "NULLABLE",
                            "name": "help_link",
                            "type": "STRING"
                          }
                        ],
                        "mode": "NULLABLE",
                        "name": "windows_application",
                        "type": "RECORD"
                      }
                    ],
                    "mode": "NULLABLE",
                    "name": "available_package",
                    "type": "RECORD"
                  }
                ],
                "mode": "NULLABLE",
                "name": "value",
                "type": "RECORD"
              }
            ],
            "mode": "REPEATED",
            "name": "items",
            "type": "RECORD"
          },
          {
            "mode": "NULLABLE",
            "name": "update_time",
            "type": "TIMESTAMP"
          }
        ],
        "mode": "NULLABLE",
        "name": "os_inventory",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]
  • Relation : lorsque vous définissez le type de contenu sur RELATIONSHIP dans l'API REST ou sur relationship dans gcloud CLI, vous créez une table BigQuery dont le schéma est le suivant.

    Schéma des relations

    [
      {
        "mode": "NULLABLE",
        "name": "name",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "asset_type",
        "type": "STRING"
      },
      {
        "fields": [
          {
            "mode": "NULLABLE",
            "name": "asset",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "asset_type",
            "type": "STRING"
          },
          {
            "mode": "REPEATED",
            "name": "ancestors",
            "type": "STRING"
          },
          {
            "mode": "NULLABLE",
            "name": "relationship_type",
            "type": "STRING"
          }
        ],
        "mode": "NULLABLE",
        "name": "related_asset",
        "type": "RECORD"
      },
      {
        "mode": "REPEATED",
        "name": "ancestors",
        "type": "STRING"
      },
      {
        "mode": "NULLABLE",
        "name": "update_time",
        "type": "TIMESTAMP"
      }
    ]

Exporter un instantané d'élément

gcloud

gcloud asset export \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \
    --content-type=CONTENT_TYPE \
    --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \
    --snapshot-time="SNAPSHOT_TIME" \
    --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
    --output-bigquery-force

Indiquez les valeurs suivantes :

  • SCOPE : utilisez l'une des valeurs suivantes :

    • project=PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • folder=FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : facultatif. ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui dispose des autorisations nécessaires pour gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Liste de types d'éléments pouvant faire l'objet d'une recherche, séparés par une virgule. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque --asset-types n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Lorsque --content-type n'est pas spécifié, seules les informations de base sont renvoyées, telles que les noms des composants, la dernière mise à jour des composants et les projets, dossiers et organisations auxquels ils appartiennent.
  • RELATIONSHIP_TYPE_# : facultatif. Nécessite l'accès au niveau Premium ou Enterprise de Security Command Center ou à Gemini Cloud Assist. Liste de types de relations entre les composants que vous souhaitez récupérer, séparés par une virgule. Pour que cela fonctionne, vous devez définir CONTENT_TYPE sur RELATIONSHIP.
  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos éléments, au format gcloud topic datetime. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque --snapshot-time n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : table BigQuery vers laquelle vous exportez vos métadonnées. Si elle n'existe pas, elle est créée.

L'option --output-bigquery-force écrase la table de destination si elle existe.

Consultez la documentation de référence de gcloud CLI pour connaître toutes les options.

Exemple

Exécutez la commande suivante pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project vers la table BigQuery my-table.

gcloud asset export \
    --project=my-project \
    --content-type=resource \
    --snapshot-time="2024-01-30" \
    --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \
    --output-bigquery-force

Exemple de réponse

Export in progress for root asset [projects/my-project].
Use [gcloud asset operations describe projects/000000000000/operations/ExportAssets/RESOURCE/00000000000000000000000000000000] to check the status of the operation.

REST

Méthode HTTP et URL :

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets

En-têtes :

X-Goog-User-Project: BILLING_PROJECT_ID

Corps JSON de la requête :

{
  "assetTypes": [
    "ASSET_TYPE_1",
    "ASSET_TYPE_2",
    "..."
  ],
  "contentType": "CONTENT_TYPE",
  "relationshipTypes": [
    "RELATIONSHIP_TYPE_1",
    "RELATIONSHIP_TYPE_2",
    "..."
  ],
  "readTime": "SNAPSHOT_TIME",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID",
      "table": "TABLE_NAME",
      "force": true
    }
  }
}

Indiquez les valeurs suivantes :

  • SCOPE_PATH : utilisez l'une des valeurs suivantes :

    Les valeurs autorisées sont les suivantes :

    • projects/PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • projects/PROJECT_NUMBER, où PROJECT_NUMBER correspond au numéro du projet contenant les métadonnées d'éléments que vous souhaitez exporter.

      Trouver le numéro d'un projet Google Cloud

      ConsoleGoogle Cloud

      Pour trouver le numéro d'un projet Google Cloud , procédez comme suit :

      1. Accédez à la page d'accueil de la console Google Cloud .

        Accéder à la page d'accueil

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste, puis recherchez le nom de votre projet. Le nom, le numéro et l'ID du projet sont affichés près de l'en-tête Bienvenue.

        Jusqu'à 4 000 ressources sont affichées. Si vous ne voyez pas le projet que vous recherchez, accédez à la page Gérer les ressources et filtrez la liste à l'aide du nom de ce projet.

      CLI gcloud

      Vous pouvez récupérer un numéro de projet Google Cloud avec la commande suivante :

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui dispose des autorisations nécessaires pour gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Tableau de types d'éléments pouvant faire l'objet d'une recherche. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque assetTypes n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Lorsque contentType n'est pas spécifié, seules des informations de base sont renvoyées, telles que les noms des composants, la dernière fois qu'ils ont été mis à jour, ainsi que les projets, dossiers et organisations auxquels ils appartiennent.
  • RELATIONSHIP_TYPE_# : facultatif. Nécessite l'accès au niveau Premium ou Enterprise de Security Command Center ou à Gemini Cloud Assist. Liste de types de relations entre les composants que vous souhaitez récupérer, séparés par une virgule. Pour que cela fonctionne, vous devez définir CONTENT_TYPE sur RELATIONSHIP.
  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos composants, au format RFC 3339. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque readTime n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : table BigQuery vers laquelle vous exportez vos métadonnées. Si elle n'existe pas, elle est créée.

La paire clé-valeur "force": true écrase la table de destination si elle existe.

Consultez la documentation de référence REST pour toutes les options.

Exemples de commandes

Exécutez l'une des commandes suivantes pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project vers la table BigQuery my-table.

curl (Linux, macOS ou Cloud Shell)

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "contentType": "RESOURCE",
            "readTime": "2024-01-30T00:00:00Z",
            "outputConfig": {
              "bigqueryDestination": {
                "dataset": "projects/my-project/datasets/my-dataset",
                "table": "my-table",
                "force": true
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-Goog-User-Project" = "BILLING_PROJECT_ID";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "contentType": "RESOURCE",
  "readTime": "2024-01-30T00:00:00Z",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/my-project/datasets/my-dataset",
      "table": "my-table",
      "force": true
    }
  }
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content

Exemple de réponse

{
  "name": "projects/000000000000/operations/ExportAssets/RESOURCE/00000000000000000000000000000000",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.asset.v1.ExportAssetsRequest",
    "parent": "projects/000000000000",
    "readTime": "2024-01-30T00:00:00Z",
    "contentType": "RESOURCE",
    "outputConfig": {
      "bigqueryDestination": {
        "dataset": "projects/my-project/datasets/my-dataset",
        "table": "my-table",
        "force": true
      }
    }
  }
}

Go

Pour savoir comment installer et utiliser la bibliothèque cliente pour inventaire des éléments cloud, consultez la page Bibliothèques clientes Cloud Asset Inventory.

Pour vous authentifier auprès de inventaire des éléments cloud, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.


// Sample asset-quickstart exports assets to given bigquery table.
package main

import (
	"context"
	"fmt"
	"log"
	"os"
	"strings"

	asset "cloud.google.com/go/asset/apiv1"
	"cloud.google.com/go/asset/apiv1/assetpb"
)

func main() {
	ctx := context.Background()
	projectID := os.Getenv("GOOGLE_CLOUD_PROJECT")
	client, err := asset.NewClient(ctx)
	if err != nil {
		log.Fatalf("asset.NewClient: %v", err)
	}
	defer client.Close()
	datasetID := strings.Replace(fmt.Sprintf("%s-for-assets", projectID), "-", "_", -1)
	dataset := fmt.Sprintf("projects/%s/datasets/%s", projectID, datasetID)
	req := &assetpb.ExportAssetsRequest{
		Parent: fmt.Sprintf("projects/%s", projectID),
		OutputConfig: &assetpb.OutputConfig{
			Destination: &assetpb.OutputConfig_BigqueryDestination{
				BigqueryDestination: &assetpb.BigQueryDestination{
					Dataset: dataset,
					Table:   "test",
					Force:   true,
				},
			},
		},
	}
	op, err := client.ExportAssets(ctx, req)
	if err != nil {
		log.Fatalf("ExportAssets: %v", err)
	}
	resp, err := op.Wait(ctx)
	if err != nil {
		log.Fatalf("Wait: %v", err)
	}
	fmt.Print(resp)
}

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour inventaire des éléments cloud, consultez la page Bibliothèques clientes Cloud Asset Inventory.

Pour vous authentifier auprès de inventaire des éléments cloud, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

// Imports the Google Cloud client library

import com.google.cloud.ServiceOptions;
import com.google.cloud.asset.v1.AssetServiceClient;
import com.google.cloud.asset.v1.BigQueryDestination;
import com.google.cloud.asset.v1.ContentType;
import com.google.cloud.asset.v1.ExportAssetsRequest;
import com.google.cloud.asset.v1.ExportAssetsRequest.Builder;
import com.google.cloud.asset.v1.ExportAssetsResponse;
import com.google.cloud.asset.v1.OutputConfig;
import com.google.cloud.asset.v1.PartitionSpec;
import com.google.cloud.asset.v1.ProjectName;
import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.ExecutionException;

public class ExportAssetsBigqueryExample {

  // Use the default project Id.
  private static final String projectId = ServiceOptions.getDefaultProjectId();

  /** 
   * Export assets to BigQuery for a project.

   * @param bigqueryDataset which dataset the results will be exported to
   * @param bigqueryTable which table the results will be exported to
   * @param contentType determines the schema for the table
   * @param assetTypes a list of asset types to export. if empty, export all.
   * @param isPerType separate BigQuery tables for each resource type
   */
  public static void exportBigQuery(String bigqueryDataset, String bigqueryTable,
      ContentType contentType, String[] assetTypes, boolean isPerType)
      throws IOException, IllegalArgumentException, InterruptedException, ExecutionException {
    try (AssetServiceClient client = AssetServiceClient.create()) {
      ProjectName parent = ProjectName.of(projectId);
      OutputConfig outputConfig;
      // Outputs to per-type BigQuery table.
      if (isPerType) {
        outputConfig =
            OutputConfig.newBuilder()
                .setBigqueryDestination(
                    BigQueryDestination.newBuilder()
                        .setDataset(bigqueryDataset)
                        .setTable(bigqueryTable)
                        .setForce(true)
                        .setSeparateTablesPerAssetType(true)
                        .setPartitionSpec(
                            PartitionSpec.newBuilder()
                                .setPartitionKey(PartitionSpec.PartitionKey.READ_TIME)
                                .build())
                        .build())
                .build();
      } else {
        outputConfig =
            OutputConfig.newBuilder()
                .setBigqueryDestination(
                    BigQueryDestination.newBuilder()
                        .setDataset(bigqueryDataset)
                        .setTable(bigqueryTable)
                        .setForce(true)
                        .build())
                .build();
      }
      Builder exportAssetsRequestBuilder = ExportAssetsRequest.newBuilder()
          .setParent(parent.toString()).setContentType(contentType).setOutputConfig(outputConfig);
      if (assetTypes.length > 0) {
        exportAssetsRequestBuilder.addAllAssetTypes(Arrays.asList(assetTypes));
      }
      ExportAssetsRequest request = exportAssetsRequestBuilder.build();
      ExportAssetsResponse response = client.exportAssetsAsync(request).get();
      System.out.println(response);
    }
  }
}

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour inventaire des éléments cloud, consultez la page Bibliothèques clientes Cloud Asset Inventory.

Pour vous authentifier auprès de inventaire des éléments cloud, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const dataSet = 'projects/project_id/datasets/dataset_id';
// const table = 'mytable';

const {AssetServiceClient} = require('@google-cloud/asset');
const client = new AssetServiceClient();

async function exportAssetsBigquery() {
  const projectId = await client.getProjectId();
  const projectResource = client.projectPath(projectId);
  const dataset = dataSet;

  const request = {
    parent: projectResource,
    outputConfig: {
      bigqueryDestination: {
        dataset: `projects/${projectId}/${dataset}`,
        table: table,
        force: true,
      },
    },
  };

  // Handle the operation using the promise pattern.
  const [operation] = await client.exportAssets(request);

  // Operation#promise starts polling for the completion of the operation.
  const [result] = await operation.promise();

  // Do things with with the response.
  console.log(result);
}

exportAssetsBigquery();

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour inventaire des éléments cloud, consultez la page Bibliothèques clientes Cloud Asset Inventory.

Pour vous authentifier auprès de inventaire des éléments cloud, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.

from google.cloud import asset_v1

# TODO project_id = 'Your Google Cloud Project ID'
# TODO dataset = 'Your BigQuery dataset path'
# TODO table = 'Your BigQuery table name'
# TODO content_type ="Content type to export"

client = asset_v1.AssetServiceClient()
parent = f"projects/{project_id}"
output_config = asset_v1.OutputConfig()
output_config.bigquery_destination.dataset = dataset
output_config.bigquery_destination.table = table
output_config.bigquery_destination.force = True
response = client.export_assets(
    request={
        "parent": parent,
        "content_type": content_type,
        "output_config": output_config,
    }
)
print(response.result())

Exporter un instantané d'élément vers des tables distinctes pour chaque type d'élément

Vous pouvez exporter des éléments vers des tables BigQuery distinctes pour chaque type d'élément à l'aide de l'indicateur --per-asset-type dans gcloud CLI et de "separateTablesPerAssetType": true dans les requêtes de l'API REST. Le type de contenu RELATIONSHIP ne peut pas être exporté de cette manière.

Dans ce mode, le nom de chaque table est TABLE_NAME concaténé avec _ (trait de soulignement) et le nom du type d'élément. Les caractères non alphanumériques sont remplacés par _.

Si l'exportation vers une table échoue, l'ensemble de l'opération d'exportation échoue et renvoie la première erreur. Les résultats des exportations précédentes ayant réussi sont conservés.

Les types suivants sont regroupés dans une chaîne JSON pour résoudre un problème de compatibilité entre les types Proto3 et BigQuery.

  • google.protobuf.Timestamp

  • google.protobuf.Duration

  • google.protobuf.FieldMask

  • google.protobuf.ListValue

  • google.protobuf.Value

  • google.protobuf.Struct

  • google.api.*

gcloud

gcloud asset export \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \
    --content-type=CONTENT_TYPE \
    --snapshot-time="SNAPSHOT_TIME" \
    --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
    --per-asset-type \
    --output-bigquery-force

Indiquez les valeurs suivantes :

  • SCOPE : utilisez l'une des valeurs suivantes :

    • project=PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • folder=FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : facultatif. ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui dispose des autorisations nécessaires pour gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Liste de types d'éléments pouvant faire l'objet d'une recherche, séparés par une virgule. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque --asset-types n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Le type de contenu RELATIONSHIP ne peut pas être utilisé avec --per-asset-type .

    Lorsque --content-type n'est pas spécifié, seules les informations de base sont renvoyées, telles que les noms des composants, la dernière mise à jour des composants et les projets, dossiers et organisations auxquels ils appartiennent.

  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos éléments, au format gcloud topic datetime. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque --snapshot-time n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : préfixe des tables BigQuery vers lesquelles vous exportez vos métadonnées. Les noms complets des tables sont le préfixe concaténé avec _ et le type d'élément.

L'option --output-bigquery-force écrase la table de destination si elle existe.

Consultez la documentation de référence de gcloud CLI pour connaître toutes les options.

Exemple

Exécutez la commande suivante pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project, vers plusieurs tables BigQuery dont le préfixe est my-table.

gcloud asset export \
    --project=my-project \
    --content-type=resource \
    --snapshot-time="2024-01-30" \
    --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \
    --per-asset-type \
    --output-bigquery-force

REST

Méthode HTTP et URL :

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets

En-têtes :

X-Goog-User-Project: BILLING_PROJECT_ID

Corps JSON de la requête :

{
  "assetTypes": [
    "ASSET_TYPE_1",
    "ASSET_TYPE_2",
    "..."
  ],
  "contentType": "CONTENT_TYPE",
  "readTime": "SNAPSHOT_TIME",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID",
      "table": "TABLE_NAME",
      "force": true,
      "separateTablesPerAssetType": true
    }
  }
}

Indiquez les valeurs suivantes :

  • SCOPE_PATH : utilisez l'une des valeurs suivantes :

    Les valeurs autorisées sont les suivantes :

    • projects/PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • projects/PROJECT_NUMBER, où PROJECT_NUMBER correspond au numéro du projet contenant les métadonnées d'éléments que vous souhaitez exporter.

      Trouver le numéro d'un projet Google Cloud

      ConsoleGoogle Cloud

      Pour trouver le numéro d'un projet Google Cloud , procédez comme suit :

      1. Accédez à la page d'accueil de la console Google Cloud .

        Accéder à la page d'accueil

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste, puis recherchez le nom de votre projet. Le nom, le numéro et l'ID du projet sont affichés près de l'en-tête Bienvenue.

        Jusqu'à 4 000 ressources sont affichées. Si vous ne voyez pas le projet que vous recherchez, accédez à la page Gérer les ressources et filtrez la liste à l'aide du nom de ce projet.

      CLI gcloud

      Vous pouvez récupérer un numéro de projet Google Cloud avec la commande suivante :

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui dispose des autorisations nécessaires pour gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Tableau de types d'éléments pouvant faire l'objet d'une recherche. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque assetTypes n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Le type de contenu RELATIONSHIP ne peut pas être utilisé avec "separateTablesPerAssetType": true .

    Lorsque contentType n'est pas spécifié, seules des informations de base sont renvoyées, telles que les noms des composants, la dernière fois qu'ils ont été mis à jour, ainsi que les projets, dossiers et organisations auxquels ils appartiennent.

  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos composants, au format RFC 3339. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque readTime n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : préfixe des tables BigQuery vers lesquelles vous exportez vos métadonnées. Les noms complets des tables sont le préfixe concaténé avec _ et le type d'élément.

La paire clé-valeur "force": true écrase la table de destination si elle existe.

Exemples de commandes

Exécutez l'une des commandes suivantes pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project, vers plusieurs tables BigQuery dont le préfixe est my-table.

curl (Linux, macOS ou Cloud Shell)

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "contentType": "RESOURCE",
            "readTime": "2024-01-30T00:00:00Z",
            "outputConfig": {
              "bigqueryDestination": {
                "dataset": "projects/my-project/datasets/my-dataset",
                "table": "my-table",
                "force": true,
                "separateTablesPerAssetType": true
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-Goog-User-Project" = "BILLING_PROJECT_ID";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "contentType": "RESOURCE",
  "readTime": "2024-01-30T00:00:00Z",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/my-project/datasets/my-dataset",
      "table": "my-table",
      "force": true,
      "separateTablesPerAssetType": true
    }
  }
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content

Exporter un instantané d'élément vers une table partitionnée par colonne d'unité de temps

Vous pouvez exporter des éléments d'un projet vers des tables partitionnées par colonne d'unité de temps. L'instantané exporté est stocké dans une table BigQuery nommée TABLE_NAME avec une précision quotidienne et deux colonnes d'horodatage supplémentaires, readTime et requestTime, dont l'une est spécifiée comme colonne de partition avec la valeur PARTITION_KEY.

Pour exporter des éléments dans un projet vers des tables partitionnées, envoyez l'une des requêtes suivantes.

gcloud

gcloud asset export \
    --SCOPE \
    --billing-project=BILLING_PROJECT_ID \
    --asset-types=ASSET_TYPE_1,ASSET_TYPE_2,... \
    --content-type=CONTENT_TYPE \
    --relationship-types=RELATIONSHIP_TYPE_1,RELATIONSHIP_TYPE_2,... \
    --snapshot-time="SNAPSHOT_TIME" \
    --bigquery-table=projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID/tables/TABLE_NAME \
    --partition-key=PARTITION_KEY \
    --output-bigquery-force

Indiquez les valeurs suivantes :

  • SCOPE : utilisez l'une des valeurs suivantes :

    • project=PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • folder=FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : facultatif. ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui dispose des autorisations nécessaires pour gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Liste de types d'éléments pouvant faire l'objet d'une recherche, séparés par une virgule. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque --asset-types n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Lorsque --content-type n'est pas spécifié, seules les informations de base sont renvoyées, telles que les noms des composants, la dernière mise à jour des composants et les projets, dossiers et organisations auxquels ils appartiennent.
  • RELATIONSHIP_TYPE_# : facultatif. Nécessite l'accès au niveau Premium ou Enterprise de Security Command Center ou à Gemini Cloud Assist. Liste de types de relations entre les composants que vous souhaitez récupérer, séparés par une virgule. Pour que cela fonctionne, vous devez définir CONTENT_TYPE sur RELATIONSHIP.
  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos éléments, au format gcloud topic datetime. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque --snapshot-time n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : table BigQuery vers laquelle vous exportez vos métadonnées. Si elle n'existe pas, elle est créée.
  • PARTITION_KEY : colonne de clé de partitionnement lors de l'exportation vers des tables partitionnées BigQuery. Les valeurs valides sont read-time et request-time.

L'option --output-bigquery-force écrase les données de la partition correspondante dans la table de destination. Les données des différentes partitions restent intactes.

Si --output-bigquery-force n'est pas spécifié, les données exportées sont ajoutées à la partition correspondante.

L'opération d'exportation échoue si la mise à jour du schéma ou la tentative d'ajout de données échoue. Cela inclut le cas où la table de destination existe déjà et ne possède pas le schéma attendu par l'exportation.

Consultez la documentation de référence de gcloud CLI pour connaître toutes les options.

Exemple

Exécutez la commande suivante pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project vers la table BigQuery my-table.

gcloud asset export \
    --project=projects/my-project \
    --content-type=resource \
    --snapshot-time="2024-01-30" \
    --bigquery-table=projects/my-project/datasets/my-dataset/tables/my-table \
    --partition-key=my-partition-key \
    --output-bigquery-force

REST

Méthode HTTP et URL :

POST https://cloudasset.googleapis.com/v1/SCOPE_PATH:exportAssets

En-têtes :

X-Goog-User-Project: BILLING_PROJECT_ID

Corps JSON de la requête :

{
  "assetTypes": [
    "ASSET_TYPE_1",
    "ASSET_TYPE_2",
    "..."
  ],
  "contentType": "CONTENT_TYPE",
  "relationshipTypes": [
    "RELATIONSHIP_TYPE_1",
    "RELATIONSHIP_TYPE_2",
    "..."
  ],
  "readTime": "SNAPSHOT_TIME",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/BIGQUERY_PROJECT_ID/datasets/DATASET_ID",
      "table": "TABLE_NAME",
      "partitionSpec": {
        "partitionKey": "PARTITION_KEY"
      },
      "force": true,
    }
  }
}

Indiquez les valeurs suivantes :

  • SCOPE_PATH : utilisez l'une des valeurs suivantes :

    Les valeurs autorisées sont les suivantes :

    • projects/PROJECT_ID, où PROJECT_ID correspond à l'ID du projet contenant les métadonnées de composants que vous souhaitez exporter.
    • projects/PROJECT_NUMBER, où PROJECT_NUMBER correspond au numéro du projet contenant les métadonnées d'éléments que vous souhaitez exporter.

      Trouver le numéro d'un projet Google Cloud

      ConsoleGoogle Cloud

      Pour trouver le numéro d'un projet Google Cloud , procédez comme suit :

      1. Accédez à la page d'accueil de la console Google Cloud .

        Accéder à la page d'accueil

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste, puis recherchez le nom de votre projet. Le nom, le numéro et l'ID du projet sont affichés près de l'en-tête Bienvenue.

        Jusqu'à 4 000 ressources sont affichées. Si vous ne voyez pas le projet que vous recherchez, accédez à la page Gérer les ressources et filtrez la liste à l'aide du nom de ce projet.

      CLI gcloud

      Vous pouvez récupérer un numéro de projet Google Cloud avec la commande suivante :

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, où FOLDER_ID correspond à l'ID du dossier contenant les métadonnées de composant que vous souhaitez exporter.

      Trouver l'ID d'un dossier Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'un dossier Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Recherchez le nom de votre dossier. L'ID du dossier s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'un dossier Google Cloud situé au niveau de l'organisation à l'aide de la commande suivante :

      gcloud resource-manager folders list \
          --organization=$(gcloud organizations describe ORGANIZATION_NAME \
            --format="value(name.segment(1))") \
          --filter='"DISPLAY_NAME":"TOP_LEVEL_FOLDER_NAME"' \
          --format="value(ID)"

      TOP_LEVEL_FOLDER_NAME est une correspondance de chaîne partielle ou complète pour le nom du dossier. Supprimez l'option --format pour afficher plus d'informations sur les dossiers trouvés.

      La commande précédente ne renvoie pas les ID des sous-dossiers dans les dossiers. Pour ce faire, exécutez la commande suivante à l'aide de l'ID d'un dossier de premier niveau :

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, où ORGANIZATION_ID correspond à l'ID de l'organisation qui possède les métadonnées d'éléments que vous souhaitez exporter.

      Trouver l'ID d'une organisation Google Cloud

      ConsoleGoogle Cloud

      Pour trouver l'ID d'une organisation Google Cloud , procédez comme suit :

      1. Accédez à la console Google Cloud .

        Accéder à la console Google Cloud

      2. Cliquez sur la zone de liste du sélecteur dans la barre de menu.
      3. Sélectionnez votre organisation dans la zone de liste.
      4. Cliquez sur l'onglet Tous. L'ID de l'organisation s'affiche à côté de son nom.

      CLI gcloud

      Vous pouvez récupérer l'ID d'une organisation Google Cloud à l'aide de la commande suivante :

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID : ID du projet dans lequel se trouve l'agent de service inventaire des éléments cloud par défaut, qui est autorisé à gérer vos ensembles de données et tables BigQuery. En savoir plus sur la définition du projet de facturation

  • ASSET_TYPE_# : facultatif. Tableau de types d'éléments pouvant faire l'objet d'une recherche. Les expressions régulières compatibles avec RE2 sont acceptées. Si l'expression régulière ne correspond à aucun type d'élément compatible, une erreur INVALID_ARGUMENT est renvoyée. Lorsque assetTypes n'est pas spécifié, tous les types d'assets sont renvoyés.
  • CONTENT_TYPE : facultatif. Le type de contenu des métadonnées que vous souhaitez récupérer. Lorsque contentType n'est pas spécifié, seules des informations de base sont renvoyées, telles que les noms des composants, la dernière fois qu'ils ont été mis à jour, ainsi que les projets, dossiers et organisations auxquels ils appartiennent.
  • RELATIONSHIP_TYPE_# : facultatif. Nécessite l'accès au niveau Premium ou Enterprise de Security Command Center ou à Gemini Cloud Assist. Liste de types de relations entre les composants que vous souhaitez récupérer, séparés par une virgule. Pour que cela fonctionne, vous devez définir CONTENT_TYPE sur RELATIONSHIP.
  • SNAPSHOT_TIME : facultatif. Heure à laquelle vous souhaitez prendre un instantané de vos composants, au format RFC 3339. La valeur ne doit pas être antérieure de plus de 35 jours. Lorsque readTime n'est pas spécifié, un instantané est pris à l'heure actuelle.
  • BIGQUERY_PROJECT_ID : ID du projet dans lequel se trouve la table BigQuery que vous souhaitez exporter.
  • DATASET_ID : ID de l'ensemble de données BigQuery.
  • TABLE_NAME : table BigQuery vers laquelle vous exportez vos métadonnées. Si elle n'existe pas, elle est créée.
  • PARTITION_KEY : colonne de clé de partitionnement lors de l'exportation vers des tables partitionnées BigQuery. Les valeurs valides sont READ_TIME et REQUEST_TIME.

La paire clé/valeur "force": true écrase les données de la partition correspondante dans la table de destination. Les données des différentes partitions restent intactes.

Si force n'est pas défini ou est défini sur false, les données exportées sont ajoutées à la partition correspondante.

L'opération d'exportation échoue si la mise à jour du schéma ou la tentative d'ajout de données échoue. Cela inclut le cas où la table de destination existe déjà et ne possède pas le schéma attendu par l'exportation.

Exemples de commandes

Exécutez l'une des commandes suivantes pour exporter vos métadonnées resource telles qu'elles étaient le 30 janvier 2024 dans le projet my-project vers la table BigQuery my-table.

curl (Linux, macOS ou Cloud Shell)

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json; charset=utf-8" \
     -d '{
            "contentType": "RESOURCE",
            "readTime": "2024-01-30T00:00:00Z",
            "outputConfig": {
              "bigqueryDestination": {
                "dataset": "projects/my-project/datasets/my-dataset",
                "table": "my-table",
                "partitionSpec": {
                  "partitionKey": "my-partition-key"
                },
                "force": true,
              }
            }
          }' \
     https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets

PowerShell (Windows)

$cred = gcloud auth print-access-token

$headers = @{ 
  "X-Goog-User-Project" = "BILLING_PROJECT_ID";
  "Authorization" = "Bearer $cred"
}


$body = @"
{
  "contentType": "RESOURCE",
  "readTime": "2024-01-30T00:00:00Z",
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "projects/my-project/datasets/my-dataset",
      "table": "my-table",
      "partitionSpec": {
        "partitionKey": "my-partition-key"
      },
      "force": true,
    }
  }
}
"@

Invoke-WebRequest `
  -Method POST `
  -Headers $headers `
  -ContentType: "application/json; charset=utf-8" `
  -Body $body `
  -Uri "https://cloudasset.googleapis.com/v1/projects/my-project:exportAssets" | Select-Object -Expand Content

Vérifier l'état d'une exportation

L'exportation prend du temps. Pour vérifier si une exportation est terminée, vous pouvez interroger l'opération à l'aide de son ID d'opération.

Sachez que même si votre exportation est terminée, il est possible qu'une autre personne ait envoyé une autre demande d'exportation vers la même destination en tant qu'opération différente. Vous pouvez envoyer de nouvelles demandes d'exportation vers la même destination une fois qu'une demande précédente est terminée ou si plus de 15 minutes se sont écoulées. Les demandes d'exportation effectuées en dehors de ces conditions sont refusées par l'inventaire des éléments cloud.

gcloud

Pour afficher l'état de votre exportation, suivez les instructions ci-dessous :

  1. Obtenez le OPERATION_PATH, qui inclut l'ID d'opération, à partir de la réponse à votre demande d'exportation. L'OPERATION_PATH est indiqué dans la réponse à l'exportation, au format suivant :

    projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
    
  2. Pour vérifier l'état de l'exportation, exécutez la commande suivante avec l'ID d'opération OPERATION_PATH :

    gcloud asset operations describe OPERATION_PATH
    

REST

Pour afficher l'état de votre exportation, suivez les instructions ci-dessous :

  1. Obtenez le OPERATION_PATH, qui inclut l'ID d'opération, à partir de la réponse à votre demande d'exportation. L'OPERATION_PATH est affiché comme valeur du champ name dans la réponse à l'exportation, au format suivant :

    projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
    
  2. Pour vérifier l'état de votre exportation, envoyez la requête suivante.

    REST

    Méthode HTTP et URL :

    GET https://cloudasset.googleapis.com/v1/OPERATION_PATH
    

    Exemples de commandes

    curl (Linux, macOS ou Cloud Shell)

    curl -X GET \
         -H "Authorization: Bearer $(gcloud auth print-access-token)" \
         https://cloudasset.googleapis.com/v1/OPERATION_PATH

    PowerShell (Windows)

    $cred = gcloud auth print-access-token
    
    $headers = @{ 
      "Authorization" = "Bearer $cred"
    }
    
    
    Invoke-WebRequest `
      -Method GET `
      -Headers $headers `
      -Uri "https://cloudasset.googleapis.com/v1/OPERATION_PATH" | Select-Object -Expand Content

Afficher un instantané d'élément dans BigQuery

Console

  1. Accédez à la page BigQuery Studio de la console Google Cloud .

    Accéder à BigQuery Studio

  2. Pour afficher les tables et les vues de l'ensemble de données, ouvrez le panneau de navigation. Dans la section Ressources, sélectionnez votre projet pour le développer, puis sélectionnez un ensemble de données.

  3. Dans la liste, sélectionnez votre table.

  4. Sélectionnez Détails et notez la valeur indiquée pour le champ Nombre de lignes. Vous aurez peut-être besoin de cette valeur pour contrôler le point de départ de vos résultats à l'aide de gcloud CLI ou de l'API REST.

  5. Pour afficher un exemple d'ensemble de données, sélectionnez Aperçu.

REST

Pour parcourir les données d'une table, appelez tabledata.list. Dans le paramètre tableId, spécifiez le nom de la table.

Vous pouvez configurer les paramètres facultatifs suivants pour contrôler la sortie.

  • maxResults est le nombre maximal de résultats à renvoyer.

  • selectedFields est une liste de colonnes à renvoyer, séparées par une virgule. Si ce paramètre n'est pas spécifié, toutes les colonnes sont renvoyées.

  • startIndex est l'index basé sur zéro de la première ligne à lire.

Les valeurs renvoyées sont encapsulées dans un objet JSON que vous devez analyser, comme décrit dans la documentation de référence de tabledata.list.

Interroger un instantané d'élément dans BigQuery

Après avoir exporté votre instantané vers BigQuery, vous pouvez exécuter des requêtes sur vos métadonnées d'éléments.

Par défaut (ou à la demande), BigQuery exécute des tâches de requête interactives, ce qui signifie que la requête est exécutée dès que possible. Les requêtes interactives sont comptabilisées dans votre limite de débit simultané et votre limite quotidienne.

Les résultats de requête sont enregistrés dans une table temporaire ou permanente. Vous pouvez choisir d'ajouter ou d'écraser les données dans une table existante, ou de créer une nouvelle table si aucune table portant le même nom n'existe.

Pour exécuter une requête interactive qui écrit les résultats dans une table temporaire, procédez comme suit :

Console

  1. Accédez à la page BigQuery Studio de la console Google Cloud .

    Accéder à BigQuery Studio

  2. Sélectionnez Saisir une nouvelle requête.

  3. Dans la zone de texte de l'éditeur de requête, saisissez une requête SQL BigQuery valide.

  4. Facultatif : Pour modifier l'emplacement du traitement des données, procédez comme suit.

    1. Sélectionnez Plus, puis Paramètres de requête.

    2. Dans le champ Zone de traitement, sélectionnez Sélection automatique, puis l'emplacement de vos données.

    3. Pour mettre à jour les paramètres de la requête, sélectionnez Enregistrer.

  5. Sélectionnez Exécuter.

REST

  1. Pour démarrer une nouvelle tâche, appelez la méthode jobs.insert. Dans la ressource de tâche, définissez les paramètres suivants.

    • Dans le champ configuration, définissez le champ query sur un objet JobConfigurationQuery qui décrit la tâche de requête BigQuery.

    • Dans le champ jobReference, définissez le champ location de manière appropriée pour votre tâche.

  2. Pour interroger les résultats, appelez getQueryResults jusqu'à ce que jobComplete ait la valeur true. Vous pouvez vérifier la présence d'erreurs et d'avertissements dans la liste errors.

Autres exemples de requêtes SQL

Cette section fournit des exemples de requêtes SQL permettant d'analyser les métadonnées de vos éléments après les avoir exportées vers BigQuery. Pour en savoir plus, consultez la syntaxe des requêtes en SQL standard.

Interroger directement les colonnes disponibles

Pour connaître la quantité de chaque type d'élément, exécutez la requête suivante :

SELECT asset_type, COUNT(*) AS asset_count
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
GROUP BY asset_type
ORDER BY asset_count DESC

Utiliser des champs répétés

Pour trouver les stratégies IAM (Identity and Access Management) qui accordent l'accès aux comptes Gmail, exécutez la requête suivante. BigQuery utilise UNNEST pour aplatir les champs répétés dans une table que vous pouvez interroger directement :

SELECT name, asset_type, bindings.role
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
JOIN UNNEST(iam_policy.bindings) AS bindings
JOIN UNNEST(bindings.members) AS principals
WHERE principals like "%@gmail.com"

Pour rechercher une organisation, un dossier ou un projet qui autorise la création à l'aide d'une adresse IP publique, exécutez la requête suivante. Cette requête est utile, car autoriser des adresses IP publiques avec des instances Cloud SQL peut créer des failles, sauf si SSL ou un proxy est configuré :

SELECT name
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
JOIN UNNEST(org_policy) AS op
WHERE
  op.constraint = "constraints/sql.restrictPublicIp"
  AND (op.boolean_policy IS NULL OR op.boolean_policy.enforced = FALSE);

Pour rechercher une organisation, un dossier ou un projet dans le même périmètre de service VPC Service Controls d'un projet, exécutez la requête suivante :

SELECT service_perimeter.title, service_perimeter.status.resources
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME`
CROSS JOIN UNNEST(service_perimeter.status.resources) as resource
WHERE resource = "projects/PROJECT_ID";

Utiliser des chaînes JSON

Pour trouver les règles de pare-feu ouvertes, exécutez la requête suivante. Obtenez davantage d'informations sur les fonctions JSON utilisées dans BigQuery.

CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(json).map(x=>JSON.stringify(x));
""";

SELECT firewall.name, firewall.resource.parent, JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') AS sourceRanges
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS firewall
JOIN UNNEST(json2array(JSON_EXTRACT(firewall.resource.data, '$.sourceRanges'))) AS source_ranges
WHERE asset_type="compute.googleapis.com/Firewall" AND JSON_EXTRACT(firewall.resource.data, '$.sourceRanges') IS NOT NULL AND JSON_EXTRACT_SCALAR(source_ranges, '$') = "0.0.0.0/0"

En séparant les tables pour chaque type de ressource, vous pouvez trouver les règles de pare-feu ouvertes à l'aide d'une requête plus simple et plus rapide.

SELECT firewall.name, firewall.resource.parent, sourceRanges
FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` AS firewall
JOIN UNNEST(firewall.resource.data.sourceRanges) AS sourceRanges
WHERE sourceRanges = "0.0.0.0/0";

Joindre des tables de différents types de ressources

Pour joindre des tables de différents types de ressources, exécutez la requête suivante. L'exemple suivant montre comment rechercher tous les sous-réseaux qui ne sont associés à aucune VM. La requête trouve tout d'abord tous les sous-réseaux. Ensuite, elle sélectionne dans cette liste les sous-réseaux pour lesquels les valeurs selfLink ne sont pas présentes.

CREATE TEMP FUNCTION json2array(json STRING)
RETURNS ARRAY<STRING>
LANGUAGE js AS """
  return JSON.parse(json).map(x=>JSON.stringify(x));
""";

SELECT name, JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') AS selflink
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` AS subnetwork
WHERE asset_type = "compute.googleapis.com/Subnetwork" AND (JSON_EXTRACT(subnetwork.resource.data, '$.selfLink') NOT IN
(SELECT DISTINCT JSON_EXTRACT(network_interfaces, '$.subnetwork')
FROM `PROJECT_ID.DATASET_ID.TABLE_NAME` as instance
JOIN UNNEST(json2array(JSON_EXTRACT(instance.resource.data, '$.networkInterfaces'))) AS network_interfaces
WHERE asset_type ="compute.googleapis.com/Instance"
AND JSON_EXTRACT(instance.resource.data, '$.networkInterfaces') IS NOT NULL
)) IS NULL

En séparant les tables pour chaque type de ressource, vous pouvez trouver tous les sous-réseaux qui ne sont associés à aucune VM à l'aide d'une requête plus simple et plus rapide.

SELECT name, subnetwork.resource.data.selfLink
FROM `PROJECT_ID.DATASET_ID.STRUCTURED_SUBNETWORK_TABLE_NAME` AS subnetwork
WHERE
  (
    subnetwork.resource.data.selfLink
      NOT IN (
        SELECT DISTINCT networkInterface.subnetwork
        FROM `PROJECT_ID.DATASET_ID.STRUCTURED_INSTANCE_TABLE_NAME` as instance
        JOIN
          UNNEST(instance.resource.data.networkInterfaces) AS networkInterface
        WHERE
          networkInterface IS NOT NULL
      )
  ) IS NULL;

Identifier les clusters Dataproc vulnérables en raison de CVE-2021-44228

CREATE TEMP FUNCTION vulnerable_version(imageVersion STRING)
RETURNS BOOL
LANGUAGE js AS r"""
    const version_regexp = /(?<major>\d+)(?:\.)(?<minor>\d+)(?:\.)?(?<sub>\d+)?/g;
    let match = version_regexp.exec(imageVersion);
    if(match.groups.major < 1){
        return true;
    }
    if (match.groups.major == 1){
        if (match.groups.minor < 3){
            return true;
        }
        if(match.groups.minor == 3 &amp;&amp; match.groups.sub < 95){
            return true;
        }
        if(match.groups.minor == 4 &amp;&amp; match.groups.sub < 77){
            return true;
        }
        if(match.groups.minor == 5 &amp;&amp; match.groups.sub < 53){
            return true;
        }
    }
    if (match.groups.major == 2 &amp;&amp; match.groups.minor == 0 &amp;&amp; match.groups.sub < 27){
        return true;
    }
    return false;
""";

SELECT
  c.name,
  c.resource.data.projectId AS project_id,
  c.resource.data.clusterName AS cluster_name,
  c.resource.data.config.softwareConfig.imageVersion AS image_version,
  c.resource.data.status.state AS cluster_state,
  vulnerable_version(c.resource.data.config.softwareConfig.imageVersion) AS is_vulnerable
FROM
  `PROJECT_ID.DATASET_ID.TABLE_NAME_PREFIX_dataproc_googleapis_com_Cluster` c
  INNER JOIN `PROJECT_ID.DATASET_ID.TABLE_NAME_PREFIX_cloudresourcemanager_googleapis_com_Project` p
    ON p.resource.data.projectId = c.resource.data.projectId
WHERE
  c.resource.data.config.softwareConfig.imageVersion IS NOT NULL
  AND c.resource.data.status.state = "RUNNING"
  AND p.resource.data.lifecycleState = "ACTIVE";