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, 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 Cloud Asset Inventory oferece?

O Inventário de recursos do Cloud fornece consistência posterior nos dados atuais e no melhor esforço consistência nos dados históricos. Apesar da baixa chance na prática, é 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?

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

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 conseguir o histórico, você precisa de uma das funções a seguir ou outras que incluam o 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 Cloud Asset Inventory usa a conta de serviço padrão do Cloud Asset Inventory no projeto ativo para gerenciar recursos como tópicos do Pub/Sub, buckets do Cloud Storage e tabelas do BigQuery. Isso conta de serviço é criada na primeira vez que você chama a API Cloud Asset Inventory de um e, por padrão, tem permissão para gerenciar esses recursos, estejam localizados no mesmo projeto.

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

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

  • Ao usar a CLI gcloud em 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 o Inventário de recursos do Cloud padrão do projeto ativo conta de serviço é usada para executar a tarefa (se existir) e pode não têm 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 correta do Cloud Asset Inventory. Se você estiver exportando de um projeto para outro, você também precisa conceder papéis específicos à conta de serviço.

gcloud

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

--billing-project=BILLING_PROJECT_ID

Como alternativa, você pode 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

Em seguida, 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 que tem o A API Cloud Asset Inventory está ativada e uma conta de serviço com permissões para gerenciar o tópico de destino do Pub/Sub, o bucket do Cloud Storage ou Tabela do BigQuery.

REST

Para a 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 de projeto com a API Cloud Asset Inventory ativada e uma conta de serviço com permissões para gerenciar o tópico de destino do Pub/Sub, o bucket do Cloud Storage ou a tabela do BigQuery.

Exportar metadados de recursos de um projeto para outro

Para exportar metadados do recurso de um projeto, PROJECT_A, a outro, PROJECT_B, é preciso definir o padrão à conta de serviço do Inventário de recursos do Cloud no acesso PROJECT_A ao em PROJECT_B. Isso viabiliza duas coisas:

  • É possível exportar metadados do recurso de PROJECT_A para um Tópico do Pub/Sub, bucket do Cloud Storage ou BigQuery localizada 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, faça o seguinte: instruções:

  1. Confira se a API Cloud Asset Inventory esteja ativada no projeto a partir do qual você quer executar a solicitação; PROJECT_A

  2. Faça pelo menos uma chamada para a API Cloud Asset Inventory PROJECT_A para criar o Inventário de recursos do Cloud padrão conta de serviço. Você também pode criar 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 Alternador na barra de menus.
    3. Selecione sua 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 aparece no card Informações do projeto.

    CLI da gcloud

    Recupere 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 pelo 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 roles/storage.objectCreator à conta de serviço no bucket:

      gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com \
        --role=roles/storage.objectCreator
      
    • 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 em minutos para os clientes, em casos raros é possível que o resultado dos métodos da API Cloud Asset não inclua as atualizações de recursos 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. Depois que a operação for concluída, 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 da CLI ou do Cloud Shell do Google Cloud foi rejeitada?

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

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 pode ser feito adicionando o seguinte parâmetro:

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

Se você estiver usando a CLI gcloud, especifique a flag --billing-project PROJECT_ID junto 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á diferentes programações de ingestão de dados para cada tipo de conteúdo e até que os processamento for concluído, eles podem ser inconsistentes. 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 receber atualizações de recursos duplicadas no seu tópico do Pub/Sub. Isso é causado por uma tentativa automática de repetição da entrega, já que o Pub/Sub não garante a entrega pelo menos uma vez.

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 recuperar 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 flag read_mask (--read-mask em gcloud) na solicitação de pesquisa.

Uma 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. Portanto, elas não são incluídas 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"