Preguntas frecuentes y solución de problemas

¿Cloud Asset Inventory es un servicio global?

Sí. La API de Cloud Asset no depende de la ubicación. Tiene un extremo global, que entrega los metadatos de todos los recursos regionales y globales compatibles en Cloud Asset Inventory. Se puede acceder a la API de Cloud Asset en cualquier zona.

¿Qué tipo de coherencia de datos proporciona Cloud Asset Inventory?

Cloud Asset Inventory proporciona coherencia eventual sobre los datos actuales y coherencia en todo el esfuerzo de los datos históricos. A pesar de las pocas probabilidades en la práctica, es posible que Cloud Asset Inventory se pierda algunas actualizaciones de un recurso en el pasado.

¿Por qué no tengo permiso para usar la API de Cloud Asset?

Se muestra un error si no tienes permiso para exportar elementos o para obtener el historial de una organización, un proyecto o una carpeta.

Por ejemplo, si no tienes permiso, ejecuta el siguiente 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

Muestra el siguiente error:

{
  "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 solucionar este problema, solicita acceso desde tu proyecto, organización o administrador de la organización. Según los elementos de los que intentes exportar o de los que quieras obtener el historial, necesitarás una de las siguientes funciones, o bien otras que incluyan los permisos necesarios de la API de Cloud Asset:

  • cloudasset.viewer

  • cloudasset.owner

Para obtener más información acerca de las funciones y los permisos, consulta Comprende las funciones.

Si deseas obtener más información sobre las opciones de control de acceso para las API de Cloud Asset, consulta Control de acceso.

¿Por qué mis exportaciones muestran un error de permiso denegado?

A menos que especifiques lo contrario, Cloud Asset Inventory usa la cuenta de servicio predeterminada de Cloud Asset Inventory en el proyecto activo para administrar recursos, como temas de Pub/Sub, buckets de Cloud Storage y tablas de BigQuery. Esta cuenta de servicio se crea la primera vez que llamas a la API de Cloud Asset Inventory desde un proyecto y, de forma predeterminada, tiene permiso para administrar estos recursos, siempre que se encuentren en el mismo proyecto.

Puedes recibir errores de permiso denegado en las siguientes situaciones:

  • Cuando usas la API de REST, que no establece un proyecto activo, por lo que Cloud Asset Inventory no sabe qué cuenta de servicio usar

  • Cuando se usa gcloud CLI desde un proyecto diferente al tema de Pub/Sub, el bucket de Cloud Storage o la tabla de BigQuery. Esto significa que la cuenta de servicio predeterminada de Cloud Asset Inventory del proyecto activo se usa para realizar la tarea (si existe) y es posible que no tenga permisos para escribir en los recursos del otro proyecto.

Para asegurarte de que se use la cuenta de servicio correcta cuando realices solicitudes de exportación a temas de Pub/Sub, buckets de Cloud Storage o tablas de BigQuery, puedes especificar el ID del proyecto que contenga la cuenta de servicio predeterminada de Cloud Asset Inventory correcta. Si exportas de un proyecto a otro, también debes otorgar funciones específicas a la cuenta de servicio.

gcloud

En el caso de gcloud CLI, agrega la marca --billing-project a tu comando para especificar el ID del proyecto que contiene la cuenta de servicio correcta:

--billing-project=BILLING_PROJECT_ID

Como alternativa, puedes configurar el proyecto de facturación antes de ejecutar comandos con gcloud CLI. Primero, comprueba si el proyecto de facturación es diferente del proyecto principal:

gcloud config list

Luego, si es necesario, configura el proyecto de facturación de la siguiente manera:

gcloud config set billing/quota_project BILLING_PROJECT_ID

Ingresa los siguientes valores:

  • BILLING_PROJECT_ID: Se debe habilitar un ID del proyecto que tiene la API de Cloud Asset Inventory y una cuenta de servicio con permisos para administrar el tema de Pub/Sub de destino, el bucket de Cloud Storage o la tabla de BigQuery.

REST

Para la API de REST, agrega el encabezado X-Goog-User-Project a fin de especificar el ID del proyecto que contiene la cuenta de servicio correcta. Cuando usas curl, debes configurar el encabezado con la marca -H:

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

Ingresa los siguientes valores:

  • BILLING_PROJECT_ID: Se debe habilitar un ID del proyecto que tiene la API de Cloud Asset Inventory y una cuenta de servicio con permisos para administrar el tema de Pub/Sub de destino, el bucket de Cloud Storage o la tabla de BigQuery.

Exportar metadatos de activos de un proyecto a otro

Para exportar metadatos de elementos de un proyecto, PROJECT_A, a otro, PROJECT_B, debes otorgar a la cuenta de servicio predeterminada de Cloud Asset Inventory en PROJECT_A acceso a los recursos en PROJECT_B. Esto permite dos cosas:

  • Puedes exportar metadatos de elementos de PROJECT_A a un tema de Pub/Sub, un bucket de Cloud Storage o una tabla de BigQuery ubicada en PROJECT_B.

  • Puedes usar PROJECT_A para exportar metadatos de elementos de PROJECT_B a un tema de Pub/Sub, un bucket de Cloud Storage o una tabla de BigQuery ubicada en PROJECT_B.

Para exportar metadatos de activos de un proyecto a otro, completa las siguientes instrucciones:

  1. Asegúrate de que la API de Cloud Asset Inventory esté habilitada en el proyecto desde el que deseas ejecutar tu solicitud, PROJECT_A.

  2. Realiza al menos una llamada a la API de Cloud Asset Inventory en PROJECT_A para crear la cuenta de servicio predeterminada de Cloud Asset Inventory. Como alternativa, puedes crearlo de forma manual:

    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
    

    Cómo encontrar un número de proyecto de Google Cloud

    Consola

    Para encontrar un número de proyecto de Google Cloud, completa los siguientes pasos:

    1. Ve a la página Panel en la consola de Google Cloud.

      Ir al panel

    2. Haz clic en el cuadro de cambio en la barra de menú.
    3. Elige tu organización en el cuadro Seleccionar una opción y, luego, busca el nombre del proyecto.
    4. Haz clic en el nombre del proyecto para cambiarlo. El número de proyecto se muestra en la tarjeta Información del proyecto.

    gcloud CLI

    Puedes recuperar el número de proyecto de Google Cloud con el siguiente comando:

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

  3. Otorga los permisos correctos a la cuenta de servicio.

    • Para publicar en un feed a través de Pub/Sub, otorga el rol roles/pubsub.publisher a la cuenta de servicio en el tema:

      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 escribir en un bucket de Cloud Storage, otorga la función roles/storage.admin a la cuenta de servicio en el bucket:

      gsutil iam ch \
        serviceAccount:service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com:objectCreator \
        gs://BUCKET_NAME
      
    • Para escribir en una tabla de BigQuery, otorga las funciones roles/bigquery.dataEditor y roles/bigquery.user a la cuenta de servicio del proyecto:

      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
      

Cuando realices solicitudes de Cloud Asset Inventory, asegúrate de especificar PROJECT_A como el proyecto que quieres usar. Para gcloud CLId, establece la marca --billing-project en PROJECT_A_ID. Para REST, establece el encabezado X-Goog-User-Project en PROJECT_A_ID.

¿Por qué está inactivo el resultado de la API de Cloud Asset?

La actualización de datos en la API de Cloud Asset se basa el criterio del mejor esfuerzo. Si bien casi todas las actualizaciones de elementos están disponibles para los clientes en minutos, en casos excepcionales, es posible que el resultado de los métodos de la API de Cloud Asset no incluya las actualizaciones de elementos más recientes.

¿Por qué se producen archivos temporales después de ejecutar ExportAssets?

La operación ExportAssets puede crear archivos temporales en la carpeta de salida. No quites estos archivos temporales mientras se realiza la operación. Una vez que se completa la operación, los archivos temporales se quitan automáticamente.

Si los archivos temporales permanecen, puedes quitarlos de forma segura después de que se complete la operación ExportAssets.

¿Por qué se rechazó mi credencial de Google Cloud CLI o Cloud Shell?

Si se envía un proyecto de usuario en una solicitud a cloudasset.googleapis.com desde Google Cloud CLI o Cloud Shell, recibirás un mensaje de error como el siguiente:

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 solucionar este problema, configura el proyecto del usuario con el ID del proyecto del usuario habilitado para la API de Cloud Asset. Para ello, se debe especificar el encabezado HTTP X-Goog-User-Project en la solicitud HTTP.

Si usas curl, puedes agregar el siguiente parámetro para hacer esto:

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

Si usas gcloud CLI, especifica la marca --billing-project PROJECT_ID junto con el comando gcloud asset o usa el siguiente comando:

gcloud config set billing/quota_project PROJECT_ID

¿Por qué veo diferentes principales para los mismos recursos?

Cuando se llama a la API de Cloud Asset a fin de obtener diferentes tipos de metadatos, como metadatos de RESOURCE y de IAM POLICY, del mismo elemento, es posible que el campo ancestors no sea coherente en todos los tipos de contenido. Esto se debe a que hay diferentes programas de transferencia de datos para cada tipo de contenido y, hasta que el proceso de transferencia se complete, pueden ser incoherentes. Revisa el campo update_time para asegurarte de que el recurso tenga la información más actualizada.

Comunícate con nosotros si la incoherencia tiene más de 24 horas.

¿Con qué frecuencia debo llamar a la API de ExportAssets?

Recomendamos llamar a la API de ExportAssets para el mismo proyecto, organización o carpeta de manera secuencial; por ejemplo, emite la segunda llamada después de que se complete la anterior. Si deseas capturar actualizaciones de elementos en tiempo real, considera usar notificaciones en tiempo real.

Recibir actualizaciones de recursos duplicados

Después de configurar las notificaciones en tiempo real, es posible que recibas actualizaciones de elementos duplicadas en tu tema de Pub/Sub. Esto se debe a un intento automático de reintentar la entrega, ya que Pub/Sub no garantiza al menos una entrega.

¿Por qué no recibí notificaciones para borrar proyectos?

Cuando cierras un proyecto, tienes 30 días para deshacer la operación. El campo deleted en la notificación no se establece hasta que el proyecto se borre de forma permanente. Para supervisar los proyectos que están pendientes de eliminación, puedes configurar un feed con una condición en el lifecycleState del proyecto, por ejemplo, temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED".

¿Cómo puedo recuperar la representación JSON de un recurso con la API de SearchAllResources?

De forma predeterminada, SearchAllResources muestra los siguientes campos estándar cuando no se especifica read_mask:

  • name

  • assetType

  • project

  • folders

  • organization

  • displayName

  • description

  • location

  • labels

  • networkTags

  • kmsKeys

  • createTime

  • updateTime

  • state

  • additionalAttributes

  • parentFullResourceName

  • parentAssetType

Si deseas recuperar todos los campos de los metadatos del recurso, además de los campos enumerados con anterioridad, puedes especificar la marca read_mask (--read-mask en gcloud) en la solicitud de búsqueda.

Un elemento read_mask es una lista de campos, separados por comas, que deseas que se muestren en los resultados. Algunos campos son demasiado grandes, como versionedResources y attachedResources, por lo que no se incluyen en los resultados de forma predeterminada. Si quieres incluir estos campos, puedes especificarlos en read_mask o usar "*" para incluir todos los campos disponibles. Algunos ejemplos de valores read_mask son "name,location", "name,versionedResources" y "*".

Aquí hay un ejemplo de gcloud:

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