本页介绍了 App Engine 中的常见应用初始化和服务错误以及排查这些错误的方法。
使用默认服务账号创建应用时出现权限错误
首次启用 App Engine API 后创建应用时,应用可能会因以下错误而失败:
gcloud CLI
An internal error occurred while calling service consumer manager for service account.
Creating App Engine application in projectPROJECT and REGION....failed. DEBUG: (gcloud.app.create) Error Response: [13] an internal error has occurred
请求日志
Service account creation is not allowed on this project.
控制台
Error while initialising App Engine.
此错误可能是由于在创建应用时强制执行组织政策限制条件 constraints/iam.disableServiceAccountCreation
而导致的。此政策会阻止预配 App Engine 默认服务账号 PROJECT_ID@appspot.gserviceaccount.com
。
如需解决此问题,您必须暂时移除组织政策限制条件 constraints/iam.disableServiceAccountCreation
,以便创建和部署 App Engine 默认服务账号。该默认服务账号是创建应用所必需的,无法跳过。在使用版本级服务账号时,此方法同样适用。您可以删除 App Engine 默认服务账号,或将其替换为成功部署后创建的服务账号。
如果您使用的是自己创建的服务账号,请查看角色建议概览以了解如何强制限制权限,例如针对该服务账号提供为服务代理创建的令牌创建者角色。
应用未提供最新的代码更改
如果您的应用在部署后未提供最新的代码更改,您可以使用容器的根文件系统检查内容。以下问题排查步骤展示了如何提取容器映像并导出根文件系统以进行进一步分析:
使用 Cloud Logging 通过过滤条件
GAE_FULL_APP_CONTAINER
获取容器映像网址。应用过滤条件后,Cloud Logging 会显示包含完全限定域名 (FQDN) 的容器映像网址。例如GAE_FULL_APP_CONTAINER: FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST
。运行以下命令以导出容器映像网址:
export IMAGE_URL='FQDN/PROJECT_ID/appengine/SERVICE_NAME.VERSION_ID@sha256:SHA256_DIGEST'
您需要进行如下替换:
- 将 FQDN 替换为容器映像网址的完全限定域名。
- PROJECT_ID 替换为 Google Cloud 项目的项目 ID。
- 将 SERVICE_NAME 替换为您的服务名称。
- 将 VERSION_ID 替换为服务的版本 ID。
- SHA256_DIGEST 替换为 SHA256 值。
使用容器映像网址创建一个新容器:
docker pull ${IMAGE_URL} export CONTAINER_ID=$(docker create ${IMAGE_URL}) docker ps -a # the list should contain the newly created container with status `Created`
导出容器映像的根文件系统 (
rootfs
):docker export ${CONTAINER_ID} -o gae_app.tar mkdir gae_app mv -v gae_app.tar gae_app/ cd gae_app/ tar -xf gae_app.tar ls -la # inspect the container FS
或者,如果您不需要
TAR
文件,请运行以下命令:mkdir gae_app cd gae_app/ docker export ${CONTAINER_ID} | tar -xC <dest> ls -la # inspect the container FS
分析根文件系统的内容,以验证是否存在最新的代码更改。
运行以下命令以清理映像:
docker container rm ${CONTAINER_ID} docker image rm ${IMAGE_URL} unset IMAGE_URL CONTAINER_ID
Nginx 无法连接到应用容器或与之进行通信
以下错误仅发生在 App Engine 柔性环境中,通常会在发生错误后立即返回 502 错误:
recv() failed (104: Connection reset by peer) while reading response header from upstream
此错误表示 nginx 反向代理 (nginx sidecar) 无法访问应用容器。在日志中,您可以将 nginx 日志中的 502 错误的关闭时间与 nginx.error 日志中的时间进行比较。在发生 nginx.error 错误后紧接着发生 502 nginx 错误可能是导致发生 nginx 502 错误的原因。
当应用的连接 keepalive 超时小于 nginx 的 keepalive 超时时,通常会发生此错误。由于 App Engine 柔性环境中的 nginx 的 keepalive_timeout
为 650 秒,因此应用需要使连接至少在此时间中保持活动状态。默认情况下,Node.js 应用的 keepAliveTimeout
为 5000 毫秒。在这种情况下,您可以将 server.keepAliveTimeout
设置为 700000 毫秒。
如需排查问题,请连接到虚拟机实例以检查应用容器中运行的代码写入的日志,并在必要时添加更多日志记录以找到根本原因。
内存不足
App Engine 柔性环境中会发生以下内存不足错误,并且通常返回 502 错误:
kernel: [ 133.706951] Out of memory: Kill process 4490 (java) score 878 or sacrifice child
kernel: [ 133.714468] Killed process 4306 (java) total-vm:5332376kB, anon-rss:2712108kB, file-rss:0kB
此错误表示 App Engine 已终止应用。
当实例的内存不足时,会发生此错误。默认情况下,App Engine 柔性环境具有 1GB 内存,并且仅 600MB 内存可用于应用容器。
如需进行问题排查,请检查日志是否存在“内存不足”条目,更新 app.yaml
文件中的 memory_gb
配置,然后重新部署。
开放的连接数不足,无法处理传入请求
如果等待连接数上限等于或大于活跃连接数的 75%,则应用可能会出现 502 错误。
如需解决此问题,请检查 Cloud Monitoring 指标,查看活跃连接数和等待连接数上限,并减少等待连接数以确保等待连接数上限小于或等于活跃连接数的 75%。