Los siguientes son problemas habituales que pueden ocurrir cuando interactúas con la API de Cloud Asset y también se muestra cómo tratarlos.
¿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.
¿Por qué mi solicitud tiene credenciales de autenticación no válidas?
Si no configuraste el encabezado OAuth correctamente, cuando realizas una llamada, se mostrará el siguiente error:
{
"error": {
"code": 401,
"message": "Request had invalid authentication credentials. Expected
OAuth 2 access token, login cookie or other valid
authentication credential. See
https://developers.google.com/identity/sign-in/web/devconsole-project.",
"status": "UNAUTHENTICATED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"detail": "Authentication error: 2"
}
]
}
}
A fin de solucionar este problema, repite los pasos para verificar la configuración inicial.
¿Por qué no tengo permiso para usar la API de Cloud Asset?
Se muestra un error si no tienes permiso para exportar elementos ni conseguir el historial en una organización, proyecto o carpeta.
Por ejemplo, si no tienes permiso, ejecuta el siguiente comando:
gcurl -d '{"outputConfig":{"gcsDestination": \ {"uri":gs://YOUR_BUCKET/NEW_FILE}}}' \ https://cloudasset.googleapis.com/v1/projects/PROJECT_NUMBER:exportAssets
Se mostrará 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 que intentes exportar o de los que quieras obtener el historial, necesitarás una de las siguientes funciones, o bien otras funciones, que incluyan los permisos requeridos por 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é fallan mis exportaciones a los comandos de Cloud Storage?
Si el bucket de Cloud Storage que usas para almacenar datos exportados no está en el proyecto habilitado de la API de Cloud Asset desde el que ejecutas la exportación, la solicitud tendrá como resultado el siguiente error de permiso denegado:
{ "error": { "code": 7, "message": "Failed to write to: YOUR_BUCKET/FILE", } }
Para abordar este problema, usa un depósito de Cloud Storage que pertenezca al proyecto habilitado para la API de Cloud Asset en el que ejecutas la exportación o puedes otorgar a la cuenta de servicio service-PROJECT_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
la función roles/storage.admin
, en la que PROJECT_NUMBER es el número del proyecto habilitado para la API de Cloud Asset en el que ejecutas la exportación.
¿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 recursos estarán disponibles para los clientes en pocos minutos, en casos excepcionales, es posible que el resultado de los métodos de la API de Cloud Asset o no incluya las actualizaciones más recientes de los elementos.
¿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 completada 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
.
¿Qué sucede si mi URL de solicitud es demasiado larga para BatchGetAssetsHistory
?
El método BatchGetAssetsHistory
es una acción HTTP GET que envía todos los datos de la solicitud en una URL de longitud limitada. Como resultado, se producirá un error si la solicitud es demasiado larga.
Para evitar esto, el código de cliente debe usar HTTP POST a fin de enviar una solicitud con Content-Type
configurado como application/x-www-form-urlencoded
junto con un encabezado HTTP X-HTTP-Method-Override: GET
. Consulta URL de solicitud larga para obtener más información.
La siguiente es una solicitud de ejemplo para BatchGetAssetsHistory
con HTTP POST:
curl -X POST -H "X-HTTP-Method-Override: GET" \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "Authorization: Bearer" \ -d 'assetNames=&contentType=1&readTimeWindow.startTime=2018-09-01T09:00:00Z' \ https://cloudasset.googleapis.com/v1/projects/ :batchGetAssetsHistory
¿Por qué se rechazó mi credencial de CLI de Google Cloud o de Cloud Shell?
Si se envía un proyecto de usuario en una solicitud a cloudasset.googleapis.com
desde la CLI de Google Cloud o Cloud Shell, verá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, establece el proyecto del usuario como el ID del proyecto del usuario habilitado de la API de Cloud Asset. Para ello, especifica el encabezado HTTP X-Goog-User-Project
en la solicitud HTTP.
Si usas curl, esto se puede hacer si agregas el siguiente parámetro:
-H 'X-Goog-User-Project: PROJECT_ID'
Si usas la CLI de gcloud, especifica la marca --billing-project <var>PROJECT_ID</var>
junto con el comando gcloud asset
o usa el siguiente comando:
gcloud config set billing/quota_project PROJECT_ID
¿Cómo exporto recursos a las tablas de BigQuery que no pertenecen al proyecto actual?
Cuando llamas a la API ExportAssets
desde el proyecto habilitado para la API de Cloud Asset (A), esta usa la cuenta de servicio service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
a fin de escribir en la tabla de BigQuery de destino. Para exportar a una tabla de BigQuery de otro proyecto (B), haz lo siguiente:
En la política de Identity and Access Management (IAM) del proyecto B, otorga a la cuenta de servicio (service-PROJECT_A_NUMBER@gcp-sa-cloudasset.iam.gserviceaccount.com
) las funciones roles/bigquery.user
y roles/bigquery.dataEditor
.
¿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 esté completo pueden ser incoherentes. Revisa el campo update_time
para asegurarte de que el elemento tenga la información más reciente.
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 la misma organización, carpeta o proyecto 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.
Recibe actualizaciones de elementos 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 para 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 proyectos que están pendientes de eliminación, puedes configurar un feed con una condición en el lifecycleState
del proyecto, p. ej., temporal_asset.asset.resource.data.lifecycleState == "DELETE_REQUESTED"
.