Soluciona problemas de Cloud Functions

En este documento, se muestran algunos de los problemas comunes con los que te puedes encontrar y cómo tratar con ellos.

Implementación

A menudo surgen problemas durante la fase de implementación. Muchos de los problemas que puedes encontrar durante la implementación están relacionados con funciones y permisos. Otros están relacionados con una configuración incorrecta.

El usuario con la función de Visualizador no puede implementar una función

Un usuario al que se le asignó la función de visualizador del proyecto o visualizador de Cloud Functions tiene acceso de solo lectura a las funciones y a los detalles de la función. Estas funciones no tienen permiso para implementar funciones nuevas.

Mensaje de error

Consola de Cloud

You need permissions for this action. Required permission(s): cloudfunctions.functions.create

SDK de Cloud

ERROR: (gcloud.functions.deploy) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/<PROJECT_ID>/locations/<LOCATION>` (or resource may not exist)

La solución

Asigna al usuario una función con el acceso adecuado.

El usuario con la función de visualizador de proyecto o Cloud Function no puede implementar una función

Para implementar una función, se le debe asignar una función adicional a un usuario al que se le asignó la función de visualizador de proyecto, desarrollador o administrador de Cloud Function.

Mensaje de error

Consola de Cloud

User does not have the iam.serviceAccounts.actAs permission on
<PROJECT_ID>@appspot.gserviceaccount.com required to create function.
You can fix this by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=user: --role=roles/iam.serviceAccountUser'

SDK de Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Forbidden],
message=[Missing necessary permission iam.serviceAccounts.actAs for <USER>
on the service account <PROJECT_ID>@appspot.gserviceaccount.com. Ensure that
service account <PROJECT_ID>@appspot.gserviceaccount.com is a member of the
project <PROJECT_ID>, and then grant <USER> the role 'roles/iam.serviceAccountUser'.
You can do that by running
'gcloud iam service-accounts add-iam-policy-binding <PROJECT_ID>@appspot.gserviceaccount.com --member=<USER> --role=roles/iam.serviceAccountUser'
In case the member is a service account please use the prefix 'serviceAccount:' instead of 'user:'.]

La solución

Asigna al usuario una función adicional, la función de IAM de usuario de cuenta de servicio (roles/iam.serviceAccountUser), orientada a la cuenta de servicio del entorno de ejecución de Cloud Functions.

La cuenta de servicio de implementación no tiene la función de agente de servicios cuando se implementan las funciones

El servicio de Cloud Functions usa la cuenta de servicio del agente de servicios de Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) cuando se realizan acciones administrativas en tu proyecto. De forma predeterminada, a esta cuenta se le asigna la función cloudfunctions.serviceAgent de Cloud Functions. Esta función es obligatoria para las integraciones de Cloud Pub/Sub, IAM, Cloud Storage y Firebase. Si cambiaste la función para esta cuenta de servicio, la implementación fallará.

Mensaje de error

Consola de Cloud

Missing necessary permission resourcemanager.projects.getIamPolicy for
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com on project <PROJECT_ID>.
Please grant serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

SDK de Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=7,
message=Missing necessary permission resourcemanager.projects.getIamPolicy
for serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
on project <PROJECT_ID>. Please grant
serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com
the roles/cloudfunctions.serviceAgent role. You can do that by running
'gcloud projects add-iam-policy-binding <PROJECT_ID> --member=serviceAccount:service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com --role=roles/cloudfunctions.serviceAgent'

La solución

Restablecer esta cuenta de servicio a la función predeterminada

La cuenta de servicio de implementación no tiene permisos de Pub/Sub cuando implementa una función controlada por eventos

El servicio de Cloud Functions usa la cuenta de servicio del agente de servicio de Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) cuando realiza acciones administrativas. De forma predeterminada, a esta cuenta se le asigna la función cloudfunctions.serviceAgent de Cloud Functions. Para implementar funciones controladas por eventos, el servicio de Cloud Functions debe acceder a Cloud Pub/Sub a fin de configurar temas y suscripciones. Si se cambia la función asignada a la cuenta de servicio y no se otorgan los permisos adecuados, el servicio de Cloud Functions no podrá acceder a Cloud Pub/Sub y la implementación fallará.

Mensaje de error

Consola de Cloud

Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

SDK de Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=13,
message=Failed to configure trigger PubSub projects/<PROJECT_ID>/topics/<FUNCTION_NAME>

La solución

Puedes hacer lo siguiente:

No existe una cuenta de servicio del entorno de ejecución predeterminada

Cuando no se especifica una cuenta de servicio del entorno de ejecución administrada por el usuario, las funciones de 1a gen. se establecen de forma predeterminada para usar la cuenta de servicio de App Engine como su cuenta de servicio del entorno de ejecución. Si se borró esta cuenta predeterminada y no se especifica ninguna cuenta administrada por el usuario, las implementaciones fallarán.

Mensaje de error

Consola de Cloud

Default service account '<PROJECT_ID>@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.

SDK de Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account '<PROJECT_ID>@appspot.gserviceaccount.com' doesn't exist. Please recreate this account or specify a different account. Please visit https://cloud.google.com/functions/docs/troubleshooting for in-depth troubleshooting documentation.]

La solución

Durante la implementación de una función, el usuario no tiene los permisos para la cuenta de servicio del entorno de ejecución

En entornos en los que varias funciones acceden a diferentes recursos, es una práctica común usar identidades por función, con cuentas de servicio del entorno de ejecución con nombre en lugar de la cuenta de servicio del entorno de ejecución predeterminada (PROJECT_ID@appspot.gserviceaccount.com).

Sin embargo, para usar una cuenta de servicio del entorno de ejecución que no sea la predeterminada, el implementador debe tener el permiso iam.serviceAccounts.actAs en esa cuenta no predeterminada. Un usuario que crea una cuenta de servicio del entorno de ejecución que no es predeterminada recibe de forma automática este permiso, pero un usuario con los permisos correctos deberá otorgar este permiso a otros implementadores.

Mensaje de error

SDK de Cloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Bad Request],
message=[Invalid function service account requested: <SERVICE_ACCOUNT_NAME@<PROJECT_ID>.iam.gserviceaccount.com]

La solución

Asigna al usuario la función roles/iam.serviceAccountUser en la cuenta de servicio del entorno de ejecución <SERVICE_ACCOUNT_NAME> que no es la opción predeterminada. Esta función incluye el permiso iam.serviceAccounts.actAs.

Cuando se implementa una función, el agente de servicio de Cloud Functions no tiene permisos del bucket del proyecto

Cloud Functions solo se puede activar por eventos desde buckets de Cloud Storage en el mismo proyecto de Google Cloud Platform. Además, la cuenta de servicio del agente de servicio de Cloud Functions (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) necesita una función cloudfunctions.serviceAgent en tu proyecto.

Mensaje de error

Consola de Cloud

Deployment failure: Insufficient permissions to (re)configure a trigger
(permission denied for bucket <BUCKET_ID>). Please, give owner permissions
to the editor role of the bucket and try again.

SDK de Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=7, message=Insufficient
permissions to (re)configure a trigger (permission denied for bucket <BUCKET_ID>).
Please, give owner permissions to the editor role of the bucket and try again.

La solución

Puedes hacer lo siguiente:

  • Restablecer esta cuenta de servicio a la función predeterminada

    o

  • Otorga a la cuenta de servicio del entorno de ejecución la función cloudfunctions.serviceAgent.

    o

  • Otorga los permisos storage.buckets.{get, update} y resourcemanager.projects.get a la cuenta de servicio del entorno de ejecución.

El usuario con la función de editor de proyectos no pueden hacer pública una función

Para garantizar que los desarrolladores no autorizados no puedan modificar la configuración de autenticación para las invocaciones de función, el usuario o servicio que implementa la función debe tener el permiso cloudfunctions.functions.setIamPolicy.

Mensaje de error

SDK de Cloud

ERROR: (gcloud.functions.add-iam-policy-binding) ResponseError: status=[403], code=[Forbidden], message=[Permission 'cloudfunctions.functions.setIamPolicy' denied on resource 'projects/<PROJECT_ID>/locations/<LOCATION>/functions/<FUNCTION_NAME> (or resource may not exist).]

La solución

Puede hacer lo siguiente:

La implementación de la función falla debido a que Cloud Build no admite VPC-SC

Cloud Functions usa Cloud Build para compilar tu código fuente en un contenedor ejecutable. Si quieres usar Cloud Functions con los Controles del servicio de VPC, debes configurar un nivel de acceso para la cuenta de servicio de Cloud Build en el perímetro de servicio.

Mensaje de error

Consola de Cloud

Indica una de las siguientes opciones:

Error in the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

SDK de Cloud

Indica una de las siguientes opciones:

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Error in
the build environment

OR

Unable to build your function due to VPC Service Controls. The Cloud Build
service account associated with this function needs an appropriate access
level on the service perimeter. Please grant access to the Cloud Build
service account: '{PROJECT_NUMBER}@cloudbuild.gserviceaccount.com' by
following the instructions at
https://cloud.google.com/functions/docs/securing/using-vpc-service-controls#grant-build-access"

La solución

Si en la sección de Controles del servicio de VPC de los registros de recursos auditados de tu proyecto se muestra “La política de la organización prohíbe la solicitud” y existe una etiqueta de Cloud Storage, debes otorgar acceso al perímetro de los Controles del servicio de VPC a la cuenta de servicio de Cloud Build.

Debido a que un punto de entrada no se especifica de forma correcta, la implementación de la función falla

Si el punto de entrada al código, es decir, el nombre de la función exportada, no se especifica de forma correcta, la implementación de Cloud Functions puede fallar.

Mensaje de error

Consola de Cloud

Deployment failure: Function failed on loading user code. Error message:
Error: please examine your function logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

SDK de Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. Error message: Please examine your function
logs to see the error cause:
https://cloud.google.com/functions/docs/monitoring/logging#viewing_logs

La solución

El código fuente debe incluir una función de punto de entrada que se haya especificado de forma correcta en la implementación a través de la consola de Cloud o el SDK de Cloud.

La implementación de la función falla cuando se usa la política de la organización de restricción de ubicación de recursos

Si tu organización usa una política de restricción de ubicación de recursos, es posible que veas este error en tus registros. Esto indica que la canalización de implementación no pudo crear un bucket de almacenamiento multirregional.

Mensaje de error

En los registros de Cloud Build:

Token exchange failed for project '<PROJECT_ID>'.
Org Policy Violated: '<REGION>' violates constraint 'constraints/gcp.resourceLocations'

En los registros de Cloud Storage:

<REGION>.artifacts.<PROJECT_ID>.appspot.com` storage bucket could not be created.

La solución

Si usas constraints/gcp.resourceLocations en las restricciones de la política de la organización, debes especificar la ubicación multirregión adecuada. Por ejemplo, si implementas en cualquiera de las regiones us, debes usar us-locations.

Sin embargo, si necesitas un control más detallado y deseas restringir la implementación de funciones en una sola región (no varias regiones), primero crea el bucket multirregional:

  1. Admite toda la multirregión
  2. Implementa una función de prueba
  3. Una vez que la implementación se complete de forma correcta, vuelve a cambiar la política de la organización para permitir solo la región específica.

El bucket de almacenamiento multirregional permanece disponible para esa región, de modo que las implementaciones posteriores pueden realizarse correctamente. Si luego decides agregar a una allowlist una región distinta de la que contiene el bucket de almacenamiento multirregional que se creó, debes repetir el proceso.

La implementación de la función falla mientras se ejecuta el permiso global de la función

Este error indica que hubo un problema con tu código. La canalización de implementación terminó de implementar la función, pero presentó una falla en el último paso. Envía una verificación de estado a la función. Esta verificación de estado tiene como objetivo ejecutar un permiso global de la función, que podría generar una excepción, fallar o agotar el tiempo de espera. El permiso global es donde comúnmente se cargan las bibliotecas y se inicializan los clientes.

Mensaje de error

En los registros de Cloud Logging, haz lo siguiente:

"Function failed on loading user code. This is likely
due to a bug in the user code."

La solución

Para obtener un mensaje de error más detallado, consulta los registros de compilación y los registros del entorno de ejecución de la función. Si no está claro por qué tu función no pudo ejecutar su permiso global, considera trasladar el código de manera temporal a la invocación de la solicitud mediante la inicialización diferida de las variables globales. Esto te permite agregar instrucciones de registro adicionales alrededor de tus bibliotecas cliente, las cuales pueden agotar el tiempo de espera de creación de la instancia (en especial si llaman a otros servicios) o si fallan o arrojan excepciones. Además, puedes intentar aumentar el tiempo de espera de la función.

Crea

Cuando implementas el código fuente de la función en Cloud Functions, esa fuente se almacena en un bucket de Cloud Storage. A continuación, Cloud Build compila el código de forma automática en una imagen de contenedor y envía esa imagen a Container Registry. Cloud Functions accede a esta imagen cuando necesita ejecutar el contenedor para ejecutar la función.

No se pudo completar la compilación debido a que faltan imágenes de Container Registry

Cloud Functions (1ª gen.) usa Container Registry para administrar las imágenes de las funciones. Container Registry usa Cloud Storage para almacenar las capas de las imágenes en buckets llamados STORAGE-REGION.artifacts.PROJECT-ID.appspot.com. Usar la Administración del ciclo de vida de los objetos en estos buckets interrumpe la implementación de las funciones, ya que las implementaciones necesitan que estas imágenes estén presentes.

Mensaje de error

Consola de Cloud

Build failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

SDK de Cloud

ERROR: (gcloud.functions.deploy) OperationError: code=13, message=Build
failed: Build error details not available. Please check the logs at
<CLOUD_CONSOLE_LINK>

CLOUD_CONSOLE_LINK contains an error like below :
failed to get OS from config file for image 'us.gcr.io/<PROJECT_ID>/gcf/us-central1/<UUID>/worker:latest'"

La solución

  1. Inhabilita la administración del ciclo de vida en los buckets que requiere Container Registry.
  2. Borra todas las imágenes de las funciones afectadas. Puedes acceder a los registros de compilación para encontrar las rutas de acceso a las imágenes. Consulta esta secuencia de comandos de referencia para borrar las imágenes de forma masiva. Ten en cuenta que esto no afecta las funciones que se implementan actualmente.
  3. Vuelve a implementar las funciones.

Activo

La fase de entrega también puede ser una fuente de errores.

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

Las funciones de HTTP sin permitir invocaciones no autenticadas habilitaron el acceso restringido a los usuarios finales y las cuentas de servicio que no tienen permisos adecuados. Este mensaje de error indica que el emisor no tiene permiso para invocar la función.

Mensaje de error

Código de respuesta de error HTTP: 403 Prohibido

Cuerpo de respuesta de error HTTP: Error: Prohibido, tu cliente no tiene permiso para obtener la URL /<FUNCTION_NAME> de este servidor.

La solución

Puedes hacer lo siguiente:

  • Vuelve a implementar la función para permitir invocaciones no autenticadas si esto es compatible con tu organización. Esto puede ser útil con fines de prueba.

  • Invoca tu función de HTTP con credenciales de autenticación en el encabezado de tu solicitud. Por ejemplo, puedes obtener un token de identidad a través de gcloud de la siguiente manera:

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

    Consulta Autentica para la invocación

  • Para Cloud Functions (1st gen), permite el acceso público (no autenticado) a todos los usuarios para la función específica.

  • Para Cloud Functions (2nd gen), puedes realizar una de las siguientes acciones:

    • Asigna al usuario el rol de Cloud IAM de invocador de Cloud Functions para la función específica.

    • En la consola de Google Cloud, sigue estos pasos:

      Ir a la consola de Google Cloud

      1. Haz clic en el nombre vinculado de la función a la que deseas otorgar acceso.

      2. Haz clic en el vínculo Powered by Cloud Run en la esquina superior derecha de la página de resumen Detalles de la función.

      3. Haz clic en Activador y selecciona Permitir invocaciones no autenticadas.

      4. Haz clic en Guardar.

Error de permiso de entrega debido a la configuración “permitir solo el tráfico interno”

La configuración de entrada restringe si se puede invocar una función de HTTP con recursos fuera de tu proyecto de Google Cloud o del perímetro del servicio de los Controles del servicio de VPC. Cuando se establece la configuración “Solo tráfico interno” para las redes de entrada, este mensaje de error indica que solo se permiten solicitudes de redes de VPC en el mismo proyecto o perímetro de Controles del servicio de VPC.

Mensaje de error

Código de respuesta de error HTTP: 403 Prohibido

Cuerpo de respuesta de error HTTP: Error 403, 403 (Prohibido). Se trata de un error. El acceso está prohibido. Es lo único que sabemos.

La solución

Puede hacer lo siguiente:

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

    o

  • Cambiar la configuración de entrada a permitir todo el tráfico para la función

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

Para invocar una función de Cloud Functions que se configuró con acceso restringido, se requiere 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 No autorizado

Cuerpo de respuesta de error HTTP: Su cliente no tiene permiso para acceder a la URL solicitada.

La solución

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 ni de actualización. Si generas este token de forma manual con la clave privada de una cuenta de servicio, debes intercambiar el token JWT autofirmado por un token de identidad firmado por Google, en esta guía.

Se intentó invocar la función con curl para redireccionar a la página de acceso de Google

Si intentas invocar una función que no existe, Cloud Functions responde con un redireccionamiento HTTP/2 302 que te lleva a la página de acceso de la Cuenta de Google. Incorrecto. Debería responder con un código de respuesta de error HTTP/2 404. Se está solucionando el problema.

La solución

Asegúrate de especificar el nombre de tu función correctamente. Siempre puedes verificar con gcloud functions call, que muestra el error 404 correcto de una función faltante.

La aplicación y la ejecución de la función fallan

Este error indica que finalizó el proceso que ejecutaba tu función. Por lo general, esto se debe a una falla en el entorno de ejecución debido a problemas en el código de la función. Esto también puede ocurrir cuando un interbloqueo o alguna otra condición en el código de tu función provoca que el entorno de ejecución no responda a las solicitudes entrantes.

Mensaje de error

En registros de Cloud Logging: “La infraestructura no se puede comunicar con la función. Es probable que se haya producido una falla o un interbloqueo en el código proporcionado por el usuario”.

La solución

Los diferentes entornos de ejecución pueden fallar en situaciones diferentes. Para encontrar la causa raíz, muestra registros detallados del nivel de depuración, verifica la lógica de tu aplicación y prueba los casos extremos.

El entorno de ejecución de Python37 de Cloud Functions actualmente tiene una limitación conocida con la frecuencia con la que puede controlar el registro. Es posible que se produzca este error si las instrucciones de registro de una instancia del entorno de ejecución de Python37 están escritas a una tasa lo suficientemente alta. Las versiones del entorno de ejecución de Python >= 3.8 no tienen esta limitación. Recomendamos a los usuarios migrar a una versión superior del entorno de ejecución de Python para evitar este problema.

Si aún no estás seguro de la causa de este error, consulta nuestra página de asistencia.

La función se detiene durante la ejecución o sigue ejecutándose después de que finaliza tu código

Algunos entornos de ejecución de Cloud Functions permiten que los usuarios ejecuten tareas asíncronas. Si la función crea esas tareas, también debe esperar de manera explícita a que se completen. De lo contrario, tu función podría dejar de ejecutarse en el momento incorrecto.

El comportamiento del error

Tu función muestra uno de los siguientes comportamientos:

  • La función finaliza mientras las tareas asíncronas aún se están ejecutando, pero antes de que haya transcurrido el período de tiempo de espera especificado.
  • La función no deja de ejecutarse cuando finalizan estas tareas y continúa ejecutándose hasta que haya transcurrido el tiempo de espera.

La solución

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

  • mostrar un valor
  • resolver o rechazar un objeto Promise que se muestra (solo en funciones de Node.js)
  • generar excepciones o errores no detectados
  • enviar una respuesta HTTP
  • llamar a una función de devolución de llamada

Si tu función no finaliza una vez que se completan todas las tareas asíncronas, debes verificar que la función le indique correctamente a Cloud Functions que se completó. En especial, asegúrate de realizar una de las operaciones enumeradas antes, ya que la función finalizó sus tareas asíncronas.

Pila de JavaScript sin memoria

Para las funciones de Node.js 12+ con límites de memoria superiores a 2 GiB, los usuarios deben configurar NODE_OPTIONS a fin de que tenga max_old_space_size para que el límite de pila de JavaScript sea equivalente al límite de memoria de la función.

Mensaje de error

Consola de Cloud

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory

La solución

Implementa tu función de Node.js 12+ configurando NODE_OPTIONS para que incluya max_old_space_size como el límite de memoria de tu función. Por ejemplo:

gcloud functions deploy envVarMemory \
--runtime nodejs20 \
--set-env-vars NODE_OPTIONS="--max_old_space_size=8192" \
--memory 8Gi \
--trigger-http

Función finalizada

Es posible que veas uno de los siguientes mensajes de error cuando el proceso que ejecuta tu código finalice, ya sea debido a un error en el entorno de ejecución o a una salida intencional. También hay una pequeña posibilidad de que se produzca un error de infraestructura inusual.

Los mensajes de error

Se interrumpió la invocación de la función. Error: Función finalizada. Acción recomendada: Inspecciona los registros para ver el motivo de la finalización. Puedes encontrar información adicional sobre la solución de problemas en Registro.

Solicitud rechazada. Error: Función finalizada. Acción recomendada: Inspecciona los registros para ver el motivo de la finalización. Puedes encontrar información adicional sobre la solución de problemas en Registro.

No se puede inicializar la función. Error: Función finalizada. Acción recomendada: Inspecciona los registros para ver el motivo de la finalización. Puedes encontrar información adicional sobre la solución de problemas en Registro.

La solución

  • En el caso de una función en segundo plano (activada por Pub/Sub), cuando un executionID está asociado con la solicitud que falló, prueba habilitar la opción reintentar en caso de error. Esto permite reintentar la ejecución de la función cuando se genera una excepción que se puede reintentar. Si deseas obtener más información sobre cómo usar esta opción de forma segura, incluidas las mitigaciones para evitar los bucles infinitos de reintentos y administrar los errores recuperables o fatales, consulta Prácticas recomendadas.

  • La actividad en segundo plano (todo lo que suceda después de que finalice tu función) puede causar problemas, por lo que debes revisar el código. Cloud Functions no garantiza ninguna acción que no sea la que se ejecuta durante el período de ejecución de la función, por lo que, incluso si una actividad se ejecuta en segundo plano, el proceso de limpieza puede finalizarla.

  • En los casos en que exista un aumento repentino de tráfico, prueba distribuir la carga de trabajo por un poco más de tiempo. También prueba tus funciones de forma local con Functions Framework antes de implementar en Cloud Functions para asegurarte de que el error no se debe a dependencias faltantes o en conflicto.

Error del entorno de ejecución cuando se accede a recursos protegidos por VPC-SC

De forma predeterminada, Cloud Functions usa direcciones IP públicas para realizar solicitudes salientes a otros servicios. Si tus funciones no están dentro de un perímetro de Controles del servicio de VPC, es posible que reciban respuestas HTTP 403 cuando se intenta acceder a los servicios de Google Cloud protegidos por VPC-SC debido a las denegaciones del perímetro de servicio.

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"
  ...

La solución

Agrega Cloud Functions a tu proyecto de Google Cloud como un recurso protegido en el perímetro de servicio e implementa funciones que cumplan con VPC-SC. Consulta Usa los Controles del servicio de VPC para obtener más información.

Como alternativa, si tu proyecto de Cloud Functions no se puede agregar al perímetro de servicio, consulta Usa los Controles del servicio de VPC con funciones fuera de un perímetro.

Escalabilidad

Pueden surgir problemas de escalamiento relacionados con la infraestructura de Cloud Functions en diversas circunstancias.

Las siguientes condiciones pueden asociarse con errores de escalamiento.

  • Un gran incremento repentino del tráfico.
  • Un tiempo de inicio en frío largo.
  • Un tiempo largo de procesamiento de la solicitud.
  • Tasa alta de errores de función.
  • Se alcanza el límite máximo de instancias y, por lo tanto, el sistema no puede escalar más.
  • Factores transitorios atribuidos al servicio de Cloud Functions.

En cada caso, es posible que Cloud Functions no escale verticalmente con suficiente rapidez como para administrar el tráfico.

Mensaje de error

  • The request was aborted because there was no available instance
    • severity=WARNING (Código de respuesta: 429) Cloud Functions no se puede escalar debido al límite max-instances que estableciste durante la configuración.
    • severity=ERROR (Código de respuesta: 500) Cloud Functions no puede administrar la tasa de tráfico de forma intrínseca.

La solución

  • Para las funciones basadas en activadores HTTP, haz que el cliente implemente una retirada exponencial y vuelva a intentar las solicitudes que no se deben descartar. Si activas Cloud Functions desde Workflows, puedes usar la sintaxis try/retry para lograrlo.
  • Para las funciones en segundo plano o controladas por eventos, Cloud Functions admite la entrega al menos una vez. Incluso sin habilitar explícitamente el reintento, el evento se vuelve a entregar de manera automática y se vuelve a intentar la ejecución de la función. Consulta Reintenta las funciones controladas por eventos para obtener más información.
  • Si la causa raíz del problema es un período de errores transitorios prolongados atribuidos solo a Cloud Functions o si necesitas ayuda con tu problema, comunícate con el equipo de asistencia.

Logging

Configurar el registro para ayudarte a localizar los problemas puede causar otros problemas.

Las entradas de registros no tienen niveles de gravedad de registro, o no son correctos.

De forma predeterminada, Cloud Functions incluye registros sencillos sobre el entorno de ejecución. Los registros escritos en stdout o stderr aparecen de forma automática en la consola de Google Cloud. Sin embargo, estas entradas de registro de forma predeterminada contienen solo mensajes de string simples.

Mensaje de error

No hay niveles de gravedad en los registros o son incorrectos.

La solución

Para incluir la gravedad del registro, debes enviar una entrada de registro estructurada en su lugar.

Controla o registra excepciones diferentes en caso de falla

Te recomendamos que personalices la manera en que administras y registras la información de las fallas.

La solución

Une tu función en un bloque try para personalizar el manejo de excepciones y registrar seguimientos de pila.

Ejemplo


import logging
import traceback
def try_catch_log(wrapped_func):
  def wrapper(*args, **kwargs):
    try:
      response = wrapped_func(*args, **kwargs)
    except Exception:
      # Replace new lines with spaces so as to prevent several entries which
      # would trigger several errors.
      error_message = traceback.format_exc().replace('\n', '  ')
      logging.error(error_message)
      return 'Error';
    return response;
  return wrapper;

#Example hello world function
@try_catch_log
def python_hello_world(request):
  request_args = request.args

  if request_args and 'name' in request_args:
    1 + 's'
  return 'Hello World!'

Registros demasiado grandes en Node.js 10+, Python 3.8, Go 1.13 y Java 11

El tamaño máximo de una entrada de registro normal en estos entornos de ejecución es de 105 KiB.

La solución

Asegúrate de enviar entradas de registro inferiores a este límite.

Cloud Function muestra errores, pero faltan registros

Los registros de Cloud Functions se transmiten a un bucket predeterminado que se crea y habilita cuando se crea un proyecto. Si el bucket predeterminado está inhabilitado o si los registros de Cloud Functions están en el filtro de exclusión, los registros no aparecerán en el Explorador de registros.

La solución

Asegúrate de que los registros predeterminados estén habilitados.

Los registros de Cloud Functions no aparecen en el Explorador de registros

Algunas bibliotecas cliente de Cloud Logging usan un proceso asíncrono para escribir entradas de registro. Si una función falla, o finaliza de alguna otra manera, es posible que algunas entradas de registro aún no se hayan escrito y puedan aparecer más adelante. También es posible que algunos registros se pierdan y no se puedan ver en el Explorador de registros.

La solución

Usa la interfaz de la biblioteca cliente a fin de limpiar las entradas de registro almacenadas en búfer antes de salir de la función o usa la biblioteca para escribir entradas de registro de forma síncrona. También puedes escribir registros de forma síncrona directamente en stdout o stderr.

Los registros de Cloud Functions no aparecen a través del receptor del enrutador de registros

Las entradas de registro se enrutan a distintos destinos mediante receptores del enrutador de registros.

Captura de pantalla del enrutador de registro de Console con los detalles destacados del receptor de vistas

En la configuración, se incluyen los filtros de exclusión, que definen las entradas que se pueden descartar.

Captura de pantalla de la ventana emergente de detalles del receptor del enrutador de registros de Console que muestra el filtro de exclusión

La solución

Asegúrate de que no haya ningún filtro de exclusión establecido para resource.type="cloud_functions"

Conexiones de base de datos

Existen varios problemas que pueden surgir cuando se conecta a una base de datos, muchos de ellos asociados con exceder los límites de conexión o agotar el tiempo de espera. Si ves una advertencia de Cloud SQL en los registros, por ejemplo, "se excedió el plazo del contexto", es posible que debas ajustar la configuración de conexión. Consulta los documentos de Cloud SQL para obtener detalles adicionales.

Herramientas de redes

Conectividad de red

Si todas las solicitudes salientes de una función de Cloud Functions fallan incluso después de establecer la configuración de salida, puedes ejecutar pruebas de conectividad para identificar cualquier problema de conectividad de red subyacente. Para obtener más información, consulta Crea y ejecuta pruebas de conectividad.

El conector de Acceso a VPC sin servidores no está listo o no existe

Si un conector de acceso a VPC sin servidores falla, es posible que no use una máscara de subred /28 dedicada al conector, lo que es obligatorio.

Mensaje de error

VPC connector projects/xxxxx/locations/REGION/connectors/xxxx
is not ready yet or does not exist.

La solución

Enumera tus subredes para verificar si el conector usa una máscara de subred /28.

Si no es así, vuelve a crearlo o crea un conector nuevo para usar una subred /28. Ten en cuenta las siguientes consideraciones:

  • Si vuelves a crear el conector, no necesitas volver a implementar otras funciones. Es posible que experimentes una interrupción de la red mientras se vuelve a crear el conector.

  • Si creas un conector alternativo nuevo, vuelve a implementar las funciones para usar el conector nuevo y, luego, borra el conector original. Este método evita la interrupción de la red.

El tráfico SMTP a direcciones IP de destino externas que usan el puerto TCP 25 está bloqueado

Para mayor seguridad, Google Cloud bloquea las conexiones al puerto de destino TCP 25 cuando envía correos electrónicos desde las funciones.

La solución

Para desbloquear estas conexiones, elige una de las siguientes opciones: