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

En este documento, se muestra cómo solucionar problemas de mensajes de error y resolver los inconvenientes que surgen cuando usas Cloud Run Functions (1ª gen.).

Implementación

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

La cuenta de servicio de implementación no tiene permisos de Pub/Sub cuando se 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 el rol cloudfunctions.serviceAgent de Cloud Functions. Para implementar funciones controladas por eventos, el servicio de Cloud Functions debe acceder a Pub/Sub para configurar temas y suscripciones. Si se cambia el rol asignado a la cuenta de servicio y no se actualizan los permisos adecuados, el servicio de Cloud Functions no podrá acceder a Pub/Sub y la implementación fallará.

El 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

La solución

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

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

Cuando no se especifica una cuenta de servicio administrada por el usuario, Cloud Run Functions (1ª gen.) usa la cuenta de servicio de App Engine de forma predeterminada. Las implementaciones fallan si borras la cuenta predeterminada sin especificar una cuenta de servicio administrada por el usuario.

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

La solución

Para resolver este problema, sigue cualquiera de estas soluciones:

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

Cada función está asociada con una cuenta de servicio que funciona como su identidad cuando la función accede a otros recursos. Esta cuenta de servicio del entorno de ejecución puede ser la predeterminada o una administrada por el usuario. Para que Cloud Functions use una cuenta de servicio del entorno de ejecución, el implementador debe tener el permiso iam.serviceAccounts.actAs en esa cuenta de servicio. 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 otros implementadores necesitan que un usuario les otorgue los permisos correctos.

Además, a un usuario al que se le designó el rol de visualizador de proyectos, desarrollador o administrador de Cloud Functions se le debe asignar el permiso iam.serviceAccounts.actAs en la cuenta de servicio del entorno de ejecución.

El 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 para 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 para 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:'.

La solución

Asigna al usuario el rol roles/iam.serviceAccountUser en la cuenta de servicio predeterminada o administrada por el usuario. Este rol incluye el permiso iam.serviceAccounts.actAs.

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

Cloud Run Functions solo se puede activar por eventos desde los buckets de Cloud Storage en el mismo proyecto de Google Cloud . Además, la cuenta de servicio del agente de servicio de Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com) necesita un rol cloudfunctions.serviceAgent en tu proyecto.

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

La solución

Para resolver este error, restablece la cuenta de servicio del agente de servicio al rol predeterminado.

El usuario con el rol de editor de proyectos no puede hacer pública una función

El rol de editor de proyectos tiene permisos amplios para administrar recursos dentro de un proyecto, pero no otorga de forma inherente la capacidad de hacer que las funciones de Cloud Run sean públicas. Debes otorgar el permiso cloudfunctions.functions.setIamPolicy al usuario o servicio que implementa la función.

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

La solución

Para resolver este error, sigue cualquiera de estas soluciones:

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

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

La solución

Agrega 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 de forma correcta.

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: enviar 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 se suelen cargar las bibliotecas y se inicializan los clientes.

El 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 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 resolver este problema, sigue cualquiera de estas soluciones:

  • Para obtener un mensaje de error más detallado, revisa los registros de compilació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 con la inicialización diferida de las variables globales. Esto te permite agregar instrucciones de registro adicionales alrededor de tus bibliotecas cliente, las cuales podrían estar agotando el tiempo de espera de creación de instancias (en especial, si llaman a otros servicios) o fallando o arrojando excepciones.

  • Aumenta el tiempo de espera de la funció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 o gcloud.

El usuario con el rol de visualizador no puede implementar una función

Los usuarios con el rol de visualizador de proyectos o visualizador de Cloud Functions tienen acceso de solo lectura a las funciones y a los detalles de estas, y no pueden implementar funciones nuevas. La función Crear función está inhabilitada en la consola de Google Cloud con el siguiente error:

El 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)

La solución

Asigna al usuario el rol de desarrollador de Cloud Functions.

Faltan permisos de la cuenta de servicio de compilación

El mensaje de error

En el error de implementación de la función o en los registros de compilación, es posible 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.

La solución

La cuenta de servicio de compilación necesita permiso para leer desde el bucket de origen y permisos de lectura y escritura para el repositorio de Artifact Deployment. Es posible que encuentres este error debido a un cambio en el comportamiento predeterminado de la forma en que Cloud Build usa las cuentas de servicio, que se detalla en Cambio de cuenta de servicio de Cloud Build.

Para resolver este problema, usa cualquiera de estas soluciones:

Cuenta de servicio de compilación inhabilitada

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

La solución

La cuenta de servicio de compilación debe estar habilitada para implementar una función. Es posible que encuentres este error debido a un cambio en el comportamiento predeterminado de la forma en que Cloud Build usa las cuentas de servicio, que se detalla en Cambio de cuenta de servicio de Cloud Build.

Para resolver este problema, usa cualquiera de estas soluciones:

Entrega

En esta sección, se enumeran los errores de entrega que puedes encontrar y se proporcionan sugerencias para solucionarlos.

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

Las funciones de HTTP sin la opción Permitir invocaciones no autenticadas habilitada restringen el acceso a los usuarios finales y las cuentas de servicio que no tienen permisos adecuados.

Cuando visitas la URL de Cloud Run Functions en un navegador, no se agrega de forma automática un encabezado de autenticación.

El mensaje de error

Código de respuesta de error de HTTP: 403 (Prohibido)

Cuerpo de la respuesta de error de HTTP:

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

La solución

Para resolver este error, sigue cualquiera de estas soluciones:

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

Los parámetros de configuración de entrada restringen si se puede invocar una función de HTTP con recursos fuera de tu proyecto de Google Cloud o del perímetro de servicio de los Controles del servicio de VPC. Cuando configuras la opción Permitir solo el 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 los Controles del servicio de VPC.

El mensaje de error

Código de respuesta de error de HTTP: 404 (No encontrado)

Cuerpo de la respuesta de error de HTTP:

404 Page not found

La solución

Para resolver este error, sigue cualquiera de estas soluciones:

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

  • Cambia los parámetros de configuración de entrada a Permitir todo el tráfico para la función.

  • El código fuente de Cloud Run Functions puede generar un error 404 debido a problemas de una URL de la función incorrecta, métodos HTTP o errores de lógica.

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.

El mensaje de error

Código de respuesta de error de HTTP: 401 (No autorizado)

Cuerpo de la respuesta de error de HTTP:

Your client does not have permission to the requested URL </FUNCTION_NAME>

La solución

Para resolver este error, sigue cualquiera de estas soluciones:

  • Asegúrate de que tus solicitudes incluyan un encabezado Authorization: Bearer ID_TOKEN y de que el token sea de ID, no uno 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 uno de identidad firmado por Google. Para obtener más información, consulta Autentica para la invocación.

  • 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 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 Autentica para la invocación.

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 Run 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 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 que la función realice alguna de las siguientes acciones:

  • Devolver un valor
  • Resolver o rechazar un objeto Promise que se devuelve (solo en funciones de Node.js)
  • Arrojar excepciones y errores inadvertidos
  • Enviar una respuesta HTTP
  • Llamar a una función de devolución de llamada

Si la función no finaliza después de completar tareas asíncronas, debes verificar que la función le indique de forma correcta a Cloud Run Functions que se completó. En especial, asegúrate de realizar una de las operaciones enumeradas en la lista anterior en cuanto la función haya terminado sus tareas asíncronas.

Error del entorno de ejecución cuando se accede a recursos protegidos por los Controles del servicio de VPC

De forma predeterminada, Cloud Run Functions usa direcciones IP públicas para realizar solicitudes salientes a otros servicios. Es posible que las funciones que no se encuentran dentro del perímetro de los Controles del servicio de VPC reciban respuestas HTTP 403 cuando se intenta acceder a los servicios de Google Cloud protegidos por estos controles. Esto se debe a las denegaciones del perímetro de servicio.

El mensaje de error

En los registros de recursos auditados, se muestra 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

Para resolver este error, sigue cualquiera de estas soluciones:

Escalabilidad

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

Errores de Cloud Logging relacionados con la anulación de solicitudes pendientes en cola

Las siguientes condiciones pueden asociarse con errores de escalamiento.

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

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

La solución

Registros

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

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

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

La solución

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

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

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

Agregar un bloque try puede generar un efecto secundario no deseado en las funciones controladas por eventos con la configuración retry on failure. Reintentar los eventos con errores puede fallar.

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

Envía entradas de registro inferiores a este límite.

Faltan registros a pesar de que Cloud Run Functions devuelva errores

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

La solución

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

Los registros de Cloud Run 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, en caso contrario, finaliza, 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 para 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 Run Functions no aparecen cuando se usa el receptor del router de registros

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

Captura de pantalla del router de registros de la consola 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 los detalles del receptor del router de registros de la consola que muestra el filtro de exclusión

La solución

Quita el filtro de exclusión establecido para resource.type="cloud_functions".

Conexiones de base de datos

Muchos errores de base de datos están 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, Context deadline exceeded), es posible que debas ajustar la configuración de 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 proporcionan sugerencias para solucionarlos.

Conectividad de red

Si todas las solicitudes salientes de una función de Cloud Run fallan, incluso después de establecer los parámetros de configuración de salida, puedes ejecutar las 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 esté usando una máscara de subred /28 dedicada al conector, lo que es obligatorio.

El mensaje de error

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

Cuando Cloud Run Functions se implementa con un conector en mal estado debido a que falta el 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:

El mensaje de error

Failed to prepare VPC connector. Please try again later.

La solución

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

Para resolver este problema, sigue cualquiera de estas soluciones:

  • 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 original. Este método evita la interrupción de la red.

  • Asegúrate de que Cloud Run Functions y su conector asociado se implementen en la misma región.

  • Para la configuración de la VPC compartida, haz lo siguiente:

    • 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 de VPC para aprovisionar recursos en el proyecto no tengan permisos faltantes. Estas cuentas de servicio deben tener el rol roles/compute.networkUser en el proyecto host de la configuración de VPC compartida cuando el conector está en el proyecto de servicio. De lo contrario, se requiere roles/compute.networkAdmin.

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

    • Si el estado del conector muestra un error Connector is in a bad state, manual deletion recommended y al Agente de servicio de las APIs de Google le faltan los permisos necesarios para aprovisionar recursos de procesamiento en el proyecto del conector, otorga roles/compute.admin a la cuenta de servicio PROJECT_NUMBER@cloudservices.gserviceaccount.com. En algunos casos, es posible que debas volver a crear el conector después de actualizar los permisos.

El tráfico de 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 Cloud Run Functions.

La solución

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

Otro

En esta sección, se describen los problemas adicionales que no se ajustan a otras categorías y se ofrecen soluciones para cada uno.

Error de los Controles del servicio de VPC en el método google.storage.buckets.testIamPermissions en los Registros de auditoría de Cloud

Cuando abres la página Detalles de la función en la consola deGoogle Cloud , Cloud Run Functions verifica si puedes modificar el repositorio de almacenamiento de la imagen del contenedor y acceder a él de forma pública. Para hacerlo, Cloud Run Functions envía una solicitud al bucket de Container Registry con el método google.storage.buckets.testIamPermissions con el siguiente formato: [REGION].artifacts.[PROJECT_ID].appspot.com. La única diferencia entre las verificaciones es que una se ejecuta con autenticación para comprobar los permisos del usuario y, así, modificar el bucket, mientras que la otra se ejecuta sin autenticación para verificar si el bucket es de acceso público.

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

El mensaje de error

Para la verificación de acceso público sin información de autenticación, los registros de auditoría de la Política de denegación de VPC SC 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",
  ...

Para la verificación de acceso público con información de autenticación, los registros de auditoría de la Política de denegación de VPC SC muestran una entrada que le permite al usuario modificar la configuración del bucket de manera similar al 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",
  ...

La solución

Si no se puede acceder de forma pública al bucket de Container Registry, puedes ignorar los errores de los Controles del servicio de VPC.

Como alternativa, puedes agregar una regla de entrada de los Controles del 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"
}

Cuando sea posible, puedes definir mejor la regla de entrada; para ello, define el nivel de acceso con las direcciones IP de los usuarios.