Solucionar problemas de Cloud Run Functions (1.ª gen.)

En este documento se explica cómo solucionar mensajes de error y problemas al usar funciones de Cloud Run (1.ª gen.).

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 permisos o con una configuración incorrecta.

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 cambia el rol asignado a la cuenta de servicio y no se actualizan los permisos correspondientes, el servicio Cloud Functions no podrá acceder a Pub/Sub y el despliegue fallará.

Mensaje de error

Consola

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

gcloud

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

Solución

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

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

Si no se especifica una cuenta de servicio gestionada por el usuario, Cloud Run functions (1.ª gen.) usa de forma predeterminada la cuenta de servicio de App Engine. Las implementaciones fallarán si eliminas la cuenta predeterminada sin especificar una cuenta de servicio gestionada por el usuario.

Mensaje de error

gcloud

ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[Default service account 'test-project-356312@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.]

Solución

Para solucionar este problema, sigue una de estas soluciones:

Faltan permisos de usuario para 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. Para que Cloud Functions use una cuenta de servicio de entorno de ejecución, el encargado del despliegue 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 que tenga los permisos correctos.

Un usuario al que se le haya asignado el rol de lector de proyectos, desarrollador de Cloud Functions o administrador de Cloud Functions también debe tener el permiso iam.serviceAccounts.actAs en la cuenta de servicio del entorno de ejecución.

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

Se produce el siguiente error en la cuenta de servicio predeterminada:

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

Se produce el siguiente error en la cuenta de servicio no predeterminada:

ERROR: (gcloud.functions.deploy) ResponseError: status=[403], code=[Ok], message=[Caller USER is missing permission 'iam.serviceaccounts.actAs' on service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. Grant the role 'roles/iam.serviceAccountUser' to the caller on the service account SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com. You can do that by running 'gcloud iam service-accounts add-iam-policy-binding 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 roles/iam.serviceAccountUseren la cuenta de servicio predeterminada o gestionada por el usuario. Este rol incluye el permiso iam.serviceAccounts.actAs.

Faltan permisos de segmento de proyecto en la cuenta de servicio del agente de servicio de funciones de Cloud Run al desplegar una función

Las funciones de Cloud Run solo se pueden activar mediante eventos de segmentos de Cloud Storage del mismo Google Cloud proyecto. 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

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.

gcloud

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.

Solución

Para solucionar este error, restablece la cuenta de servicio del agente de servicio con el rol predeterminado.

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

El rol Editor de proyectos tiene permisos amplios para gestionar recursos en un proyecto, pero no otorga la capacidad de hacer públicas las funciones de Cloud Run. Debes conceder el permiso cloudfunctions.functions.setIamPolicy al usuario o al servicio que despliegue la función.

Mensaje de error

gcloud

 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).]

Solución

Para solucionar este error, siga una de estas soluciones:

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 restringirá la implementación de funciones en las regiones restringidas por la política. En la Google Cloud consola, la región restringida no estará disponible en el menú desplegable de regiones al implementar una función.

Mensaje de error

gcloud

  ERROR: (gcloud.functions.deploy) ResponseError: status=[400], code=[Ok], message=[The request has violated one or more Org Policies. Please refer to the respective violations for more information. violations {
    type: "constraints/gcp.resourceLocations"
    subject: "orgpolicy:projects/PROJECT_ID"
    description: "Constraint constraints/gcp.resourceLocations violated for projects/PROJECT_ID attempting GenerateUploadUrlActionV1 with location set to RESTRICTED_LOCATION. See https://cloud.google.com/resource-manager/docs/organization-policy/org-policy-constraints for more information."
  }

Solución

Añade o quita ubicaciones de las listas allowed_values o denied_values de la 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

Consola

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

gcloud

ERROR: (gcloud.functions.deploy) OperationError: code=3, message=Function
failed on loading user code. This is likely due to a bug in the user code.

En los registros de Cloud Logging:

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

Solución

Para solucionar este problema, sigue una 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, considera la posibilidad de mover temporalmente el código a la invocación de la solicitud y usar 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 (especialmente si llaman a otros servicios), o fallar o generar excepciones por completo.

  • Aumenta el tiempo de espera de la función.

  • 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) PERMISSION_DENIED: Permission
'cloudfunctions.functions.sourceCodeSet' denied on resource
'projects/PROJECT_ID/locations/LOCATION` (or resource may not exist)

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-sources-PROJECT_NUMBER-LOCATION/FUNCTION_NAME/version-VERSION_NUMBER/function-source.zip: Access to bucket gcf-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.

Si visitas la URL de las funciones de Cloud Run en un navegador, no se añade automáticamente un encabezado de autenticació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 error, siga una de estas soluciones:

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

Los ajustes de entrada restringen si una función HTTP puede invocar recursos que estén fuera de tu Google Cloud proyecto o del 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 de VPC del mismo proyecto o perímetro de Controles de Servicio de VPC.

Mensaje de error

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

Cuerpo de la respuesta de error HTTP:

404 Page 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 del 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 puede provocar un error 404 debido a una URL de función, métodos HTTP o errores de lógica incorrectos.

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

Las funciones configuradas con acceso restringido requieren un token de ID. La invocación de funciones falla si usas tokens de acceso o tokens de actualización.

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. Para obtener más información, consulta Autenticación para la invocación.

  • 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 con gcloud de la siguiente manera:

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

    Para obtener más información, consulta Autenticación para la invocación .

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 y 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 de la lista anterior 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. Las funciones que no estén dentro del perímetro de Controles de Servicio de VPC pueden recibir 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

Las siguientes condiciones pueden estar asociadas a errores de escalado.

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.

Cloud Run Functions tiene los siguientes niveles de gravedad:

* `severity=WARNING` ( Response code: 429 ) Cloud Run functions cannot scale due
  to the [`max-instances`](/functions/docs/configuring/max-instances) limit you set
  during configuration.
* `severity=ERROR` ( Response code: 500 ) Cloud Run functions intrinsically
  cannot manage the rate of traffic.

Solución

Almacenamiento de registros

En la siguiente sección se tratan los problemas relacionados con el registro y cómo solucionarlos.

Las entradas de registro no tienen niveles de gravedad o son incorrectos

Cloud Run Functions incluye el registro de tiempo de ejecución de forma predeterminada. Los registros escritos en stdout o stderr aparecen automáticamente en la consolaGoogle Cloud . Sin embargo, estas entradas de registro solo contienen mensajes de cadena de forma predeterminada.

Solución

Para incluir gravedades de registro, debes enviar una entrada de registro estructurada.

Gestionar o registrar excepciones de forma diferente en caso de fallo

Puede que quieras personalizar cómo gestionas y registras la información sobre los fallos.

Solución

Encierra tu función en un bloque try para personalizar la gestión de excepciones y registrar los rastreos de pila.

Si añades un bloque try, se puede producir un efecto secundario no deseado en las funciones basadas en eventos con la configuración retry on failure. Puede que no se puedan volver a intentar los eventos fallidos.

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 tiempos de ejecución es de 105 KiB.

Solución

Envía entradas de registro que no superen este límite.

Faltan registros a pesar de que Cloud Run Functions devuelve errores

Cloud Run Functions transmite los registros de las funciones de Cloud Run a un segmento predeterminado. Cuando creas un proyecto, Cloud Run Functions crea y habilita el bucket predeterminado. Si el bucket predeterminado está inhabilitado o los registros de funciones de Cloud Run están en el filtro de exclusión, los registros no aparecerán en el Explorador de registros.

Solución

Habilita los registros predeterminados y asegúrate de que no haya ningún filtro de exclusión definido.

Los registros de las funciones de Cloud Run no aparecen en el explorador de registros

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

Solución

Usa la interfaz de la biblioteca de cliente para vaciar 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 Run Functions no aparecen al usar un receptor del enrutador de registros

Los sumideros del router de registros enrutan las entradas de registro a varios destinos.

Captura de pantalla de Console Log Router con los detalles del receptor de vista resaltados

Entre los ajustes se incluyen los filtros de exclusión, que definen las entradas que se pueden descartar.

Captura de pantalla del cuadro de diálogo Detalles del sumidero de enrutamiento de registros de la consola que muestra el filtro de exclusión

Solución

Quita el conjunto de filtros de exclusión de resource.type="cloud_functions".

Conexiones de bases de datos

Muchos errores de bases de datos están asociados a la superación de los límites de conexión o al tiempo de espera agotado. Si ves una advertencia de Cloud SQL en tus registros, como Context deadline exceeded, puede que tengas que ajustar la configuración de tu conexión. Para obtener más información, consulta las prácticas recomendadas de Cloud SQL.

Redes

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

Conectividad de red

Si todas las solicitudes salientes de una función de Cloud Run fallan incluso después de configurar los ajustes de salida, puedes ejecutar pruebas de conectividad para identificar cualquier problema de conectividad de red subyacente. Para obtener más información, consulta Crear y ejecutar pruebas de conectividad.

El conector de Acceso a VPC sin servidor no está preparado o no existe

Si falla un conector de acceso a VPC sin servidor, es posible que no esté usando una /28máscara de subred dedicada al conector como obligatorio.

Mensaje de error

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

Cuando se implementan funciones de Cloud Run con un conector en mal estado debido a que falta un permiso en la cuenta de servicio del agente de servicio de las APIs de Google PROJECT_NUMBER@cloudservices.gserviceaccount.com, se produce el siguiente error:

Mensaje de error

Failed to prepare VPC connector. Please try again later.

Solución

Enumera tus subredes para comprobar si tu conector usa una máscara de subred /28. Si tu conector no usa la máscara de subred /28, vuelve a crear el conector o crea uno nuevo.

Para solucionar este problema, sigue una de estas soluciones:

  • Si vuelve a crear el conector, no es necesario que vuelva a implementar otras funciones. Es posible que se produzca una interrupción de la red mientras se vuelve a crear el conector.

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

  • Asegúrate de que las funciones de Cloud Run y su conector asociado se hayan desplegado en la misma región.

  • Para la configuración de la VPC compartida :

    • Asegúrate de que las cuentas de servicio SERVICE_PROJECT_NUMBER@cloudservices.gserviceaccount.com y service-SERVICE_PROJECT_NUMBER@gcp-sa-vpcaccess.iam.gserviceaccount.com que usa el conector VPC para aprovisionar recursos en el proyecto no tengan permisos que falten. Estas cuentas de servicio deben tener el rol roles/compute.networkUser en el proyecto host de la configuración de la VPC compartida cuando el conector esté en el proyecto de servicio. De lo contrario, es obligatorio indicar roles/compute.networkAdmin.

    • Si el conector se crea en el proyecto host, asegúrate de que el rol Serverless VPC Access User esté asignado en Cloud Run functions Service Agent de tu proyecto host.

    • Si el estado del conector muestra un error Connector is in a bad state, manual deletion recommended y el agente de servicio de las APIs de Google no tiene los permisos necesarios para aprovisionar recursos de computación en el proyecto del conector, concede roles/compute.admin a la cuenta de servicio PROJECT_NUMBER@cloudservices.gserviceaccount.com. En algunos casos, es posible que tengas que volver a crear el conector después de actualizar los permisos.

Se bloquea el tráfico SMTP a direcciones IP de destino externas mediante el puerto TCP 25

Para aumentar la seguridad,se Google Cloud bloquean las conexiones al puerto de destino TCP 25 al enviar correos desde funciones de Cloud Run.

Solución

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

Otro

En esta sección se describen los problemas adicionales que no encajan en otras categorías y se ofrecen soluciones para cada uno de ellos.

Error de Controles de Servicio de VPC en el método google.storage.buckets.testIamPermissions de los registros de auditoría de Cloud

Cuando abres la página Detalles de la función en la consolaGoogle Cloud , las funciones de Cloud Run comprueban si puedes modificar el repositorio de almacenamiento de la imagen de contenedor y acceder a él públicamente. Para verificarlo, Cloud Run functions envía una solicitud al contenedor de Container Registry mediante el método google.storage.buckets.testIamPermissions con el siguiente formato: [REGION].artifacts.[PROJECT_ID].appspot.com. La única diferencia entre las comprobaciones es que una se ejecuta con autenticación para verificar los permisos del usuario para modificar el contenedor, mientras que la otra se ejecuta sin autenticación para verificar si el contenedor es accesible públicamente.

Si el perímetro de Controles de Servicio de VPC restringe la API storage.googleapis.com, la consola muestra un error en el método google.storage.buckets.testIamPermissions Google Cloud en los registros de auditoría de Cloud.

Mensaje de error

En el caso de las comprobaciones de acceso público sin información de autenticación, los registros de auditoría de la política de denegación de los CSC de VPC muestran una entrada similar a 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": {},
  "requestMetadata": {
    "callerIp": "END_USER_IP"
  },
  "serviceName": "storage.googleapis.com",
  "methodName": "google.storage.buckets.testIamPermissions",
  "resourceName": "projects/PROJECT_NUMBER",
  "metadata": {
    "ingressViolations": [
      {
        "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
        "targetResource": "projects/PROJECT_NUMBER"
      }
    ],
    "resourceNames": [
      "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com"
    ],
    "securityPolicyInfo": {
      "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
      "organizationId": "ORG_ID"
    },
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
  ...

En el caso del acceso público con información de autenticación, los registros de auditoría de la política de denegación de Controles de Servicio de VPC muestran una entrada que permite al usuario modificar la configuración del cubo, como en el siguiente ejemplo:

"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": "END_USER_EMAIL"
  },
  "requestMetadata": {
    "callerIp": "END_USER_IP",
    "requestAttributes": {},
    "destinationAttributes": {}
  },
  "serviceName": "storage.googleapis.com",
  "methodName": "google.storage.buckets.testIamPermissions",
  "resourceName": "projects/PROJECT_NUMBER",
  "metadata": {
    "ingressViolations": [
      {
        "servicePerimeter": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
        "targetResource": "projects/PROJECT_NUMBER"
      }
    ],
    "resourceNames": [
      "projects/_/buckets/REGION.artifacts.PROJECT_ID.appspot.com"
    ],
    "securityPolicyInfo": {
      "servicePerimeterName": "accessPolicies/ACCESS_POLICY_ID/servicePerimeters/VPC_SC_PERIMETER_NAME",
      "organizationId": "ORG_ID"
    },
    "violationReason": "NO_MATCHING_ACCESS_LEVEL",
  ...

Solución

Si el segmento de Container Registry no es accesible públicamente, puede ignorar los errores de Controles de Servicio de VPC.

También puedes añadir una regla de entrada de Controles de Servicio de VPC para permitir el método google.storage.buckets.testIamPermissions, como se muestra en el siguiente ejemplo:

ingress_from {
  sources {
    access_level: "*"
  }
  identity_type: ANY_IDENTITY
}
ingress_to {
  operations {
    service_name: "storage.googleapis.com"
    method_selectors {
      method: "google.storage.buckets.testIamPermissions"
    }
  }
  resources: "projects/PROJECT_NUMBER"
}

Si es posible, puedes refinar aún más la regla de entrada definiendo el nivel de acceso con las direcciones IP de los usuarios.