本页面介绍了如何排查使用 Cloud Run 时可能遇到的错误。Personalized Service Health 会发布由底层 Google Cloud 基础设施引起的所有 Cloud Run 突发事件,以便识别影响您项目的 Google Cloud 服务中断。您还应考虑针对 Personalized Service Health 事件设置提醒。如需了解影响所有 Google Cloud 服务的突发事件,请参阅 Google Cloud Service Health 信息中心。
您可以在公开问题跟踪器中检查现有问题或提交新问题。
对于本页面中未列出的其他错误消息,请参阅 Cloud Run 中的已知问题。如果您在按照本指南中的步骤操作后仍遇到错误,请与支持团队联系。
如需了解如何解决 Cloud Run 中的问题,请参阅以下部分:
部署错误
本部分介绍 Cloud Run 中的常见部署错误以及问题排查方法。
容器未能启动
尝试部署时发生以下错误:
Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable.
如需解决此问题,请按以下步骤操作:
验证您是否可以在本地运行容器映像。如果您的容器映像无法在本地运行,则需要先在本地诊断并修复问题。
检查容器是否正在监听正确端口上的请求。您的容器必须侦听由 Cloud Run 定义并在
PORT
环境变量中提供的端口上的传入请求。 如需了解如何指定端口,请参阅为服务配置容器检查您的容器是否正在侦听所有网络接口(通常以
0.0.0.0
表示)。 值得注意的是,容器不应监听127.0.0.1
。按照容器运行时合同的要求,验证您的容器映像是否针对 64 位 Linux 进行了编译。
使用 Cloud Logging 查找
stdout
或stderr
日志中的应用错误。您还可以查找 Error Reporting 中捕获的崩溃。您可能需要更新代码或修订版本设置来修复错误或崩溃。您还可以在本地排查服务问题。
容器导入错误
尝试部署时发生以下错误:
The service has encountered an error during container import. Please try again later. Resource readiness deadline exceeded.
如需解决此问题,请按以下步骤操作:
某些基于 Windows 的 Docker 映像使用外部层。Cloud Run 的控制平面不支持外部层。如需解决此问题,请尝试在 Docker 守护程序中设置
--allow-nondistributable-artifacts
标志。
功能不受支持
您调用 Cloud Run Admin API 时发生以下错误:
The feature is not supported in the declared launch stage
如果您直接调用 Cloud Run Admin API 并使用 Beta 版功能但未指定发布阶段注解或字段,则会出现此错误。
使用 v1 或 v2 REST API 时,请参阅以下示例添加启动阶段引用:
使用 JSON 和 v1 REST API 在客户端请求中添加了发布阶段注解:
"annotations": { "run.googleapis.com/launch-stage": "BETA" }
使用 JSON 和 v2 REST API 在客户端请求中添加了 LaunchStage 引用:
"launchStage": "BETA"
使用 YAML 和 v1 REST API 在服务请求中添加了发布阶段注解:
kind: Service metadata: annotations: run.googleapis.com/launch-stage: BETA
未找到用户 root
如果使用 --key
参数指定客户管理的加密密钥,则会发生以下错误:
ERROR: "User \"root\""not found in /etc/passwd
如需解决此问题,请在 Dockerfile 中指定 USER 0
,而不是 USER root
。
默认的 Compute Engine 服务账号已删除
部署期间发生以下错误:
ERROR: (gcloud.run.deploy) User EMAIL_ADDRESS does not have permission to access namespace NAMESPACE_NAME (or it may not exist): Permission 'iam.serviceaccounts.actAs' denied on service account PROJECT_NUMBER-compute@developer.gserviceaccount.com (or it may not exist).
此问题会在以下任一情况下发生:
项目中不存在默认的 Compute Engine 服务账号,并且部署时未使用
--service-account
标志指定服务账号。部署服务的开发者或主账号没有默认的 Compute Engine 服务账号进行部署所需的权限。
要解决此问题,请执行以下操作:
使用
--service-account
标志指定服务账号:gcloud run services update SERVICE_NAME --service-account SERVICE_ACCOUNT
验证您指定的服务账号是否具有部署所需的权限。
如需验证 Google Cloud 项目中是否存在默认的 Compute Engine 服务代理,请按照以下步骤操作:
在 Google Cloud 控制台中,前往 Identity and Access Management 权限页面:
选中包括 Google 提供的角色授权复选框。
在主账号列表中,找到 Compute Engine 服务代理的 ID,该 ID 遵循
PROJECT_NUMBER-compute@developer.gserviceaccount.com
格式。
Cloud Build 服务账号问题
如果 Cloud Build 服务账号没有所需的权限或已停用,则源代码部署期间会发生以下错误:
ERROR: (gcloud.run.deploy) NOT_FOUND: Build failed. The service has encountered an internal error. Please try again later. This command is authenticated as EMAIL_ADDRESS which is the active account specified by the [core/account] property.
Cloud Build 更改了 Cloud Build 在新项目中使用服务账号的默认行为。Cloud Build 默认服务账号更改中详细说明了此更改。由于此更改,首次从源代码部署到 Cloud Run 的新项目可能会使用权限不足的默认 Cloud Build 服务账号从源代码进行部署。
如需解决此问题,请按以下步骤操作:
查看 Cloud Build 指导,了解默认服务账号更改并选择不进行这些更改。
向 build 服务账号授予 Cloud Run Builder (
roles/run.builder
) 角色。
Cloud Run Service Agent 缺少读取映像的权限
如果您尝试使用存储在 Artifact Registry 中的映像从项目进行部署,并且使用其他项目中的 gcr.io
网域,则会发生以下错误:
Google Cloud Run Service Agent must have permission to read the image, gcr.io/PROJECT-ID/IMAGE-NAME. Ensure that the provided container image URL is correct and that above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that PROJECT-ID/IMAGE-NAME is not in project PROJECT-ID-2. Permission must be granted to the Google Cloud Run Service Agent from this project.
如果您尝试使用存储在其他项目的 Artifact Registry 中的映像从项目进行部署,您可能还会看到以下错误:
ERROR: (gcloud.run.deploy) PERMISSION_DENIED: User must have permission to read the image, REGION.pkg.dev/PROJECT_ID/ARTIFACT_REGISTRY_REPO/IMAGE:latest. Ensure that the provided container image URL is correct and that the above account has permission to access the image. If you just enabled the Cloud Run API, the permissions might take a few minutes to propagate. Note that the image is from project PROJECT_ID, which is not the same as this project PROJECT_ID.
如需解决此问题,请按以下问题排查建议执行操作:
按照从其他 Google Cloud 项目部署容器映像中的说明进行操作,确保您的主账号拥有必要的权限。
如果项目位于 VPC Service Controls 边界内,并且 Cloud Storage API 由于存在限制会禁止来自 Cloud Run 服务代理的请求,则也可能会发生此问题。如需修复此问题,请执行以下操作:
在 Google Cloud 控制台中打开 Logs Explorer。(请不要使用 Cloud Run 页面中的日志页面):
在查询字段中输入以下文本:
protoPayload.@type="type.googleapis.com/google.cloud.audit.AuditLog" severity=ERROR protoPayload.status.details.violations.type="VPC_SERVICE_CONTROLS" protoPayload.authenticationInfo.principalEmail="service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com"
如果您在使用此查询后看到任何日志条目,请检查日志条目以确定是否需要更新 VPC Service Controls 政策。 这可能表示您需要将
service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com
添加到预先存在的访问权限政策。
缺少源代码部署的权限
从源代码进行部署时,可能会出现以下错误:
ERROR: (gcloud.run.deploy) EMAIL_ADDRESS does not have permission to access namespaces instance PROJECT_ID (or it may not exist): Google Cloud Run Service Agent does not have permission to get access tokens for the service account SERVICE_ACCOUNT. Please give SERVICE_ACCOUNT permissioniam.serviceAccounts.getAccessToken
on the service account. Alternatively, if the service account is unspecified or in the same project you are deploying in, ensure that the Service Agent is assigned the Google Cloud Run Service Agent roleroles/run.serviceAgent
. This command is authenticated as EMAIL_ADDRESS, which is the active account specified by the [core/account] property.
每个 Cloud Run 服务都与一个服务账号关联,该服务账号充当服务访问其他资源时的身份。该服务账号可以是默认服务账号 (PROJECT_NUMBER-compute@developer.gserviceaccount.com
),也可以是用户管理的服务账号。
在多个服务正在访问不同资源的环境中,您可以使用每个服务的身份,并使用不同的用户管理的服务账号(而不是默认服务账号)。
如需解决此问题,请为部署者账号授予用作服务身份的服务账号的 Service Account User 角色 (roles/iam.serviceAccountUser
)。此预定义角色可提供 iam.serviceAccounts.actAs
权限,在服务或修订版本中关联服务账号需要此权限。创建用户管理的服务账号的用户会自动获得 iam.serviceAccounts.actAs
权限,但其他部署者必须由创建用户管理的服务账号的用户授予此权限。
如需详细了解您创建的任何新服务账号的访问权限要求,请参阅获取创建专用服务账号的建议。
用户没有足够的权限来完成源代码部署
如果部署者账号缺少项目所需的权限,则会发生以下错误:
ERROR: (gcloud.run.deploy) 403 Could not upload file EMAIL_ADDRESS does not havestorage.objects.create
access to the Google Cloud Storage object. Permissionstorage.objects.create
denied on resource (or it may not exist). This command is authenticated as EMAIL_ADDRESS which is the active account.
如需解决此错误,请让您的管理员为您授予以下 Identity and Access Management 角色:
- 针对项目的 Cloud Run Source Developer (
roles/run.sourceDeveloper
)。 - 针对项目的 Service Usage Consumer (
roles/serviceusage.serviceUsageConsumer
)。 - 针对 Cloud Run 服务身份的 Service Account User (
roles/iam.serviceAccountUser
)。如需了解详情,请参阅部署权限。
从其他 Google Cloud 项目部署 Cloud Run 服务时出错
当您将 Cloud Run 服务从源项目部署到目标项目时,会发生以下错误:
Failed to create service. Operation failed due to missing permissions. Google Cloud Run Service Agent does not have permission to get access tokens for the service account SERVICE_ACCOUNT. Please give SERVICE_ACCOUNT permissioniam.serviceAccounts.getAccessToken
on the service account. Alternatively, if the service account is unspecified or in the same project you are deploying in, ensure that the Service Agent is assigned the Google Cloud Run Service Agent roleroles/run.serviceAgent
.
如需解决此问题,请按以下步骤操作:
向目标项目中用作服务身份的服务账号授予 Service Account User (
roles/iam.serviceAccountUser
) 角色。向目标项目中的 Cloud Run 服务账号授予 Service Account Token Creator (
roles/iam.serviceAccountTokenCreator
) 角色。添加 Cloud Run 服务代理邮箱 (service-PROJECT_NUMBER@SERVICE_DOMAIN.iam.gserviceaccount.com
) 作为源项目中的主账号。关闭
iam.disableCrossProjectServiceAccountUsage
组织政策。
如需了解详细说明,请参阅为服务配置服务身份。
将 Python 源代码部署到 Cloud Run 时出错
当您使用 Python 运行时从源代码部署 Cloud Run 服务时,会发生以下错误之一:
Revision REVISION_NAME is not ready and cannot serve traffic. The user provided container failed to start and listen on port defined by PORT=8080 environment variable within the allocated timeout. This can happen if the port is misconfigured or if the timeout is too short. The healthcheck timeout can be extended.
- 部署成功,但日志中显示 HTTP 500 错误代码。
Python Buildpack 会为 Cloud Run 源代码部署设置默认入口点。对于 Python 3.13 版及更高版本,Python Buildpack 会根据 requirements.txt
文件中的 Web 服务配置设置入口点。如果您未在 requirements.txt
文件中指定 Web 服务器或框架,或者使用的是 Python 3.12 版及更低版本,则 Python Buildpack 会将默认入口点设置为 gunicorn -b :8080 main:app
。如需了解详情,请参阅构建 Python 应用。
您可以通过多种方式解决此问题。例如,您可以在 requirements.txt
文件中指定以下 Web 服务器之一:
gunicorn
:# https://pypi.org/project/gunicorn/ gunicorn==21.2.0
fastapi
和uvicorn
:# https://pypi.org/project/fastapi fastapi[standard]==0.116.1 # https://pypi.org/project/uvicorn uvicorn==0.35.0
或者,您也可以按照以下任一步骤操作解决部署错误:
通过运行以下源代码部署命令来指定入口点:
gcloud run deploy SERVICE --source . --set-build-env-vars GOOGLE_ENTRYPOINT="ENTRYPOINT"
替换以下内容:
- SERVICE:您要部署到的服务的名称。
- ENTRYPOINT:您要用于源代码的默认入口点。
使用 Procfile 设置入口点。
传送错误
本部分列出了您可能遇到的传送问题,并提供了有关如何解决这些问题的建议。
HTTP 404:未找到
传送期间出现以下问题:
`HTTP 404`:Not found
在以下情况下,您可能会遇到 HTTP 404
错误:
不正确的请求网址或应用代码会返回
404
错误。如需解决此问题,请按照以下步骤操作:检查您请求的网址是否正确。您可以在 Google Cloud 控制台的服务详情页面中或通过运行以下命令来验证该网址:
gcloud run services describe SERVICE_NAME | grep URL
检查应用返回
404
错误代码的位置。如果应用返回404
,您可以在 Cloud Logging 中找到它。此外,验证应用在本地运行时是否不会返回404
错误代码。确保应用在准备好接收请求之前不会开始监听其已配置的端口。
请求未到达容器,导致在以下情况下出现
404
错误:请求不满足指定的网络限制,尤其是在 Cloud Run 服务的入站流量设置设为内部或内部和 Cloud Load Balancing 时。
Cloud Run 服务的默认
run.app
网址已停用,并且客户端尝试通过该run.app
网址访问服务。
在这两种情况下,即使您应用以下过滤条件,也无法在 Cloud Logging 中找到
404
错误:resource.type="cloud_run_revision" log_name="projects/PROJECT_ID/logs/run.googleapis.com%2Frequests" httpRequest.status=404
如果使用相同的入站流量设置,VPC Service Controls 可能会根据调用者的上下文(包括项目和 IP 地址)来阻止请求。如需检查是否存在 VPC Service Controls 违反政策情况,请执行以下操作:
在 Google Cloud 控制台中打开 Logs Explorer。
在查询字段中输入以下文本:
resource.type="audited_resource" log_name="projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fpolicy" resource.labels.method="run.googleapis.com/HttpIngress"
如果您在使用此查询后看到任何日志条目,请检查日志条目以确定是否需要更新 VPC Service Controls 政策。
使用 Python 运行时通过负载均衡器访问服务端点。如需解决此问题,请验证负载均衡器的网址掩码,并确保您为负载均衡器指定的网址路径与 Python 源代码中的路径匹配。
没有可用的容器实例
传送期间出现以下错误:
HTTP 429 The request was aborted because there was no available instance. The Cloud Run service might have reached its maximum container instance limit or the service was otherwise not able to scale to incoming requests. This might be caused by a sudden increase in traffic, a long container startup time or a long request processing time.
如需解决此问题,请检查服务的容器实例数指标;如果您的用量接近上限,请考虑提高此限制。如需了解详情,请参阅为服务设置实例数上限,如果您需要更多实例,请申请增加配额。
Cloud Run 无法管理流量速率
在服务期间或服务尚未达到其容器实例数上限时,会发生以下错误:
HTTP 500 The request was aborted because there was no available instance
如需解决此问题,请按以下步骤操作:
解决以下可能的根本原因:
- 流量突然激增。
- 冷启动时间较长。
- 请求处理时间较长,或请求处理时间突然增加。
- 服务达到其容器实例数量上限 (
HTTP 429
)。 - 归因于 Cloud Run 服务的暂时性因素。
对客户端不能丢弃的请求实现指数退避算法和重试。仅当您放大到 10 秒的分辨率时,Cloud Monitoring 中才会显示流量或请求处理时间的短暂突然增加。
如果问题的根本原因是仅归因于 Cloud Run 的严重瞬时错误,请与支持团队联系。
操作未实现
如果您在调用 Cloud Run 作业时指定了不正确的 REGION(例如,在区域 asia-southeast1
中部署作业并使用 southeast1-asia
或 asia-southeast
调用作业时),则会出现以下错误:
HTTP 501 Operation is not implemented, or supported, or enabled.
如需查看支持的区域列表,请参阅 Cloud Run 位置。
未找到默认凭证
如果您的应用因缺少文件、凭据路径无效或环境变量分配不正确而未正确进行身份验证,则会发生以下错误:
HTTP 503: System.InvalidOperationException System.InvalidOperationException your Default credentials were not found.
要解决此问题,请执行以下操作:
使用与您的 Google 账号相关联的凭证设置应用默认凭证 (ADC)。使用以下命令配置 ADC:
gcloud auth application-default login
登录屏幕随即出现。在您登录后,您的凭据会存储在 ADC 使用的本地凭据文件中。
使用
GOOGLE_APPLICATION_CREDENTIALS
环境变量提供 Google Cloud 项目中的凭据 JSON 文件的位置。如需了解详情,请参阅设置应用默认凭证。
容器实例超出内存限制
在 Cloud Logging 中,传送期间出现以下 HTTP 500
或 HTTP 503
错误:
While handling this request, the container instance was found to be using too much memory and was terminated. This is likely to cause a new container instance to be used for the next request to this revision. If you see this message frequently, you may have a memory leak in your code or may need more memory. Consider creating a new revision with more memory.
要解决此问题,请执行以下操作:
- 确定容器实例是否超出可用内存。
在
varlog/system
日志中查找相关错误。 - 如果实例超出可用内存,建议提高内存限制。
在 Cloud Run 中,写入本地文件系统的文件会计入可用内存。此外还包括写入 /var/log/*
和 /dev/log
以外的位置的所有日志文件。
由于高并发设置,无法处理某些请求
如果容器实例使用较高的 CPU 负载来处理请求,导致无法处理所有请求,则会发生以下错误:
HTTP 503 The Cloud Run service probably has reached its maximum container instance limit. Consider increasing this limit.
如需解决此问题,请按以下步骤操作:
为您的服务增加容器实例数量上限。
减少服务的并发运行。 如需了解详情,请参阅设置每个实例的并发请求数上限。
与待处理队列请求中止相关的 Cloud Logging 错误
如果 Cloud Run 无法快速扩容来管理流量,则会发生以下错误之一:
-
The request was aborted because there was no available instance:
severity=WARNING
( Response code: 429 ) Cloud Run cannot scale due to themax-instances
limit you set during configuration. -
severity=ERROR
( Response code: 500 ) Cloud Run intrinsically cannot manage the rate of traffic.
如需解决此问题,请按以下步骤操作:
解决可能导致扩缩失败的根本原因,例如:
如需详细了解如何解决扩缩问题和优化性能,请参阅常规开发技巧。
对于基于 HTTP 触发器的服务或函数,让客户端对不能丢弃的请求实现指数退避算法和重试。如果您要从 Workflows 触发服务,可以使用
try/retry
语法来实现此目的。对于后台或事件驱动型服务或函数,Cloud Run 支持至少传送一次。即使未明确启用重试功能,Cloud Run 也会自动重新传送事件并重试执行。如需了解详情,请参阅重试事件驱动型函数。
对于与冷启动相关的问题,请配置实例数下限,以减少冷启动次数,从而降低结算费用。
如果问题的根本原因是仅归因于 Cloud Run 的严重瞬时错误,或者您需要有关问题的帮助,请与支持团队联系。
Google 隐去的身份令牌签名
开发和测试阶段发生以下错误:
SIGNATURE_REMOVED_BY_GOOGLE
此错误可能会在以下情况下发生:
用户使用 Google Cloud CLI 或 Cloud Shell 登录。
用户使用
gcloud
命令生成 ID 令牌。用户尝试使用 ID 令牌调用非公开的 Cloud Run 服务。
这是预期的默认行为。出于安全考虑,Google 会移除令牌签名,以防止任何非公开的 Cloud Run 服务重放以这种方式生成的 ID 令牌。
如需解决此问题,请使用新的 ID 令牌调用专用服务。 如需了解详情,请参阅测试您的专用服务。
日志中的 OpenBLAS 警告
如果您将基于 OpenBLAS 的库(例如 NumPy)与第一代执行环境结合使用,可能会在日志中看到以下警告:
OpenBLAS WARNING - could not determine the L2 cache size on this system, assuming 256k`
如果第一代执行环境使用的容器沙盒未公开低级别的硬件功能,则会出现 OpenBLAS 警告。此警告不会影响您的服务。如需避免 OpenBLAS 警告日志条目,请切换到第二代执行环境。
获取要绑定到的机器的 IP 地址时,Spark 失败
如果 Spark 在获取绑定机器的 IP 地址时失败,则会发生以下错误之一:
assertion failed: Expected hostname (not IP) but got <IPv6 ADDRESS>
assertion failed: Expected hostname or IPv6 IP enclosed in [] but got <IPv6 ADDRESS>
如需解决此问题,请在 Dockerfile 中将 SPARK_LOCAL_IP
环境变量设置为 127.0.0.1
,例如 ENV SPARK_LOCAL_IP="127.0.0.1"
。如果您未设置 SPARK_LOCAL_IP
环境变量,则该变量默认为其 IPv6 对应项,而不是 localhost。此外,Spark 无法识别设置为 RUN export SPARK_LOCAL_IP="127.0.0.1"
的环境变量。
无法使用 NFS 来访问文件
错误 | 建议的补救措施 |
---|---|
mount.nfs: Protocol not supported |
某些基础映像(例如 debian 和 adoptopenjdk/openjdk11 )缺少 nfs-kernel-server 依赖项。 |
mount.nfs: Connection timed out |
如果连接超时,请确保提供 filestore 实例的正确 IP 地址。 |
mount.nfs: access denied by server while mounting IP_ADDRESS:/FILESHARE |
如果服务器拒绝访问,请确保文件共享名称正确无误。 |
无法使用 Cloud Storage FUSE 来访问文件
请参阅 Cloud Storage FUSE 问题排查指南。
CPU 利用率较低时延迟时间较长
即使 Cloud Monitoring 显示平均 CPU 利用率远低于典型的 60% 扩缩目标,您的服务也可能会遇到请求延迟时间较长的问题,或者无法在负载下纵向扩容。
可能原因:
如果您的应用是用单线程处理受限于 CPU 的任务,但部署在具有多个 vCPU 的实例上,则可能会发生这种情况。您的应用可能会使一个 vCPU 核心达到最大利用率,而其他核心则大多处于空闲状态。Cloud Run 自动扩缩器使用所有 vCPU 的平均 CPU 利用率;在这些情况下,此平均值可能较低,从而阻止基于 CPU 的扩缩。
解决方案:
- 对于单线程应用:
- 如果服务的内存要求可以满足,建议为服务配置 1 个 vCPU(请参阅内存限制和 CPU 最小值)。这有助于 CPU 利用率指标准确反映负载。
- 如果由于内存需求较高而需要多个 vCPU(超出 1 个 vCPU 的限制),基于 CPU 的自动扩缩可能效果不佳。在此场景中,降低并发数上限设置,以根据请求吞吐量更快地进行扩缩。请参阅并发配置。
- 对于多 vCPU 配置:请确保您的应用在架构上能够有效利用所有已分配的 vCPU(例如,使用多个工作器进程或线程)。
连接和安全错误
本部分介绍了 Cloud Run 中的常见连接和安全错误以及排查这些错误的方法。
客户端未正确进行身份验证
传送期间出现以下错误:
HTTP 401: The request was not authorized to invoke this service
要解决此问题,请执行以下操作:
如果服务账号调用 Cloud Run 服务,请将 Google 签名的 ID 令牌的目标对象声明 (
aud
) 设置为以下内容:如果您将
aud
设置为接收服务的网址(采用https://SERVICE.run.app
或https://REGION-PROJECT_ID.cloudfunctions.net/FUNCTION
格式),则服务必须要求进行身份验证。使用 Cloud Run 网址或通过负载均衡器网址调用 Cloud Run 服务。如需查看有关发送经过身份验证的请求的示例,请参阅使用 HTTPS 请求进行调用。如果您将
aud
设置为类型为 Web 应用的 OAuth 2.0 客户端 ID,并使用nnn-xyz.apps.googleusercontent.com
格式,则可以通过受 IAP 保护的 HTTPS 负载均衡器调用 Cloud Run 服务。我们建议将此方法用于由不同区域中的多个 Cloud Run 服务提供支持的应用负载均衡器。如果您将
aud
设置为已配置的自定义目标对象,请使用提供的确切值。例如,如果自定义目标对象为https://service.example.com
,则目标对象声明值也必须是https://service.example.com
。
确保您的请求包含
Authorization: Bearer ID_TOKEN
标头或自定义授权的X-Serverless-Authorization: Bearer ID_TOKEN
标头,并且令牌是 ID 令牌,而不是访问令牌或刷新令牌。在以下情况下,由于授权格式不正确,可能会发生401
错误:授权令牌的格式无效。
授权标头不是具有有效签名的 JSON Web 令牌 (JWT)。
授权标头包含多个 JWT。
请求中存在多个授权标头。
如需检查 JWT 上的声明,请使用 jwt.io 工具。
如果您在使用元数据服务器提取 ID 和访问令牌,通过 HTTP 代理对 Cloud Run 服务或作业身份的请求进行身份验证以路由出站流量,但是您获取的令牌无效,请将以下主机添加到 HTTP 代理例外项:
169.254.*
或169.254.0.0/16
*.google.internal
401
错误通常会在 Cloud 客户端库使用元数据服务器提取应用默认凭证来对 REST 或 gRPC 调用进行身份验证时发生。如果您未定义 HTTP 代理例外项,则会发生以下行为:如果不同的 Google Cloud 工作负载托管 Cloud Run 服务或作业和 HTTP 代理,即使 Cloud 客户端库提取凭据,分配给 HTTP 代理工作负载的服务账号也会生成令牌。令牌可能没有执行预期 Google Cloud API 操作所需的权限。这是因为服务账号是从 HTTP 代理工作负载的元数据服务器视图(而不是 Cloud Run 服务或作业)中提取令牌。
如果 HTTP 代理未托管在 Google Cloud中,而您使用该代理路由元数据服务器请求,则令牌请求会失败,并且 Google Cloud API 操作无法进行身份验证。
如果您的组织支持,请重新部署您的服务以允许公开访问。这在测试时非常有用。
客户端无权调用服务
在调用服务时,出现以下错误之一:
HTTP 403: The request was not authenticated. Either allow public access or set the proper Authorization header
HTTP 403: Forbidden: Your client does not have permission to get URL from this server.
如果用于生成授权令牌的 IAM 成员缺少 run.routes.invoke
权限,则可能会发生 403
错误。向生成令牌的用户授予此权限。
此外,如果 Cloud Logging 中存在格式为 resource.type = "cloud_run_revision"
的错误条目,请按照以下步骤解决该错误:
如需让任何人都可以调用服务,请更新 IAM 设置并公开该服务。
如需让服务仅由特定身份调用,请使用适当的授权令牌调用服务:
如果由开发者或最终用户调用服务,请授予
run.routes.invoke
权限。您可以通过 Cloud Run Admin (roles/run.admin
) 和 Cloud Run Invoker (roles/run.invoker
) 角色提供此权限。如果由服务账号调用服务,请确保该服务账号是 Cloud Run 服务的成员,并授予 Cloud Run Invoker (
roles/run.invoker
) 角色。缺少身份验证令牌的调用可能会导致
403
错误。如果使用有效身份验证令牌的调用仍然导致403
错误,请为生成该令牌的 IAM 成员授予run.routes.invoke
权限。
如果您遇到 403
错误,并且找不到日志条目 resource.type = "cloud_run_revision"
,可能是因为 VPC Service Controls 阻止了将入站流量设置配置为 All
的 Cloud Run 服务。如需详细了解如何排查 VPC Service Controls 拒绝问题,请参阅 404 错误。
从网络浏览器访问服务时出错
当您从网络浏览器访问 Cloud Run 服务时,会出现以下问题:
403 Forbidden
Your client does not have permission to get URL from this server.
当您从网络浏览器调用 Cloud Run 服务时,浏览器会向该服务发送 GET
请求。不过,该请求不包含发起调用的用户的授权令牌。如需解决此问题,请按照以下步骤操作:
将 Identity-Aware Proxy (IAP) 与 Cloud Run 搭配使用。IAP 允许您为通过 HTTPS 访问的应用建立中央授权层。借助 IAP,您可以使用应用级访问权限控制模型取代网络级防火墙。如需详细了解如何使用 IAP 配置 Cloud Run,请参阅为 Cloud Run 启用 Identity-Aware Proxy。
临时解决方法是使用 Google Cloud CLI 中的 Cloud Run 代理通过网络浏览器访问服务。如需在本地代理服务,请运行以下命令:
gcloud run services proxy SERVICE --project PROJECT-ID
Cloud Run 会将专用服务代理到
http://localhost:8080
(或使用--port
指定的端口),并提供活跃账号的令牌或您指定的其他令牌。这是在浏览器中对网站或 API 进行非公开测试的推荐方法。 如需了解详情,请参阅测试专用服务。允许公开访问您的服务。这对于测试很有帮助,或者当您的服务是公共 API 或网站时也很有帮助。
对等方重置了连接
当网络中的对等方意外关闭应用建立的 TCP 连接时,会出现以下错误之一:
Connection reset by peer
asyncpg.exceptions.ConnectionDoesNotExistError: connection was closed in the middle of operation
grpc.StatusRuntimeException: UNAVAILABLE: io exception
psycopg.OperationalError: the connection is closed
ECONNRESET
如需解决此问题,请按以下步骤操作:
如果您尝试使用 CPU 节流执行后台工作,请使用基于实例的结算设置。
确保您未超出出站请求超时。如果您的应用在空闲状态下保持任何超出此阈值的连接,则网关需要重新建立连接。
默认情况下,Cloud Run 的 TCP 套接字选项
keepalive
处于停用状态。无法在服务级别直接配置keepalive
选项。如需为每个套接字连接启用keepalive
选项,请在打开新的 TCP 套接字连接时提供所需的套接字选项,具体取决于您在应用中为此连接使用的客户端库。因基础设施更新,出站连接偶尔会重置。如果您的应用重复使用长期有效的连接,我们建议您将应用配置为重新建立连接,以避免重复使用无效连接。
如果您使用 HTTP 代理路由 Cloud Run 服务或作业的出站流量,但代理强制使用连接时长上限,则代理可能会以静默方式丢弃长时间运行的 TCP 连接,例如使用连接池建立的连接。这会导致 HTTP 客户端在重复使用已关闭的连接时出现问题。如果您打算通过 HTTP 代理路由出站流量,则必须实现连接验证、重试和指数退避算法。对于连接池,请为连接存续时间、空闲连接数和连接空闲超时配置最大值。
连接超时
如果应用尝试新建一个与远程主机的 TCP 连接,但建立连接所用的时间过长,则会发生以下错误:
java.io.IOException: Connection timed out
ConnectionError: HTTPSConnectionPool
dial tcp REMOTE_HOST:REMOTE_PORT: i/o timeout / context error
Error: 4 DEADLINE_EXCEEDED: Deadline exceeded
如需解决连接超时问题,请按照以下步骤操作:
如果您要通过 VPC 网络路由所有出站流量(使用 VPC 连接器或使用直接 VPC 出站流量),请按照以下步骤操作:
定义所有必要的防火墙规则来允许 VPC 连接器的入站流量。
VPC 防火墙规则必须允许来自 VPC 连接器或直接 VPC 出站流量子网的入站流量到达目标主机或子网。
确保您拥有能够将流量正确路由到目标主机并返回所需的所有路由。在通过 VPC 网络对等互连或混合云连接路由出站流量时,这一点尤为重要,因为数据包在到达远程主机之前会遍历多个网络。
如果您使用 HTTP 代理路由来自 Cloud Run 服务或作业的所有出站流量,则必须能够使用该代理访问远程主机。
通过 HTTP 代理路由的流量可能会有延迟,具体取决于代理的资源利用率。如果您使用代理路由 HTTP 出站流量,请实现重试、指数退避算法或断路器。
配置 HTTP 代理例外项
使用 HTTP 代理路由 Cloud Run 服务或作业的出站流量时,请为 Cloud API 和其他非代理主机和子网添加例外项,以防止发生延迟、连接超时、连接重置和身份验证错误。
非代理主机和子网必须至少包括以下内容:
127.0.0.1
169.254.*
或169.254.0.0/16
localhost
*.google.internal
*.googleapis.com
(可选)非代理主机可以包括以下各项:
*.appspot.com
*.run.app
*.cloudfunctions.net
*.gateway.dev
*.googleusercontent.com
*.pkg.dev
*.gcr.io
如需为出站流量网络设置 HTTP 代理例外项,请配置以下各项:
- 环境变量:
NO_PROXY
或no_proxy
。 Java 虚拟机标志
http.nonProxyHosts
。未定义系统属性
https.nonProxyHosts
。此系统属性同时适用于 HTTP 和 HTTPS。系统属性
http.nonProxyHosts
不支持 CIDR 表示法;您必须使用模式匹配表达式。
响应格式不正确或容器实例连接出现问题
当容器实例连接出现问题时,会发生以下错误:
HTTP 503 The request failed because either the HTTP response was malformed or connection to the instance had an error.
如需解决此问题,请按以下步骤操作:
在 Cloud Logging 中检查是否存在以下错误:
内存不足错误。如果日志中包含有关容器实例超出内存限制的错误消息,请参阅容器实例超出内存限制部分中的建议。
日志中出现以下错误的活跃探测失败:
LIVENESS HTTP probe failed 1 time consecutively for container CONTAINER_NAME on port 8080. The instance has been shut down.
如果实例未能在超时期限内成功响应探测,请按照以下步骤操作:
启用插桩日志记录和跟踪,以确定延迟时间增加的原因。
如果请求在达到 Cloud Run 中设置的请求超时之前终止并显示错误代码
503
,请更新语言框架的请求超时设置:Node.js 开发者必须通过
server.setTimeout
更新server.timeout
属性(使用server.setTimeout(0)
可实现无限超时),具体取决于您使用的版本。Python 开发者需要更新 Gunicorn 的默认超时 (
[CRITICAL] WORKER TIMEOUT
)。
在某些情况下,
503
错误代码可能是由于下游网络瓶颈导致的,例如在负载测试期间。例如,如果您的服务通过无服务器 VPC 访问通道连接器路由流量,请按照以下步骤操作,确保该连接器不会超过其吞吐量阈值:在 Google Cloud 控制台中打开无服务器 VPC 访问通道:
检查吞吐量图表直方图中是否有任何红色的条形。如果存在红色条形,请考虑增加连接器使用的实例数上限或更改实例类型。或者,压缩通过无服务器 VPC 访问通道连接器发送的流量。
如果容器实例每秒接收的请求数超过 800 个,则可用的 TCP 套接字可能会用尽。如需解决此问题,请为服务启用 HTTP/2,并对服务进行所需的更改以支持 HTTP/2。
网关超时错误
如果服务未在指定的时间内返回响应,导致请求结束,则会发生以下错误:
HTTP 504 The request has been terminated because it has reached the maximum request timeout.
如需详细了解此错误,请参阅容器运行时合同。
如需排查此问题,请按照以下步骤操作:
如果服务正在处理长时间运行的请求,请增加请求超时。
执行日志记录和跟踪操作,以了解您的应用在超过配置的请求超时之前将时间花在哪里。
由于基础设施更新,出站连接偶尔会重置。如果您的应用重复使用长期有效的连接,我们建议您将应用配置为重新建立连接,以避免重复使用无效连接。
根据应用的逻辑或错误处理,
504
错误可能表示应用正在尝试重复使用无效连接,请求会被阻止,直到配置的请求超时为止。 使用活跃性探测来终止返回永久性错误的实例。应用代码内部发生的内存不足错误(例如
java.lang.OutOfMemoryError
)不一定会终止容器实例。如果内存用量未超过容器内存限制,则 Cloud Run 不会终止实例。根据应用处理应用级内存不足错误的方式,请求可能不会完成,直到超出配置的请求超时为止。如需终止容器实例,请按照以下步骤操作:
将应用级内存限制配置为大于容器内存限制。
使用活跃探测来帮助终止返回永久性错误的实例。
自定义网域在预配证书时卡住
The domain is available over HTTP. Waiting for certificate provisioning. You must configure your DNS records for certificate issuance to begin and to accept HTTP traffic.
Waiting for certificate provisioning. You must configure your DNS records for certificate issuance to begin.
要解决此问题,请执行以下操作:
至少等待 24 小时。预配 SSL 证书通常需要大约 15 分钟,但最多可能需要 24 小时。
使用 Google 管理员工具箱 Dig 工具验证您是否在域名注册商处正确更新了 DNS 记录。域名注册商中的 DNS 记录必须与Google Cloud 控制台提示您添加的记录匹配。
使用以下方法之一在您的账号下验证网域的根目录:
按照添加经过验证的域名所有者的说明操作,并检查您的账号是否已列为经验证所有者。
使用 Search Console。
验证网域的证书是否未过期。如需查看到期时间,请使用以下命令:
echo | openssl s_client -servername 'ROOT_DOMAIN' -connect 'ROOT_DOMAIN:443' 2>/dev/null | openssl x509 -startdate -enddate -noout
客户端断开连接未传播到 Cloud Run
在 Cloud Run 上使用 HTTP/1.1 时,客户端断开连接事件不会传播到 Cloud Run 容器。
如需解决此问题,请使用 Websocket 或 HTTP/2.0,它们可以传播客户端断开连接。