排查 Cloud Functions 问题

本文档介绍您可能会遇到的一些常见问题,以及如何处理这些问题。

部署

部署阶段通常会出现一些问题。您在部署期间可能遇到的许多问题都与角色和权限有关。其他问题与不正确的配置有关。

具有 Viewer 角色的用户无法部署函数

拥有 Project Viewer 或 Cloud Functions Viewer 角色的用户对函数和函数详细信息具有只读权限。这些角色不能部署新函数。

错误消息

Cloud 控制台

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

Cloud SDK

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

解决方案

为用户分配具有相应访问权限的角色。

拥有 Project Viewer 或 Cloud Function 角色的用户无法部署函数

为了部署函数,已拥有 Project Viewer、Cloud Function Developer 或 Cloud Function Admin 角色的用户必须拥有额外的角色。

错误消息

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'

Cloud SDK

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:'.]

解决方案

为用户分配额外角色,即 Service Account User IAM 角色 (roles/iam.serviceAccountUser),并将其范围限定至 Cloud Functions 运行时服务账号

部署函数时,部署服务账号缺少 Service Agent 角色

对您的项目执行管理操作时,Cloud Functions 服务会使用 Cloud Functions Service Agent 服务账号 (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com)。默认情况下,此账号拥有 Cloud Functions cloudfunctions.serviceAgent 角色。Cloud Pub/Sub、IAM、Cloud Storage、Firebase 集成需要此角色。如果您更改了此服务账号的角色,则部署将失败。

错误消息

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'

Cloud SDK

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'

解决方案

将此服务账号重置为默认角色

部署事件驱动的函数时,部署服务账号缺少 Pub/Sub 权限

执行管理操作时,Cloud Functions 服务会使用 Cloud Functions Service Agent 服务账号 (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com)。默认情况下,此账号拥有 Cloud Functions cloudfunctions.serviceAgent 角色。为了部署事件驱动的函数,Cloud Functions 服务必须访问 Cloud Pub/Sub 以配置主题和订阅。如果更改了分配给服务账号的角色,并且没有以其他方式授予适当的权限,则 Cloud Functions 服务将无法访问 Cloud Pub/Sub,并且部署将失败。

错误消息

Cloud 控制台

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

Cloud SDK

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

解决方案

您可以:

默认运行时服务账号不存在

如果未指定用户管理的运行时服务账号,第 1 代函数会默认使用 App Engine 服务账号作为其运行时服务账号。如果此默认账号已被删除并且未指定用户管理的账号,则部署将失败。

错误消息

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.

Cloud SDK

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

解决方案

部署函数时,用户缺少运行时服务账号的权限

在多个函数正在访问不同资源的环境中,通常的做法是使用每个函数身份,并使用命名的运行时服务账号而不是默认的运行时服务账号 (PROJECT_ID@appspot.gserviceaccount.com)。

但是,为了使用非默认运行时服务账号,部署者必须具有该非默认账号的 iam.serviceAccounts.actAs 权限。创建非默认运行时服务账号的用户将自动获得此权限,但其他部署者必须由具有正确权限的用户授予此权限。

错误消息

Cloud SDK

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

解决方案

在非默认运行时服务账号上为用户分配 roles/iam.serviceAccountUser 角色<SERVICE_ACCOUNT_NAME>。此角色包含 iam.serviceAccounts.actAs 权限。

部署函数时,Cloud Functions Service Agent 服务账号缺少项目存储桶权限

Cloud Functions 函数只能由来自同一 Google Cloud Platform 项目中的 Cloud Storage 存储分区的事件触发。此外,Cloud Functions Service Agent 服务账号 (service-<PROJECT_NUMBER>@gcf-admin-robot.iam.gserviceaccount.com) 需要项目的 cloudfunctions.serviceAgent 角色。

错误消息

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.

Cloud SDK

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.

解决方案

您可以:

  • 将此服务账号重置为默认角色

  • 向运行时服务账号授予 cloudfunctions.serviceAgent 角色。

  • 向运行时服务账号授予 storage.buckets.{get, update}resourcemanager.projects.get 权限。

拥有 Project Editor 角色的用户无法公开函数

为确保未经授权的开发者无法修改函数调用的身份验证设置,正在部署该函数的用户或服务必须具有 cloudfunctions.functions.setIamPolicy 权限。

错误消息

Cloud SDK

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

解决方案

您可以:

由于 Cloud Build 不支持 VPC-SC,函数部署失败

Cloud Functions 使用 Cloud Build 将源代码构建到可运行的容器中。如需搭配 VPC Service Controls 使用 Cloud Functions,您必须为服务边界中的 Cloud Build 服务账号配置访问权限级别。

错误消息

Cloud 控制台

以下各项之一:

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"

Cloud SDK

以下各项之一:

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"

解决方案

如果项目的已审核资源日志在 VPC Service Controls 部分中显示“组织的政策禁止请求”,并且包含 Cloud Storage 标签,则您需要向 Cloud Build 服务账号授予对 VPC Service Controls 边界的访问权限

由于指定的入口点不正确,函数部署失败

如果未正确指定代码的入口点(即导出的函数名称),则 Cloud Functions 部署可能会失败。

错误消息

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

Cloud SDK

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

解决方案

您的源代码必须包含通过 Cloud 控制台Cloud SDK 在部署中正确指定的入口点函数。

使用资源位置限制条件组织政策时,函数部署失败

如果您的组织使用资源位置限制条件政策,您可能会在日志中看到此错误。它表示部署流水线未能创建多区域存储分区。

错误消息

在 Cloud Build 日志中:

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

在 Cloud Storage 日志中:

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

解决方案

如果您在组织政策限制条件中使用 constraints/gcp.resourceLocations,则应指定适当的多区域位置。例如,如果您要在任何 us 区域进行部署,则应使用 us-locations

但是,如果您需要进行更精细的控制并且希望将函数部署限制为单个区域(而非多个区域),请先创建多区域存储分区:

  1. 允许整个多区域
  2. 部署测试函数
  3. 部署成功后,恢复组织政策,仅允许特定区域。

该多区域存储分区仍可在该区域中使用,后续部署将会成功。如果您稍后决定 allowlist 创建该多区域存储分区的区域以外的区域,则必须重复此过程。

执行函数的全局范围时函数部署失败

此错误表示您的代码存在问题。部署流水线已完成函数部署,但最后一步完成了,即向该函数发送健康检查。此健康检查用于执行函数的全局范围,这可能会导致异常、崩溃或超时。全局范围是您通常加载的库并初始化客户端的位置。

错误消息

在 Cloud Logging 日志中:

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

解决方案

如需更详细的错误消息,请查看函数的构建日志以及函数的运行时日志。如果不清楚函数为何无法执行其全局范围,请考虑使用全局变量延迟加载,暂时将代码移动到请求调用中。这样,您就可以围绕您的客户端库添加额外的日志语句,这些语句可能会在其实例化时超时(尤其是当调用其他服务时),也可能完全崩溃/抛出异常。此外,您可以尝试增加函数超时。

构建

将函数的源代码部署到 Cloud Functions 时,该源代码存储在 Cloud Storage 存储分区中。然后,Cloud Build 会自动将您的代码构建到容器映像中,并将该映像推送到 Container Registry。当需要运行容器来执行函数时,Cloud Functions 会访问此映像。

由于缺少 Container Registry 映像导致构建失败

Cloud Functions (第 1 代) 使用 Container Registry 管理函数的映像。Container Registry 使用 Cloud Storage 将映像层存储在名为 STORAGE-REGION.artifacts.PROJECT-ID.appspot.com存储桶中。在这些存储分区上使用对象生命周期管理会中断函数的部署,因为部署依赖于这些映像。

错误消息

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

Cloud SDK

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

解决方案

  1. 对 Container Registry 所需的存储桶停用生命周期管理。
  2. 删除受影响的函数的所有映像。您可以访问构建日志以查找映像路径。参考脚本来批量删除映像。请注意,这不会影响当前部署的函数。
  3. 重新部署函数。

服务

服务阶段也可能会产生错误。

由于函数需要身份验证,服务权限出错

未启用允许未经身份验证的调用的 HTTP 函数将会限制没有适当权限的最终用户和服务账号的访问。此错误消息表示调用者无权调用函数。

错误消息

HTTP 错误响应代码:403 禁止

HTTP 错误响应正文:错误:禁止。客户端没有从此服务器获得网址 /<FUNCTION_NAME> 的权限。

解决方案

您可以:

  • 如果您的组织支持此函数,请重新部署您的函数以允许未经身份验证的调用。这对于测试非常有用。

  • 使用请求标头中的身份验证凭据调用 HTTP 函数。例如,您可以通过 gcloud 获取身份令牌,如下所示:

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

    请参阅进行身份验证以进行调用

  • 对于 Cloud Functions 函数(第一代),允许所有用户公开(不进行身份验证)访问特定的函数

  • 对于 Cloud Functions (第 2 代),您可以执行以下任一操作:

    • 为用户分配特定函数的 Cloud Run Invoker Cloud IAM 角色。

    • 在 Google Cloud 控制台中:

      前往 Google Cloud 控制台

      1. 点击您要授予访问权限的函数的链接名称。

      2. 点击函数详细信息概览页面右上角的链接中的由 Cloud Run 提供支持链接。

      3. 点击触发器,然后选择允许未通过身份验证的调用

      4. 点击保存

由于“仅允许内部流量”配置提供服务权限错误

入站流量设置限制是否可以通过您的 Google Cloud 项目或 VPC Service Controls 服务边界之外的资源调用 HTTP 函数。为入站网络配置“仅允许内部流量”设置时,此错误消息表示仅允许来自同一项目或 VPC Service Controls 边界中的 VPC 网络的请求。

错误消息

HTTP 错误响应代码:403 禁止

HTTP 错误响应正文:错误 403(禁止)403。出现错误。 禁止访问。目前无法提供更详细的信息。

解决方案

您可以:

  • 确保请求来自您的 Google Cloud 项目或 VPC Service Controls 服务边界。

  • 将函数的入站流量设置更改为允许所有流量

函数调用缺少有效的身份验证凭据

调用用访问受限设置的 Cloud Functions 函数需要 ID 令牌访问令牌刷新令牌不起作用。

错误消息

HTTP 错误响应代码:401 未授权

HTTP 错误响应正文:您的客户端无权使用请求的网址

解决方案

确保您的请求包含 Authorization: Bearer ID_TOKEN 标头,并且该令牌是 ID 令牌,而不是访问令牌或刷新令牌。如果使用服务账号的私钥手动生成此令牌,您必须按照此指南操作,用自签名 JWT 令牌交换 Google 签名的身份令牌中下载 Google 健身应用。

尝试使用 curl 调用函数时重定向到 Google 登录页面

如果您尝试调用不存在的函数,Cloud Functions 将返回一个 HTTP/2 302 重定向作为响应,这会将您转到 Google 账号登录页面。这是不正确的。它应该返回 HTTP/2 404 错误响应代码。 我们目前正在处理此问题。

解决方案

请务必正确指定函数名称。您可以随时使用 gcloud functions call 进行检查,如果有缺失的函数,它会正确地返回 404 错误。

应用崩溃和函数执行失败

此错误表示运行您的函数的进程已终止。这通常是由于运行时代码因运行时代码崩溃而崩溃。当函数代码中的死锁或一些其他条件导致运行时对传入请求时无响应时,也可能会发生这种情况。

错误消息

在 Cloud Logging 日志中:“基础架构无法与函数通信。用户提供的代码可能发生崩溃或死锁。"

解决方案

不同的运行时可能在不同的场景下崩溃。如需找到根本原因,请输出详细调试级别日志,检查应用逻辑,并测试边缘用例。

Cloud Functions Python37 运行时目前对可以处理日志记录的速率存在已知限制。如果 Python37 运行时实例中的日志语句的写入速率足够高,则可能会出现此错误。Python 运行时版本 >= 3.8 没有此限制。我们建议用户迁移到更高版本的 Python 运行时,以避免此问题。

如果您仍不确定错误原因,请查看我们的支持页面

函数停止执行,或在您的代码完成后继续运行

某些 Cloud Functions 运行时允许用户运行异步任务。如果您的函数创建了此类任务,还必须明确等待这些任务完成。否则,可能会导致您的函数在错误时间停止执行。

错误行为

您的函数具有以下行为之一:

  • 您的函数会在异步任务仍在运行期间,但在指定的超时期限之前终止。
  • 当这些任务完成后,您的函数不会停止运行,会继续运行,直到超时期结束。

解决方案

如果函数提前终止,您应该确保函数的所有异步任务已完成,然后再执行以下任何操作:

  • 返回一个值。
  • 解决或拒绝返回的 Promise 对象(仅限 Node.js 函数)
  • 抛出未捕获的异常和/或错误
  • 发送 HTTP 响应
  • 调用回调函数

如果您的函数在所有异步任务完成后都未能终止,您应在函数运行完成后验证其是否正确发出了 Cloud Functions 函数信号。特别是,确保在函数完成其异步任务之后,立即执行上面列出的操作之一。

JavaScript 堆内存不足

对于内存限制大于 2GiB 的 Node.js 12+ 函数,用户需要将 NODE_OPTIONS 配置为具有 max_old_space_size,以便使 JavaScript 堆限制等同于函数的内存限制。

错误消息

Cloud 控制台

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

解决方案

部署 Node.js 12+ 函数,并配置 NODE_OPTIONS 以将 max_old_space_size 设置为函数的内存上限。例如:

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

函数已终止

当运行代码的进程因运行时错误或有意退出而退出时,您可能会看到以下错误消息之一。还可能出现一种少见的基础架构错误。

错误消息

函数调用中断。错误:函数已终止。建议执行的操作:检查日志以了解终止原因。如需了解其他问题排查信息,请参阅日志记录

已拒绝请求。错误:函数已终止。建议执行的操作:检查日志以了解终止原因。如需了解其他问题排查信息,请参阅日志记录

函数无法初始化。错误:函数已终止。建议执行的操作:检查日志以了解终止原因。如需了解其他问题排查信息,请参阅日志记录

解决方案

  • 对于后台(由 Pub/Sub 触发)函数,当产生错误的请求关联了 executionID,请尝试启用失败时重试。这允许在发生可重试异常时重试函数执行。如需详细了解如何安全地使用此选项(包括用于避免无限重试循环以及以不同方式管理可重试/严重错误的缓解措施),请参阅最佳做法

  • 后台活动(函数终止后发生的任何活动)可能会导致问题,因此请检查您的代码。除了函数执行期间执行的操作之外,Cloud Functions 不保证任何其他操作,因此即使活动在后台运行,它也可能会被清理过程终止。

  • 如果遇到突发的流量高峰,请尝试将工作负载分布到更长的时间段中。在部署到 Cloud Functions 之前,也请使用 Functions 框架在本地测试函数,以确保错误不是由缺失或冲突的依赖项导致的。

访问受 VPC-SC 保护的资源时出现运行时错误

默认情况下,Cloud Functions 使用公共 IP 地址向其他服务发出出站请求。如果您的函数不在 VPC Service Controls 边界内,则在尝试访问受 VPC-SC 保护的 Google Cloud 服务时,可能由于服务边界拒绝而导致收到 HTTP 403 响应。

错误消息

在“已审核的资源”日志中,如下所示的条目:

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

解决方案

将 Google Cloud 项目中的 Cloud Functions 函数添加为服务边界中的受保护资源,并部署符合 VPC-SC 要求的函数。如需了解详情,请参阅使用 VPC Service Controls

或者,如果 Cloud Functions 项目无法添加到服务边界,请参阅将 VPC Service Controls 与边界外的函数搭配使用

可伸缩性

与 Cloud Functions 基础架构相关的扩缩问题可能出现在多种情况下。

以下情况可能与扩缩失败有关。

  • 流量突然激增。
  • 冷启动时间较长。
  • 请求处理时间较长。
  • 函数错误率高。
  • 达到实例数上限,因此系统无法再进一步扩容。
  • 归因于 Cloud Functions 服务的暂时性因素。

在每种情况下,Cloud Functions 扩容速度可能不够快,无法管理流量。

错误消息

  • The request was aborted because there was no available instance
    • severity=WARNING(响应代码:429)由于您在配置期间设置的 max-instances 限制,导致 Cloud Functions 无法扩缩。
    • severity=ERROR(响应代码:500)Cloud Functions 本身无法管理流量速率。

解决方案

  • 对于基于 HTTP 触发器的函数,让客户端对不能丢弃的请求实现指数退避和重试。 如果您要通过 Workflows 触发 Cloud Functions 函数,则可以使用 try/retry 语法来实现此目的。
  • 对于后台/事件驱动型函数,Cloud Functions 支持至少传送一次。即使未明确启用重试功能,事件也将自动重新传送,并且函数执行将重试。如需了解详情,请参阅重试事件驱动的函数
  • 如果问题的根本原因是仅归因于 Cloud Functions 的严重瞬时错误,或者您需要有关问题的帮助,请与支持团队联系。

日志记录

设置日志记录以帮助您跟踪问题自身可能会导致问题。

日志条目没有日志严重级别或具有不正确的日志严重级别

默认情况下,Cloud Functions 包含简单的运行时日志记录功能。写入 stdoutstderr 的日志会自动显示在 Google Cloud 控制台中。但在默认情况下,这些日志条目仅包含简单的字符串消息。

错误消息

日志中没有严重级别或具有错误的严重级别。

解决方案

如需包含日志严重程度,您必须改为发送结构化日志条目

在崩溃时以不同方式处理或记录异常

您可能需要自定义如何管理和记录崩溃信息。

解决方案

try 块中封装您的函数,以自定义处理异常和记录堆栈轨迹。

示例


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!'

Node.js 10+、Python 3.8、Go 1.13 和 Java 11 中的日志太大

这些运行时中常规日志条目的大小上限为 105 KiB。

解决方案

请确保您发送的日志条目未超出此限制。

Cloud Functions 函数返回错误,但缺少日志

Cloud Functions 函数日志会流式传输到创建项目时创建并启用的默认存储桶。如果默认存储桶已停用,或者 Cloud Functions 函数日志在排除项过滤器中,则日志不会显示在 Logs Explorer 中。

解决方案

确保已启用默认日志。

Cloud Functions 日志未显示在日志浏览器中

某些 Cloud Logging 客户端库使用异步过程来写入日志条目。如果函数崩溃或终止,则某些日志条目可能尚未写入,稍后可能会显示。某些日志可能会丢失,也无法在日志浏览器中查看。

解决方案

使用客户端库界面在退出函数之前刷新缓冲的日志条目,或使用库同步写入日志条目。此外,您还可以将日志直接同步写入 stdoutstderr

Cloud Functions 日志未通过日志路由器接收器显示

日志条目使用日志路由器接收器路由到其各个目的地。

控制台日志路由器的屏幕截图,其中突出显示了“查看接收器详情”

设置中包含排除项过滤条件,用于定义只需舍弃的条目。

显示排除项过滤条件的“控制台日志接收器详情”弹出窗口的屏幕截图

解决方案

确保未设置 resource.type="cloud_functions" 的排除项过滤条件

数据库连接

连接到数据库时可能会发生很多问题,这些问题多数都与超出连接限制或超时有关。如果您在日志中看到 Cloud SQL 警告(例如,“已超出上下文截止期限”),则可能需要调整连接配置。如需了解详情,请参阅 Cloud SQL 文档。

网络

网络连接

如果在您配置出站流量设置后,来自 Cloud Functions 函数的所有出站请求都失败,您可以运行 Connectivity Tests 以识别任何潜在的网络连接问题。如需了解详情,请参阅创建和运行 Connectivity Tests

无服务器 VPC 访问通道连接器未就绪或不存在

如果无服务器 VPC 访问通道连接器失败,则它可能未按要求使用专用于连接器的 /28 子网掩码。

错误消息

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

解决方案

列出您的子网,以检查您的连接器是否使用 /28 子网掩码。

如果未使用,请重新创建连接器或创建新连接器以使用 /28 子网。请注意以下几点:

  • 如果您重新创建连接器,则无需重新部署其他函数。在重新创建连接器时,您可能会遇到网络中断。

  • 如果您创建新的备用连接器,请重新部署您的函数以使用新连接器,然后删除原始连接器。此方法可避免网络中断。

使用 TCP 端口 25 的流向外部目标 IP 地址的 SMTP 流量被阻止

为了提高安全性,在从函数发送电子邮件时,Google Cloud 会阻止与 TCP 目标端口 25 的连接。

解决方案

如需取消阻止这些连接,请选择以下选项之一: