Solucionar problemas de funciones de Cloud Run

En este documento se explica cómo solucionar mensajes de error y problemas al usar Cloud Run Functions. Si has creado o desplegado una función con Cloud Run, consulta Solucionar problemas de Cloud Run.

Implementación

En esta sección se enumeran los problemas que puede encontrar al implementar la aplicación y se ofrecen sugerencias para solucionarlos. Muchos de los problemas que puedes encontrar durante la implementación están relacionados con los roles y los permisos o con una configuración incorrecta.

Puedes usar Gestión de Identidades y Accesos para autorizar identidades a realizar acciones administrativas en funciones creadas con la API Cloud Functions v2. Por ejemplo, puedes usar gcloud functions, la API REST o Terraform. Entre las acciones de administración se incluyen la creación, la actualización y la eliminación de funciones. Para obtener más información, consulta Autorizar el acceso con IAM.

Faltan permisos de usuario en la cuenta de servicio de tiempo de ejecución al desplegar una función

Cada función está asociada a una cuenta de servicio que actúa como su identidad cuando la función accede a otros recursos. Esta cuenta de servicio de tiempo de ejecución puede ser la cuenta de servicio predeterminada o una cuenta de servicio gestionada por el usuario. En entornos en los que varias funciones acceden a diferentes recursos, es habitual usar identidades por función con cuentas de servicio de entorno de ejecución con nombre en lugar de la cuenta de servicio de entorno de ejecución predeterminada (PROJECT_NUMBER-compute@developer.gserviceaccount.com).

Para usar una cuenta de servicio de tiempo de ejecución, el implementador debe tener el permiso iam.serviceAccounts.actAs en esa cuenta de servicio. A los usuarios que crean una cuenta de servicio de tiempo de ejecución no predeterminada se les concede automáticamente este permiso, pero otros implementadores deben obtenerlo de un usuario.

Asigna el permiso iam.serviceAccounts.actAs a la cuenta de servicio del tiempo de ejecución del usuario que tenga el rol Lector de proyectos, Desarrollador de Cloud Functions o Administrador de Cloud Functions.

Mensaje de error

Consola

  You must have the iam.serviceAccounts.actAs permission on the selected service account. To obtain this permission, you can grant a role that includes it like the Service Account User role, on the project.

gcloud

Cuenta de servicio predeterminada:

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'

Cuenta de servicio no predeterminada:

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller is missing permission 'iam.serviceaccounts.actAs' on service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com.You can do that by running 'gcloud iam service-accounts add-iam-policy-binding projects/-/serviceAccounts/
SERVICE_ACCOUNT_NAME@PROJECT_ID
.iam.gserviceaccount.com --member MEMBER --role roles/iam.serviceAccountUser'where MEMBER has a prefix like 'user:' or 'serviceAccount:'

Solución

Asigna al usuario el rol Usuario de cuenta de servicio (roles/iam.serviceAccountUser) en la cuenta de servicio de tiempo de ejecución predeterminada o no predeterminada. Este rol incluye el permiso iam.serviceAccounts.actAs.

Faltan permisos de Pub/Sub en la cuenta de servicio de implementación al implementar una función basada en eventos

El servicio Cloud Functions usa la cuenta de servicio del agente de servicio de Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) para realizar acciones administrativas. De forma predeterminada, a esta cuenta se le asigna el rol cloudfunctions.serviceAgent de Cloud Functions. Para desplegar funciones basadas en eventos, el servicio Cloud Functions debe acceder a Pub/Sub para configurar temas y suscripciones. Si cambias el rol asignado a la cuenta de servicio sin conceder los permisos adecuados, el servicio Cloud Functions no podrá acceder a Pub/Sub y la implementación fallará.

Mensaje de error

Consola

Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/test-project-356312/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]

Solución

Puedes restablecer tu cuenta de servicio al rol predeterminado cloudfunctions.serviceAgent.

No existe la cuenta de servicio de tiempo de ejecución predeterminada

Si no especificas una cuenta de servicio de entorno de ejecución gestionada por el usuario, Cloud Functions usará la cuenta de servicio de computación predeterminada como cuenta de servicio de entorno de ejecución. Las implementaciones fallarán si eliminas la cuenta predeterminada sin especificar una cuenta gestionada por el usuario.

Mensaje de error

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[404], code=[Ok], message=[Service account projects/-/serviceAccounts/PROJECT_NUMBER-compute@developer.gserviceaccount.com was not found.]

Solución

Para solucionar este problema, siga cualquiera de estas soluciones:

Faltan permisos de segmento de proyecto en la cuenta de servicio del agente de servicio de Cloud Functions al implementar una función

Las funciones de Cloud Run solo se pueden activar mediante eventos de segmentos de Cloud Storage del Google Cloud mismo proyecto de plataforma. Además, la cuenta de servicio del agente de servicio de Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) necesita el rol cloudfunctions.serviceAgent en tu proyecto.

Mensaje de error

Consola

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/PROJECT_ID/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Validation failed for trigger projects/<project-id>/locations/LOCATION/triggers/FUNCTION_NAME-EVENTARC_ID: Permission "iam.serviceAccounts.ActAs" denied on "EndUserCredentials to PROJECT_NUMBER-compute@developer.gserviceaccount.com"]

Solución

Para solucionar este problema, restablece esta cuenta de servicio al rol predeterminado.

Un usuario con el rol Editor de proyecto no puede hacer pública una función

El rol Editor de proyecto tiene permisos amplios para gestionar los recursos de un proyecto, pero no concede la capacidad de hacer públicas las funciones de Cloud. El usuario o el servicio que implemente la función necesitará el permiso run.services.setIamPolicy.

Mensaje de error

gcloud

ERROR: (gcloud.run.services.add-iam-policy-binding) PERMISSION_DENIED: Permission 'run.services.setIamPolicy' denied on resource 'projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME' (or resource may not exist).

Solución

Puedes hacer lo siguiente :

La implementación de funciones falla al usar la política de organización de restricción de ubicaciones de recursos

Si tu organización usa una política de restricción de ubicación de recursos, se restringe el despliegue de funciones en las regiones restringidas por la política. En la consola de Google Cloud , la región restringida no estará disponible en el menú desplegable de regiones al implementar una función.

Mensaje de error

gcloud

ResponseError: status=[400], code=[Ok], message=["LOCATION" violates constraint "constraints/gcp.resourceLocations" on the resource "projects/PROJECT_ID/locations/LOCATION/functions/FUNCTION_NAME".]

Solución

Puedes añadir o quitar ubicaciones de las listas allowed_values o denied_values de una restricción de ubicaciones de recursos para que la implementación se realice correctamente.

Fallo al desplegar una función durante la ejecución del ámbito global de la función

Este error indica que ha habido un problema con tu código. La canalización de implementación ha terminado de implementar la función, pero ha fallado en el último paso: enviar una comprobación del estado a la función. Esta comprobación del estado está diseñada para ejecutar el ámbito global de una función, que podría generar una excepción, fallar o agotar el tiempo de espera. El ámbito global es donde se suelen cargar las bibliotecas e inicializar los clientes.

Mensaje de error

En los registros de Cloud Logging:

Could not create or update Cloud Run service FUNCTION_NAME, Container Healthcheck failed. Revision REVISION_NAMEE is not ready and cannot serve traffic. The user-provided container failed to start and listen on the port defined provided by the PORT=8080 environment variable. Logs for this revision might contain more information.

Solución

Para solucionar este problema, siga cualquiera de estas soluciones:

  • Para ver un mensaje de error más detallado, consulta los registros de compilación de tu función.

  • Si no sabes por qué no se ha ejecutado el ámbito global de tu función, prueba a mover el código temporalmente a la invocación de la solicitud y usa la inicialización diferida de las variables globales. De esta forma, puedes añadir instrucciones de registro adicionales en tus bibliotecas de cliente, que podrían agotar el tiempo de espera en su creación de instancias (sobre todo si llaman a otros servicios), fallar o generar excepciones.

  • Además, prueba a aumentar el tiempo de espera de la función. Los límites de tiempo de espera más largos en las funciones de Cloud Run proporcionan más margen para la inicialización y ofrecen una asignación de recursos más escalable en un entorno de Cloud Run, lo que podría mitigar este problema si se debe al agotamiento de los recursos.

  • El código fuente debe contener una función de punto de entrada que se haya especificado correctamente en la implementación, ya sea a través de la consola o de gcloud.

Un usuario con el rol Lector no puede implementar una función

Los usuarios con el rol Lector de proyectos o Lector de Cloud Functions tienen acceso de solo lectura a las funciones y a sus detalles, y no pueden desplegar funciones nuevas. La función Crear función está atenuada en la consolaGoogle Cloud y aparece el siguiente error:

Mensaje de error

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Permission 'cloudfunctions.functions.generateUploadUrl' denied on 'projects/PROJECT_ID/locations/LOCATION/functions']

Solución

Asigna el rol Desarrollador de Cloud Functions al usuario.

Faltan permisos de la cuenta de servicio de compilación

Mensaje de error

En el error de implementación de la función o en los registros de compilación, puede que veas uno de los siguientes errores:

The service account running this build does not have permission to write logs. To fix this, grant the Logs Writer (roles/logging.logWriter) role to the service account.
Step #0 - "fetch": failed to Fetch: failed to download archive gs://gcf-v2-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-v2-sources-PROJECT_NUMBER-LOCATION denied. You must grant Storage Object Viewer permission to PROJECT_NUMBER-compute@developer.gserviceaccount.com.
Step #2 - "build": ERROR: failed to create image cache: accessing cache image "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": connect to repo store "LOCATION-docker.pkg.dev/PROJECT/gcf-artifacts/FUNCTION_NAME/cache:latest": GET https://LOCATION-docker.pkg.dev/v2/token?scope=repository%3APROJECT%2Fgcf-artifacts%2FFUNCTION_NAME%2Fcache%3Apull&service=: DENIED: Permission "artifactregistry.repositories.downloadArtifacts" denied on resource "projects/PROJECT/locations/LOCATION/repositories/gcf-artifacts" (or it may not exist)
Could not build the function due to a missing permission on the build service account. If  you didn't revoke that permission explicitly, this could be caused by a change in the organization policies.

Solución

La cuenta de servicio de compilación necesita permiso para leer del segmento de origen y permisos de lectura y escritura para el repositorio de Artifact Deployment. Es posible que se produzca este error debido a un cambio en el comportamiento predeterminado de cómo usa Cloud Build las cuentas de servicio, que se detalla en el artículo Cambio en la cuenta de servicio de Cloud Build.

Para solucionar este problema, utiliza cualquiera de estas soluciones:

Cuenta de servicio de compilación inhabilitada

Mensaje de error

Could not build the function due to disabled service account used by Cloud Build. Please make sure that the service account is active.

Solución

La cuenta de servicio de compilación debe estar habilitada para desplegar una función. Puede que se produzca este error debido a un cambio en el comportamiento predeterminado de cómo usa Cloud Build las cuentas de servicio, que se describe en el artículo Cambio en la cuenta de servicio de Cloud Build.

Para solucionar este problema, utiliza cualquiera de estas soluciones:

sirviendo

En esta sección se enumeran los problemas de publicación que puede encontrar y se ofrecen sugerencias para solucionarlos.

Error de permiso de publicación debido a que la función requiere autenticación

Las funciones HTTP sin la opción Permitir invocaciones sin autenticar habilitada restringen el acceso a los usuarios finales y a las cuentas de servicio que no tienen los permisos adecuados. Este mensaje de error indica que la persona que llama no tiene permiso para invocar la función.

Mensaje de error

Código de respuesta de error HTTP: 403 Prohibido

Cuerpo de la respuesta de error HTTP:

Error: Forbidden Your client does not have permission
to get URL /FUNCTION_NAME from this server.

Solución

Para solucionar este problema, siga cualquiera de estas soluciones:

Error de publicación debido a la configuración de allow internal traffic only

Los ajustes de entrada restringen si una función HTTP puede invocarse mediante recursos que estén fuera de tu proyecto de Google Cloud o de tu perímetro de servicio de Controles de Servicio de VPC. Cuando configuras el ajuste Permitir solo el tráfico interno para la red de entrada, este mensaje de error indica que solo se permiten las solicitudes de redes VPC del mismo proyecto o perímetro de Controles de Servicio de VPC. También puede tratarse de un error 404 de la functions.netURL predeterminada.

Mensaje de error

Código de respuesta de error HTTP: 404 NOT FOUND

Solución

Para solucionar este error, siga una de estas soluciones:

  • Asegúrate de que la solicitud proceda de tu Google Cloud proyecto o perímetro de servicio de Controles de Servicio de VPC.

  • Cambia los ajustes de entrada para permitir todo el tráfico de la función.

  • El código fuente de las funciones de Cloud Run también puede dar como resultado un error 404 debido a una URL de función incorrecta, métodos HTTP, errores de lógica, etc.

La invocación de la función no tiene credenciales de autenticación válidas

Para invocar una función de Cloud Run Functions que se haya configurado con acceso restringido, se necesita un token de ID. Los tokens de acceso o los tokens de actualización no funcionan.

Mensaje de error

Código de respuesta de error HTTP: 401 Unauthorized

Cuerpo de la respuesta de error HTTP:

Your client does not have permission to the requested URL 'FUNCTION_NAME'

Solución

Para solucionar este error, siga una de estas soluciones:

  • Asegúrate de que tus solicitudes incluyan un encabezado Authorization: Bearer ID_TOKEN y de que el token sea un token de ID, no un token de acceso o de actualización. Si generas este token manualmente con la clave privada de una cuenta de servicio, debes intercambiar el token JWT autofirmado por un token de identidad firmado por Google.

    Invoca tu función HTTP usando las credenciales de autenticación en el encabezado de la solicitud. Por ejemplo, puedes obtener un token de identidad mediante gcloud de la siguiente manera:

      curl  -H "Authorization: Bearer $(gcloud auth print-identity-token)" 
    https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION_NAME

  • Vuelve a implementar tu función para permitir invocaciones no autenticadas si tu organización lo admite. Esto es útil para hacer pruebas.

  • Asegúrate de que el campo audience (aud) del JSON Web Token (JWT) coincida exactamente con la URL de la función tal como se muestra en la consola Google Cloud . Cualquier discrepancia, incluida una ruta relativa adicional, provoca un fallo de autenticación y una respuesta 401.

La función se detiene a mitad de la ejecución o sigue ejecutándose después de que finalice el código

Algunos tiempos de ejecución de Cloud Run Functions permiten a los usuarios ejecutar tareas asíncronas. Si tu función crea estas tareas, también debe esperar explícitamente a que se completen. Si no lo haces, es posible que tu función deje de ejecutarse en el momento incorrecto.

Comportamiento de error

Tu función presenta uno de los siguientes comportamientos:

  • Tu función finaliza mientras las tareas asíncronas siguen ejecutándose, pero antes de que haya transcurrido el periodo de tiempo de espera especificado.
  • Tu función no deja de ejecutarse cuando finalizan estas tareas, sino que continúa hasta que transcurre el periodo de tiempo de espera.

Solución

Si tu función finaliza antes de tiempo, debes asegurarte de que todas las tareas asíncronas de la función se completen antes de que la función realice alguna de las siguientes acciones:

  • Devolver un valor
  • Resolver o rechazar un objeto Promise devuelto (solo funciones de Node.js)
  • Lanzar excepciones o errores no detectados
  • Enviar una respuesta HTTP
  • Llamar a una función de retrollamada

Si tu función no se finaliza después de completar las tareas asíncronas, debes verificar que la función esté señalando correctamente las funciones de Cloud Run después de que se haya completado. En concreto, asegúrate de realizar una de las operaciones indicadas anteriormente en cuanto tu función haya terminado sus tareas asíncronas.

Error de tiempo de ejecución al acceder a recursos protegidos por Controles de Servicio de VPC

De forma predeterminada, Cloud Run functions usa direcciones IP públicas para enviar solicitudes salientes a otros servicios. Si tus funciones no están dentro de un perímetro de Controles de Servicio de VPC, es posible que reciban respuestas HTTP 403 al intentar acceder a servicios protegidos por Controles de Servicio de VPC debido a denegaciones de perímetros de servicio. Google Cloud

Mensaje de error

En los registros de recursos auditados, una entrada como la siguiente:

"protoPayload": {
  "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
  "status": {
    "code": 7,
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "VPC_SERVICE_CONTROLS",
  ...
  "authenticationInfo": {
    "principalEmail": "CLOUD_FUNCTION_RUNTIME_SERVICE_ACCOUNT",
  ...
  "metadata": {
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
    "securityPolicyInfo": {
      "organizationId": "ORGANIZATION_ID",
      "servicePerimeterName": "accessPolicies/NUMBER/servicePerimeters/SERVICE_PERIMETER_NAME"
  ...

Solución

Para solucionar este error, siga una de estas soluciones:

Escalabilidad

En esta sección se enumeran los problemas de escalabilidad y se ofrecen sugerencias para solucionarlos.

Errores de Cloud Logging relacionados con cancelaciones de solicitudes de colas pendientes

Los errores de escalado pueden producirse en los siguientes casos:

  • Un aumento repentino y enorme del tráfico.
  • Tiempo de arranque en frío prolongado.
  • Tiempo de procesamiento de solicitudes largo.
  • Tasa de errores de función alta.
  • Alcanzar el límite máximo de instancias e impedir que el sistema se escale.
  • Factores transitorios atribuidos al servicio de Cloud Run Functions.

En ambos casos, es posible que las funciones de Cloud Run no se escalen lo suficientemente rápido para gestionar el tráfico.

Mensaje de error

  • The request was aborted because there was no available instance
    • severity=WARNING ( Código de respuesta: 429) Las funciones de Cloud Run no se pueden escalar debido al límite max-instances que has definido durante la configuración.
    • severity=ERROR ( Código de respuesta: 500) Las funciones de Cloud Run no pueden gestionar la tasa de tráfico.

Solución

  • Para solucionar este problema, aborda las causas que se han indicado anteriormente.

  • En el caso de las funciones basadas en activadores HTTP, el cliente debe implementar un tiempo de espera exponencial y reintentos para las solicitudes que no se deban descartar. Si activas funciones de Cloud Run desde Workflows, puedes usar la