Exporte metadados de recursos para o BigQuery

Este documento mostra como exportar uma captura instantânea de um recurso da sua organização, pasta ou projeto para uma tabela do BigQuery e, em seguida, executar a análise de dados no seu inventário. O BigQuery oferece uma experiência semelhante a SQL para os utilizadores analisarem dados e gerarem estatísticas significativas sem usar scripts personalizados.

Antes de começar

  1. Ative a API Cloud Asset Inventory no projeto a partir do qual está a executar comandos do Cloud Asset Inventory.

    Ative a API Cloud Asset Inventory

  2. Certifique-se de que a sua conta tem a função correta para chamar a API Cloud Asset Inventory. Para ver as autorizações individuais de cada tipo de chamada, consulte a secção Autorizações.

  3. Crie um conjunto de dados do BigQuery para exportar, se ainda não tiver um.

Limitações

  • Quando exporta dados de tabelas do BigQuery, nem todos os campos são suportados pelo Cloud Asset Inventory.

  • Os campos de recursos que mudam com frequência, como numBytes, numLongTermBytes, numPhysicalBytes e numRows, podem ser exportados com um valor null.

  • A exportação para tabelas agrupadas do BigQuery não é suportada.

  • As tabelas do BigQuery encriptadas com chaves personalizadas do Cloud Key Management Service (Cloud KMS) não são suportadas.

  • Não é possível anexar o resultado da exportação a uma tabela existente, a menos que exporte para uma tabela particionada. A tabela de destino tem de estar vazia ou tem de a substituir. Para o substituir, use a flag --output-bigquery-force com a CLI gcloud ou use "force": true com a API REST.

  • Os tipos de recursos do Google Kubernetes Engine (GKE), exceto container.googleapis.com/Cluster e container.googleapis.com/NodePool, não são suportados quando exportados para tabelas separadas para cada tipo de recurso.

  • O Cloud Asset Inventory rejeita pedidos de exportação se um pedido anterior para o mesmo destino tiver sido iniciado há menos de 15 minutos e ainda estiver em execução. No entanto, se uma exportação demorar mais de 15 minutos a ser concluída, é marcada como concluída e são permitidos novos pedidos de exportação para o mesmo destino.

  • O tipo de conteúdo ACCESS_POLICY só pode ser exportado ao nível da organização.

  • Se a tabela para a qual está a exportar já existir e estiver em processo de exportação, é devolvido um erro 400.

Caixa

Os nomes dos campos usam convenções de capitalização diferentes consoante o tipo de conteúdo pedido e as definições de exportação:

  • Para o tipo de conteúdo RESOURCE quando exporta recursos para tabelas por tipo de recurso, não existem espaços entre as palavras, e a primeira letra de cada nova palavra depois da primeira é escrita em maiúsculas. Por exemplo,assetType.

  • Para todos os outros tipos de conteúdo, o nome do campo está em minúsculas, com os espaços substituídos por sublinhados. Por exemplo, asset_type.

Esquemas do BigQuery usados para exportação

Todas as tabelas do BigQuery são definidas por um esquema que descreve os nomes das colunas, os tipos de dados e outras informações. A definição do tipo de conteúdo para uma exportação determina o esquema da sua tabela:

  • Recurso ou não especificado: quando define o tipo de conteúdo como RESOURCE ou não o especifica e define a flag per-asset-type como false ou não a usa, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema de recursos

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

    A coluna resource.data é os metadados de recursos representados como uma string JSON.

    Quando define o tipo de conteúdo como RESOURCE ou não define o tipo de conteúdo e define a flag per-asset-type como true, cria tabelas separadas para cada tipo de recurso. O esquema de cada tabela inclui colunas do tipo RECORD mapeadas para os campos aninhados no campo Resource.data desse tipo de recurso (até aos 15 níveis aninhados suportados pelo BigQuery). Para ver tabelas de exemplo, consulte export-assets-examples na Google Cloud consola.

  • Política de IAM: quando define o tipo de conteúdo como IAM_POLICY na API REST ou iam-policy na CLI gcloud, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema da política 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"
      }
    ]
  • Política de organização: quando define o tipo de conteúdo como ORG_POLICY na API REST ou org-policy na CLI gcloud, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema de políticas da organização

    [
      {
        "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"
      }
    ]
  • Política de VPCSC: quando define o tipo de conteúdo como ACCESS_POLICY na API REST ou access-policy na CLI gcloud, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema da política do 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"
      }
    ]
  • Inventário de instâncias do OSConfig: quando define o tipo de conteúdo como OS_INVENTORY na API REST ou os-inventory na CLI gcloud, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema de inventário do SO

    [
      {
        "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"
      }
    ]
  • Relação: quando define o tipo de conteúdo como RELATIONSHIP na API REST ou relationship na CLI gcloud, cria uma tabela do BigQuery com o seguinte esquema.

    Esquema de relação

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

Exporte um resumo de recursos

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

Indique os seguintes valores:

  • SCOPE: use um dos seguintes valores:

    • project=PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • folder=FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: opcional. O ID do projeto no qual o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma lista separada por vírgulas de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando --asset-types não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Quando --content-type não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Requer acesso ao nível Premium ou Enterprise do Security Command Center, ou ao Gemini Cloud Assist. Uma lista separada por vírgulas dos tipos de relações de recursos que quer obter. Tem de definir CONTENT_TYPE como RELATIONSHIP para que isto funcione.
  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato de data/hora do tópico gcloud. O valor não pode ser superior a 35 dias no passado. Quando --snapshot-time não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: A tabela do BigQuery para a qual está a exportar os metadados. Se não existir, é criado.

A flag --output-bigquery-force substitui a tabela de destino, se existir.

Consulte a referência da CLI gcloud para ver todas as opções.

Exemplo

Execute o seguinte comando para exportar os seus metadados do resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para a tabela do 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

Exemplo de resposta

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étodo HTTP e URL:

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

Cabeçalhos:

X-Goog-User-Project: BILLING_PROJECT_ID

Corpo JSON do pedido:

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

Indique os seguintes valores:

  • SCOPE_PATH: use um dos seguintes valores:

    Os valores permitidos são:

    • projects/PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • projects/PROJECT_NUMBER, onde PROJECT_NUMBER é o número do projeto que tem os metadados dos recursos que quer exportar.

      Como encontrar um Google Cloud número do projeto

      Google Cloud consola

      Para encontrar um Google Cloud número do projeto, conclua os seguintes passos:

      1. Aceda à página Boas-vindas na Google Cloud consola.

        Aceder a Boas-vindas

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista e, em seguida, pesquise o nome do projeto. O nome do projeto, o número do projeto e o ID do projeto são apresentados junto ao título Bem-vindo.

        São apresentados até 4000 recursos. Se não vir o projeto que procura, aceda à página Gerir recursos e filtre a lista através do nome desse projeto.

      CLI gcloud

      Pode obter um Google Cloud número do projeto com o seguinte comando:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: O ID do projeto em que o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma matriz de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando assetTypes não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Quando contentType não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Requer acesso ao nível Premium ou Enterprise do Security Command Center, ou ao Gemini Cloud Assist. Uma lista separada por vírgulas dos tipos de relações de recursos que quer obter. Tem de definir CONTENT_TYPE como RELATIONSHIP para que isto funcione.
  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato RFC 3339. O valor não pode ser superior a 35 dias no passado. Quando readTime não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: A tabela do BigQuery para a qual está a exportar os metadados. Se não existir, é criado.

O par de chave-valor "force": true substitui a tabela de destino, se existir.

Consulte a referência REST para ver todas as opções.

Exemplos de comandos

Execute um dos seguintes comandos para exportar os seus metadados resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para a tabela do 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

Exemplo de resposta

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

Ir

Para saber como instalar e usar a biblioteca de cliente do Cloud Asset Inventory, consulte o artigo Bibliotecas de cliente do Cloud Asset Inventory.

Para se autenticar no Cloud Asset Inventory, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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

Para saber como instalar e usar a biblioteca de cliente do Cloud Asset Inventory, consulte o artigo Bibliotecas de cliente do Cloud Asset Inventory.

Para se autenticar no Cloud Asset Inventory, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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

Para saber como instalar e usar a biblioteca de cliente do Cloud Asset Inventory, consulte o artigo Bibliotecas de cliente do Cloud Asset Inventory.

Para se autenticar no Cloud Asset Inventory, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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

Para saber como instalar e usar a biblioteca de cliente do Cloud Asset Inventory, consulte o artigo Bibliotecas de cliente do Cloud Asset Inventory.

Para se autenticar no Cloud Asset Inventory, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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())

Exporte uma imagem instantânea de recursos para tabelas separadas para cada tipo de recurso

Pode exportar recursos para tabelas do BigQuery separadas para cada tipo de recurso com a flag --per-asset-type na CLI gcloud e "separateTablesPerAssetType": true em pedidos da API REST. Não é possível exportar o tipo de conteúdo RELATIONSHIP desta forma.

Neste modo, o nome de cada tabela é TABLE_NAME concatenado com _ (sublinhado) e o nome do tipo de recurso. Os carateres não alfanuméricos são substituídos por _.

Se a exportação para qualquer tabela falhar, toda a operação de exportação falha e devolve o primeiro erro. Os resultados das exportações bem-sucedidas anteriores persistem.

Os seguintes tipos estão incluídos numa string JSON para resolver um problema de compatibilidade entre o Proto3 e os tipos do 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

Indique os seguintes valores:

  • SCOPE: use um dos seguintes valores:

    • project=PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • folder=FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: opcional. O ID do projeto no qual o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma lista separada por vírgulas de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando --asset-types não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Não é possível usar o tipo de conteúdo RELATIONSHIP com --per-asset-type .

    Quando --content-type não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.

  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato de data/hora do tópico gcloud. O valor não pode ser superior a 35 dias no passado. Quando --snapshot-time não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: O prefixo das tabelas do BigQuery para as quais está a exportar os metadados. Os nomes completos das tabelas são o prefixo concatenado com _ e o tipo de recurso.

A flag --output-bigquery-force substitui a tabela de destino, se existir.

Consulte a referência da CLI gcloud para ver todas as opções.

Exemplo

Execute o seguinte comando para exportar os metadados do resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para várias tabelas do BigQuery que tenham my-table como prefixo.

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étodo HTTP e URL:

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

Cabeçalhos:

X-Goog-User-Project: BILLING_PROJECT_ID

Corpo JSON do pedido:

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

Indique os seguintes valores:

  • SCOPE_PATH: use um dos seguintes valores:

    Os valores permitidos são:

    • projects/PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • projects/PROJECT_NUMBER, onde PROJECT_NUMBER é o número do projeto que tem os metadados dos recursos que quer exportar.

      Como encontrar um Google Cloud número do projeto

      Google Cloud consola

      Para encontrar um Google Cloud número do projeto, conclua os seguintes passos:

      1. Aceda à página Boas-vindas na Google Cloud consola.

        Aceder a Boas-vindas

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista e, em seguida, pesquise o nome do projeto. O nome do projeto, o número do projeto e o ID do projeto são apresentados junto ao título Bem-vindo.

        São apresentados até 4000 recursos. Se não vir o projeto que procura, aceda à página Gerir recursos e filtre a lista através do nome desse projeto.

      CLI gcloud

      Pode obter um Google Cloud número do projeto com o seguinte comando:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: O ID do projeto em que o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma matriz de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando assetTypes não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Não é possível usar o tipo de conteúdo RELATIONSHIP com "separateTablesPerAssetType": true .

    Quando contentType não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.

  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato RFC 3339. O valor não pode ser superior a 35 dias no passado. Quando readTime não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: O prefixo das tabelas do BigQuery para as quais está a exportar os metadados. Os nomes completos das tabelas são o prefixo concatenado com _ e o tipo de recurso.

O par de chave-valor "force": true substitui a tabela de destino, se existir.

Exemplos de comandos

Execute um dos seguintes comandos para exportar os metadados de resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para várias tabelas do BigQuery que têm my-table como prefixo.

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

Exporte um resumo de recursos para uma tabela particionada por colunas de unidades de tempo

Pode exportar recursos num projeto para tabelas particionadas por colunas de unidades de tempo. A imagem instantânea exportada é armazenada numa tabela do BigQuery denominada TABLE_NAME com granularidade diária e duas colunas de data/hora adicionais, readTime e requestTime, uma das quais especifica como a coluna de partição com o valor PARTITION_KEY.

Para exportar recursos num projeto para tabelas particionadas, faça um dos seguintes pedidos.

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

Indique os seguintes valores:

  • SCOPE: use um dos seguintes valores:

    • project=PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • folder=FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organization=ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: opcional. O ID do projeto no qual o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma lista separada por vírgulas de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando --asset-types não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Quando --content-type não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Requer acesso ao nível Premium ou Enterprise do Security Command Center, ou ao Gemini Cloud Assist. Uma lista separada por vírgulas dos tipos de relações de recursos que quer obter. Tem de definir CONTENT_TYPE como RELATIONSHIP para que isto funcione.
  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato de data/hora do tópico gcloud. O valor não pode ser superior a 35 dias no passado. Quando --snapshot-time não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: A tabela do BigQuery para a qual está a exportar os metadados. Se não existir, é criado.
  • PARTITION_KEY: a coluna da chave de partição quando exporta para tabelas particionadas do BigQuery. Os valores válidos sãoread-time e request-time.

A flag --output-bigquery-force substitui os dados na partição correspondente na tabela de destino. Os dados em partições diferentes permanecem intactos.

Se --output-bigquery-force não for especificado, os dados exportados são anexados à partição correspondente.

A operação de exportação falha se uma atualização do esquema ou uma tentativa de anexar dados falhar. Isto inclui se a tabela de destino já existir e não tiver o esquema que a exportação espera.

Consulte a referência da CLI gcloud para ver todas as opções.

Exemplo

Execute o seguinte comando para exportar os seus metadados do resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para a tabela do 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étodo HTTP e URL:

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

Cabeçalhos:

X-Goog-User-Project: BILLING_PROJECT_ID

Corpo JSON do pedido:

{
  "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,
    }
  }
}

Indique os seguintes valores:

  • SCOPE_PATH: use um dos seguintes valores:

    Os valores permitidos são:

    • projects/PROJECT_ID, onde PROJECT_ID é o ID do projeto que tem os metadados dos recursos que quer exportar.
    • projects/PROJECT_NUMBER, onde PROJECT_NUMBER é o número do projeto que tem os metadados dos recursos que quer exportar.

      Como encontrar um Google Cloud número do projeto

      Google Cloud consola

      Para encontrar um Google Cloud número do projeto, conclua os seguintes passos:

      1. Aceda à página Boas-vindas na Google Cloud consola.

        Aceder a Boas-vindas

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista e, em seguida, pesquise o nome do projeto. O nome do projeto, o número do projeto e o ID do projeto são apresentados junto ao título Bem-vindo.

        São apresentados até 4000 recursos. Se não vir o projeto que procura, aceda à página Gerir recursos e filtre a lista através do nome desse projeto.

      CLI gcloud

      Pode obter um Google Cloud número do projeto com o seguinte comando:

      gcloud projects describe PROJECT_ID --format="value(projectNumber)"
    • folders/FOLDER_ID, onde FOLDER_ID é o ID da pasta que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud pasta

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud pasta, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Pesquise o nome da pasta. O ID da pasta é apresentado junto ao nome da pasta.

      CLI gcloud

      Pode obter o ID de uma Google Cloud pasta localizada ao nível da organização com o seguinte comando:

      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)"

      Onde TOP_LEVEL_FOLDER_NAME é uma correspondência de string parcial ou completa para o nome da pasta. Remova a flag --format para ver mais informações sobre as pastas encontradas.

      O comando anterior não devolve os IDs das subpastas dentro das pastas. Para tal, execute o seguinte comando com o ID de uma pasta de nível superior:

      gcloud resource-manager folders list --folder=FOLDER_ID
    • organizations/ORGANIZATION_ID, onde ORGANIZATION_ID é o ID da organização que tem os metadados dos recursos que quer exportar.

      Como encontrar o ID de uma Google Cloud organização

      Google Cloud consola

      Para encontrar o ID de uma Google Cloud organização, conclua os seguintes passos:

      1. Aceda à Google Cloud consola.

        Aceda à Google Cloud consola

      2. Clique na caixa de lista do comutador na barra de menu.
      3. Selecione a sua organização na caixa de lista.
      4. Clique no separador Tudo. O ID da organização é apresentado junto ao nome da organização.

      CLI gcloud

      Pode obter o ID de uma Google Cloud organização com o seguinte comando:

      gcloud organizations describe ORGANIZATION_NAME --format="value(name.segment(1))"
  • BILLING_PROJECT_ID: O ID do projeto em que o agente de serviço do Cloud Asset Inventory predefinido tem autorizações para gerir os seus conjuntos de dados e tabelas do BigQuery. Leia mais sobre como definir o projeto de faturação.

  • ASSET_TYPE_#: opcional. Uma matriz de tipos de recursos pesquisáveis. As expressões regulares compatíveis com RE2 são suportadas. Se a expressão regular não corresponder a nenhum tipo de recurso suportado, é devolvido um erro INVALID_ARGUMENT. Quando assetTypes não é especificado, são devolvidos todos os tipos de recursos.
  • CONTENT_TYPE: opcional. O tipo de conteúdo dos metadados que quer obter. Quando contentType não é especificado, apenas são devolvidas informações básicas, como os nomes dos recursos, a última vez que os recursos foram atualizados e a que projetos, pastas e organizações pertencem.
  • RELATIONSHIP_TYPE_#: opcional. Requer acesso ao nível Premium ou Enterprise do Security Command Center, ou ao Gemini Cloud Assist. Uma lista separada por vírgulas dos tipos de relações de recursos que quer obter. Tem de definir CONTENT_TYPE como RELATIONSHIP para que isto funcione.
  • SNAPSHOT_TIME: opcional. A hora em que quer tirar uma captura instantânea dos seus recursos, no formato RFC 3339. O valor não pode ser superior a 35 dias no passado. Quando readTime não é especificado, é tirado um instantâneo na hora atual.
  • BIGQUERY_PROJECT_ID: O ID do projeto em que se encontra a tabela do BigQuery para a qual quer exportar.
  • DATASET_ID: O ID do conjunto de dados do BigQuery.
  • TABLE_NAME: A tabela do BigQuery para a qual está a exportar os metadados. Se não existir, é criado.
  • PARTITION_KEY: a coluna da chave de partição quando exporta para tabelas particionadas do BigQuery. Os valores válidos sãoREAD_TIME e REQUEST_TIME.

O par de chave-valor "force": true substitui os dados na partição correspondente na tabela de destino. Os dados em partições diferentes permanecem intactos.

Se force não estiver definido ou estiver definido como false, os dados exportados são anexados à partição correspondente.

A operação de exportação falha se uma atualização do esquema ou uma tentativa de anexar dados falhar. Isto inclui se a tabela de destino já existir e não tiver o esquema que a exportação espera.

Exemplos de comandos

Execute um dos seguintes comandos para exportar os seus metadados resource tal como estavam a 30 de janeiro de 2024 no projeto my-project para a tabela do 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

Verifique o estado de uma exportação

As exportações demoram algum tempo a concluir. Para verificar se uma exportação está concluída, pode consultar a operação através do respetivo ID da operação.

Tenha em atenção que, mesmo que a exportação esteja concluída, alguém pode ter feito outro pedido de exportação para o mesmo destino como uma operação diferente. Podem ser feitos novos pedidos de exportação para o mesmo destino após a conclusão de um pedido anterior ou se tiverem decorrido mais de 15 minutos. Os pedidos de exportação feitos fora destas condições são rejeitados pelo Cloud Asset Inventory.

gcloud

Para ver o estado da exportação, siga estas instruções:

  1. Obtenha o OPERATION_PATH, que inclui o ID da operação, na resposta ao seu pedido de exportação. O elemento OPERATION_PATH é apresentado na resposta à exportação, que está formatada da seguinte forma:

    projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
    
  2. Para verificar o estado da exportação, execute o seguinte comando com o parâmetro OPERATION_PATH:

    gcloud asset operations describe OPERATION_PATH
    

REST

Para ver o estado da exportação, siga estas instruções:

  1. Obtenha o OPERATION_PATH, que inclui o ID da operação, na resposta ao seu pedido de exportação. O elemento OPERATION_PATH é apresentado como o valor do campo name na resposta à exportação, que está formatada da seguinte forma:

    projects/PROJECT_NUMBER/operations/ExportAssets/CONTENT_TYPE/OPERATION_ID
    
  2. Para verificar o estado da exportação, faça o seguinte pedido.

    REST

    Método HTTP e URL:

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

    Exemplos de comandos

    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

Veja uma imagem instantânea de um recurso no BigQuery

Consola

  1. Aceda à página BigQuery Studio na Google Cloud consola.

    Aceda ao BigQuery Studio

  2. Para apresentar as tabelas e as vistas no conjunto de dados, abra o painel de navegação. Na secção Recursos, selecione o seu projeto para o expandir e, em seguida, selecione um conjunto de dados.

  3. Na lista, selecione a tabela.

  4. Selecione Detalhes e tome nota do valor em Número de linhas. Pode precisar deste valor para controlar o ponto de partida dos seus resultados através da CLI gcloud ou da API REST.

  5. Para ver um conjunto de dados de amostra, selecione Pré-visualizar.

REST

Para procurar os dados da tabela, ligue para tabledata.list. No parâmetro tableId, especifique o nome da tabela.

Pode configurar os seguintes parâmetros opcionais para controlar o resultado.

  • maxResults é o número máximo de resultados a devolver.

  • selectedFields é uma lista de colunas separadas por vírgulas a devolver; se não for especificado, são devolvidas todas as colunas.

  • startIndex é o índice baseado em zero da linha inicial a ler.

Os valores são devolvidos envolvidos num objeto JSON que tem de analisar, conforme descrito na documentação de referência tabledata.list.

Consultar uma imagem instantânea de um recurso no BigQuery

Depois de exportar a sua imagem instantânea para o BigQuery, pode executar consultas nos metadados dos seus recursos.

Por predefinição, o BigQuery executa tarefas de consulta interativas ou a pedido, o que significa que a consulta é executada assim que possível. As consultas interativas contam para o seu limite de taxa concorrente e limite diário.

Os resultados da consulta são guardados numa tabela temporária ou permanente. Pode optar por anexar ou substituir dados numa tabela existente ou criar uma nova tabela, se não existir nenhuma com o mesmo nome.

Para executar uma consulta interativa que escreve o resultado numa tabela temporária, conclua os seguintes passos.

Consola

  1. Aceda à página BigQuery Studio na Google Cloud consola.

    Aceda ao BigQuery Studio

  2. Selecione Compor nova consulta.

  3. Na área de texto do editor de consultas, introduza uma consulta SQL do BigQuery válida.

  4. Opcional: para alterar a localização de tratamento de dados, conclua os passos seguintes.

    1. Selecione Mais e, de seguida, Definições de consulta.

    2. Em Localização de processamento, selecione Selecionar automaticamente e, de seguida, escolha a localização dos seus dados.

    3. Para atualizar as definições da consulta, selecione Guardar.

  5. Selecione Executar.

REST

  1. Para iniciar uma nova tarefa, chame o método jobs.insert. No recurso job, defina os seguintes parâmetros.

    • No campo configuration, defina o campo query como um JobConfigurationQuery que descreve a tarefa de consulta do BigQuery.

    • No campo jobReference, defina o campo location adequadamente para o seu trabalho.

  2. Para sondar os resultados, chame getQueryResults. A sondagem até jobComplete é igual a true. Pode verificar se existem erros e avisos na lista errors.

Exemplos adicionais de consultas SQL

Esta secção fornece exemplos de consultas SQL para analisar os metadados dos seus recursos depois de os exportar para o BigQuery. Consulte a sintaxe de consulta SQL padrão para mais informações.

Consultar colunas disponíveis diretamente

Para encontrar a quantidade de cada tipo de recurso, execute a seguinte consulta:

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

Trabalhe com campos repetidos

Para encontrar políticas de gestão de identidade e de acesso (IAM) que concedam acesso a contas do Gmail, execute a seguinte consulta. O BigQuery usa UNNEST para reduzir campos repetidos numa tabela que pode consultar diretamente:

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"

Para encontrar uma organização, uma pasta ou um projeto que permita a criação através de um endereço IP público, execute a seguinte consulta. Esta consulta é útil porque permitir endereços IP públicos com instâncias do Cloud SQL pode introduzir vulnerabilidades, a menos que o SSL ou um proxy esteja configurado:

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);

Para encontrar uma organização, uma pasta ou um projeto no mesmo perímetro de serviço do VPC Service Controls de um projeto, execute a seguinte consulta:

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";

Trabalhe com strings JSON

Para encontrar regras de firewall abertas, execute a seguinte consulta. Saiba mais sobre as funções JSON usadas no 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"

Ao separar as tabelas para cada tipo de recurso, pode encontrar regras de firewall abertas com uma consulta mais fácil e rápida.

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";

Junte tabelas de diferentes tipos de recursos

Para juntar tabelas de diferentes tipos de recursos, execute a seguinte consulta. O exemplo seguinte mostra como encontrar todas as sub-redes que não têm nenhuma VM anexada. Primeiro, a consulta encontra todas as subredes. Em seguida, nessa lista, seleciona as sub-redes cujos valores de selfLink não estão presentes.

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

Ao separar tabelas para cada tipo de recurso, pode encontrar todas as sub-redes que não têm nenhuma VM associada com uma consulta mais fácil e rápida.

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;

Encontre clusters do Dataproc vulneráveis devido ao 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";