Perguntas frequentes e solução de problemas

O Inventário de recursos do Cloud é um serviço global?

Sim. A API Cloud Asset não depende do local. Ele tem um endpoint global, que exibe os metadados de todos os recursos regionais e globais compatíveis no Inventário de recursos do Cloud. A API Cloud Asset pode ser acessada em qualquer zona.

Que tipo de consistência de dados o Inventário de recursos do Cloud oferece?

O Inventário de recursos do Cloud oferece consistência posterior nos dados atuais e consistência nos dados históricos. Apesar da baixa chance na prática, é possível que o Inventário de recursos do Cloud perca algumas atualizações de um recurso no passado.

Por que não tenho permissão para usar a API Cloud Asset?

Um erro será retornado se você não tiver permissão para exportar recursos ou receber o histórico de uma organização, projeto ou pasta.

Por exemplo, se você não tiver permissão, executar o seguinte comando:

curl -X POST \
     -H "X-Goog-User-Project: BILLING_PROJECT_ID" \
     -H "Authorization: Bearer $(gcloud auth print-access-token)" \
     -H "Content-Type: application/json" \
     -d '{
          "outputConfig": {
            "gcsDestination": {
              "uri": "gs://BUCKET_NAME/FILENAME"
            }
          }
         }' \
         https://cloudasset.googleapis.com/v1/projects/PROJECT_ID:exportAssets

Retorna o seguinte erro:

{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "[ORIGINAL ERROR] generic::permission_denied: Request
        denied by Cloud IAM."
      }
    ]
  }
}

Para resolver esse problema, solicite acesso ao administrador do seu projeto pasta ou organização. Dependendo dos recursos que você está tentando exportar ou receber o histórico, é necessário ter um dos papéis a seguir ou outros que incluam as permissões necessárias da API Cloud Asset:

  • cloudasset.viewer

  • cloudasset.owner

Para mais informações sobre papéis e permissões, veja Noções básicas sobre papéis.

Para mais informações sobre as opções de controle de acesso para APIs do Cloud Asset, consulte Controle de acesso.

Por que minhas exportações estão retornando um erro de permissão negada?

A menos que você especifique o contrário, o Inventário de recursos do Cloud usa a conta de serviço padrão do Inventário de recursos do Cloud no projeto ativo para gerenciar recursos como tópicos do Pub/Sub, buckets do Cloud Storage e tabelas do BigQuery. Ela é criada na primeira vez que você chama a API Cloud Asset Inventory de um projeto e, por padrão, tem permissão para gerenciar esses recursos, desde que eles estejam localizados no mesmo projeto.

Você pode receber erros de permissão negada nas seguintes situações:

  • Ao usar a API REST, que não define um projeto ativo e, portanto, o Inventário de recursos do Cloud não sabe qual conta de serviço usar.

  • Ao usar a CLI gcloud de um projeto diferente daquele em que o tópico do Pub/Sub, o bucket do Cloud Storage ou a tabela do BigQuery estão localizados. Isso significa que a conta de serviço padrão do Inventário de recursos do Cloud do projeto ativo é usada para executar a tarefa (se existir) e pode não ter permissões para gravar nos recursos do outro projeto.

Para garantir que a conta de serviço correta seja usada ao fazer solicitações de exportação para tópicos do Pub/Sub, buckets do Cloud Storage ou tabelas do BigQuery, especifique o ID do projeto que contém a conta de serviço padrão do Inventário de recursos do Cloud. Se você estiver exportando de um projeto para outro, também precisará conceder papéis específicos à conta de serviço.

gcloud

Para a CLI gcloud, adicione a sinalização --billing-project ao seu comando para especificar o ID do projeto que contém a conta de serviço correta:

--billing-project=BILLING_PROJECT_ID

Como alternativa, é possível definir o projeto de faturamento antes de executar comandos com a CLI gcloud. Primeiro, verifique se o projeto de faturamento é diferente do projeto principal:

gcloud config list

Se necessário, defina o projeto de faturamento:

gcloud config set billing/quota_project BILLING_PROJECT_ID

Forneça os valores a seguir:

  • BILLING_PROJECT_ID: um ID do projeto com a API Cloud Asset Inventory está ativada e uma conta de serviço com permissões para gerenciar o tópico do Pub/Sub de destino, o bucket do Cloud Storage ou a tabela do BigQuery.

REST

Na API REST, adicione o cabeçalho X-Goog-User-Project para especificar o ID do projeto que contém a conta de serviço correta. Ao usar curl, você define o cabeçalho com a sinalização -H:

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

Forneça os valores a seguir:

  • BILLING_PROJECT_ID: um ID do projeto com a API Cloud Asset Inventory está ativada e uma conta de serviço com permissões para gerenciar o tópico do Pub/Sub de destino, o bucket do Cloud Storage ou a tabela do BigQuery.

Exportar metadados de recursos de um projeto para outro

Para exportar metadados de recursos de um projeto (PROJECT_A) para outro (PROJECT_B), conceda à conta de serviço padrão do Inventário de recursos do Cloud em PROJECT_A acesso aos recursos em PROJECT_B. Isso permite duas coisas:

  • É possível exportar metadados de recursos de PROJECT_A para um tópico do Pub/Sub, um bucket do Cloud Storage ou uma tabela do BigQuery localizado em PROJECT_B.

  • É possível usar PROJECT_A para exportar metadados de recursos de PROJECT_B para um tópico do Pub/Sub, um bucket do Cloud Storage ou uma tabela do BigQuery localizado em PROJECT_B.

Para exportar metadados de recursos de um projeto para outro, siga estas instruções:

  1. Verifique se a API Cloud Asset Inventory está ativada no projeto em que você quer executar sua solicitação, PROJECT_A.

  2. Faça pelo menos uma chamada para a API Cloud Asset Inventory em PROJECT_A para criar a conta de serviço padrão do Inventário de recursos do Cloud. Também é possível criá-lo manualmente:

    gcloud beta services identity create \
        --service=cloudasset.googleapis.com \
        --project=PROJECT_A_ID
    gcloud projects add-iam-policy-binding PROJECT_A_ID \
        --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
        --role=roles/cloudasset.serviceAgent
    

    Como encontrar um número de projeto do Google Cloud

    Console

    Para encontrar um número de projeto do Google Cloud, siga estas etapas:

    1. Acesse a página Painel no console do Google Cloud.

      Ir para o painel

    2. Clique na caixa do seletor na barra de menus.
    3. Escolha a organização na caixa Selecionar de e pesquise o nome do projeto.
    4. Clique no nome do projeto para alternar para ele. O número do projeto é mostrado no card Informações do projeto.

    CLI da gcloud

    É possível recuperar um número de projeto do Google Cloud com o seguinte comando:

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

  3. Conceda as permissões corretas à conta de serviço.

    • Para publicar em um feed por meio do Pub/Sub, conceda o papel roles/pubsub.publisher à conta de serviço no tópico:

      gcloud pubsub topics add-iam-policy-binding projects/PROJECT_B_ID/topics/TOPIC_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/pubsub.publisher
      
    • Para gravar em um bucket do Cloud Storage, conceda o papel roles/storage.admin à conta de serviço no bucket:

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • Para gravar em uma tabela do BigQuery, conceda os papéis roles/bigquery.dataEditor e roles/bigquery.user à conta de serviço no projeto:

      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.user
      gcloud projects add-iam-policy-binding PROJECT_B_ID \
          --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
          --role=roles/bigquery.dataEditor
      

Ao fazer solicitações do Inventário de recursos do Cloud, especifique PROJECT_A como o projeto que você quer usar. Para fazer isso para a CLI gcloud, defina a sinalização --billing-project como PROJECT_A_ID. Para REST, defina o cabeçalho X-Goog-User-Project como PROJECT_A_ID.

Por que a API Cloud Asset está desatualizada?

A atualização dos dados na API do Cloud Asset é feita com base no melhor esforço. Embora quase todas as atualizações de recursos estejam disponíveis para os clientes em minutos, em casos raros, é possível que o resultado dos métodos da API Cloud Asset não inclua as atualizações mais recentes.

Por que os arquivos temporários são gerados depois da execução de ExportAssets?

A operação ExportAssets pode criar arquivos temporários na pasta de saída. Não remova esses arquivos enquanto a operação estiver em andamento. Após a conclusão da operação, os arquivos temporários serão removidos automaticamente.

Se os arquivos temporários não forem excluídos, será possível removê-los com segurança após a conclusão da operação ExportAssets.

Por que minha credencial do Google Cloud CLI ou do Cloud Shell foi rejeitada?

Se um projeto de usuário em uma solicitação for enviado para cloudasset.googleapis.com pela Google Cloud CLI ou pelo Cloud Shell, você receberá uma mensagem de erro como esta:

Your application has authenticated using end user credentials from the
Google Cloud CLI or Cloud Shell which are not supported by the
cloudasset.googleapis.com. We recommend that most server applications
use service accounts instead. For more information about service accounts
and how to use them in your application, see
https://cloud.google.com/docs/authentication/.

Para corrigir esse problema, defina o projeto do usuário como o ID do projeto do usuário com a API Cloud Asset ativada. Isso pode ser feito especificando o cabeçalho HTTP X-Goog-User-Project na solicitação HTTP.

Se você estiver usando curl, isso poderá ser feito adicionando o seguinte parâmetro:

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

Se você estiver usando a CLI gcloud, especifique a sinalização --billing-project PROJECT_ID com o comando gcloud asset ou use o seguinte comando:

gcloud config set billing/quota_project PROJECT_ID

Por que vejo ancestrais diferentes para os mesmos recursos?

Ao chamar a API Cloud Asset para receber diferentes tipos de metadados, como metadados RESOURCE e metadados IAM POLICY para o mesmo recurso, é possível que o campo ancestors esteja inconsistente no conteúdo de pesquisa. Isso ocorre porque há programações diferentes de ingestão de dados para cada tipo de conteúdo, e eles podem ficar inconsistentes até que o processo de ingestão seja concluído. Verifique o campo update_time para garantir que o recurso tenha as informações mais atualizadas.

Entre em contato conosco se a inconsistência durar mais de 24 horas.

Com que frequência posso chamar a API ExportAssets?

Recomendamos chamar a API ExportAssets para o mesmo projeto, pasta ou organização de maneira sequencial. Por exemplo, emita a segunda chamada após a anterior ser concluída. Para capturar atualizações de recursos em tempo real, use notificações em tempo real.

Receber atualizações de recursos duplicados

Depois de configurar as notificações em tempo real, é possível que você receba atualizações de recursos duplicadas no seu tópico do Pub/Sub. Isso é causado por uma tentativa automática de entregar novamente, já que o Pub/Sub não garante pelo menos uma entrega.

Por que não recebi notificações de exclusões de projetos?

Ao encerrar um projeto, você tem 30 dias para desfazer a operação. O campo deleted na notificação não é definido até que o projeto seja excluído permanentemente. Para monitorar projetos com exclusão pendente, defina um feed com uma condição no lifecycleState do projeto, por exemplo, temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED".

Como recupero a representação JSON de um recurso com a API SearchAllResources?

Por padrão, SearchAllResources retorna os seguintes campos padrão quando read_mask não é especificado:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Se você quiser recuperar todos os campos nos metadados do recurso, além dos campos listados acima, especifique a sinalização read_mask (--read-mask em gcloud) na solicitação de pesquisa.

Um read_mask é uma lista de campos, separados por vírgulas, que você quer retornar nos resultados. Alguns campos são muito grandes, como versionedResources e attachedResources, e por isso não são incluídos nos resultados por padrão. Para incluir esses campos, especifique-os em read_mask ou use "*" para incluir todos os campos disponíveis. Exemplos de valores de read_mask incluem: "name,location", "name,versionedResources" e "*".

Confira um exemplo de gcloud:

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