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 Inventário de recursos do Cloud 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 probabilidade 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?

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 a conta de serviço é 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 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, o Cloud Asset Inventory não sabe qual conta de serviço usar.

  • Ao usar a CLI gcloud de um projeto diferente daquele Tópico do Pub/Sub, bucket do Cloud Storage ou BigQuery está localizada. Isso significa que a conta de serviço padrão do Cloud Asset Inventory do projeto ativo é usada para executar a tarefa (se ela 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 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, é 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

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

Na API REST, adicione o cabeçalho X-Goog-User-Project para especificar o projeto ID 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 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.

Exportar metadados de recursos de um projeto para outro

Para exportar metadados de recursos de um projeto, PROJECT_A, para outro, PROJECT_B, é necessário conceder à conta de serviço padrão do inventário de recursos do Cloud em PROJECT_A acesso aos recursos 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 do recurso de PROJECT_B em um tópico do Pub/Sub, do bucket do Cloud Storage ou tabela do BigQuery localizada em PROJECT_B.

Para exportar metadados de recursos de um projeto para outro, siga estas 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. Como alternativa, é 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 sua organização na caixa Selecionar de e pesquise as nome do projeto.
    4. Clique no nome do projeto para alternar para ele. O número do projeto é mostrado 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 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.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 a Papéis roles/bigquery.dataEditor e roles/bigquery.user ao 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 na CLI gcloud, defina a flag --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 todos atualizações de recursos são disponibilizadas aos clientes em questão de minutos. Em casos raros, o resultado dos métodos da API Cloud Asset não incluirá o recurso mais recente atualizações.

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 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 da CLI do Google Cloud ou do Cloud Shell, você vai 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 endereço de e-mail do usuário ID do projeto. Isso pode ser feito ao especificar o cabeçalho HTTP X-Goog-User-Project no a 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 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. Consulte a update_time para garantir que o recurso tenha a versão mais atualizada informações imprecisas ou inadequadas.

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 repetir a 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?

Quando encerra 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. Monitorar projetos pendentes exclusão, é possível definir 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 foi especificado:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Se você deseja recuperar todos os campos nos metadados do recurso, além dos campos listados acima, é possível especificar a sinalização 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, não são incluídas nos resultados por padrão. Para incluir esses campos, é possível especificá-los no read_mask; ou use "*" para inclua 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"