排查 App Engine 中的部署问题

多种因素都可能会导致 App Engine 中出现部署错误,包括缺少权限、组织政策更改以及应用配置问题。

本页介绍了 App Engine 中的以下常见部署错误以及排查这些错误的方法:

权限错误

本部分介绍了您在部署应用时可能会因账号权限缺失或组织政策发生变化而遇到的错误。

如需确定您用于访问 Google Cloud 平台中的 Google Cloud CLI 和其他工具的有效账号,请执行以下任一操作:

  • 如果您使用 Google Cloud CLI 进行部署,请运行 gcloud auth list 命令。

  • 如果您从 IDE 部署,请查看 Cloud Tools 插件的设置。

如需了解在某些情况下仅分配 App Engine Deployer (roles/appengine.deployer) 角色可能不够的原因,请参阅 App Engine 角色

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限

新项目部署失败

在新项目中首次部署应用时,您可能会看到以下错误:

ERROR: (gcloud.app.deploy) Error Response: [13] Failed to create cloud build: com.google.net.rpc3.client.RpcClientException:..........invalid bucket "staging.PROJECT_ID.appspot.com"; service account PROJECT_ID@appspot.gserviceaccount.com does not have access to the bucket

如需解决此问题,请向默认服务账号授予 Storage Admin (roles/storage.admin) 角色。如需了解详情,请参阅将构建日志存储在用户创建的存储桶中

如果您已授予 Storage Admin 角色,并且根据部署期间遇到的不同权限错误授予了其他必需角色,但仍无法部署应用,则可能是因为以下组织政策更改导致:

  • 自 2024 年 5 月起, Google Cloud 对所有组织资源强制执行从设计上保证安全的组织政策。此政策会阻止 App Engine 向 App Engine 默认服务账号授予 Editor 角色。

  • 2024 年 6 月,Cloud Build 更改了 Cloud Build 在新项目中使用服务账号的默认行为。Cloud Build 服务账号中详细说明了此更改。由于此更改,首次部署版本的新项目可能会使用权限不足的默认 App Engine 服务账号来部署版本。

如需解决此问题,请执行以下操作:

  • Editor 角色授予 App Engine 默认服务账号 (PROJECT_ID@appspot.gserviceaccount.com)。

  • 查看 Cloud Build 指导,了解默认服务账号的更改并停用新项目中的默认更改

调用者无权访问项目

如果服务账号无权在当前项目中部署应用,则会发生以下错误:

User EMAIL_ADDRESS does not have permission to access project PROJECT_ID (or it may not exist).

如需解决此问题,请向服务账号授予 App Engine Deployer (roles/appengine.deployer) 角色

无法从注册表提取元数据

如果您通过没有 Storage Admin (roles/storage.admin) 角色的服务账号使用 gcloud app deploy 命令,则会发生以下错误:

Failed to fetch metadata from the registry, with reason: generic::permission_denied

如需解决此问题,请向服务账号授予 Storage Admin 角色。

服务账号必须具备映像的权限

部署应用时,系统会出现以下错误:

The App Engine appspot and App Engine flexible environment service accounts must
have permissions on the image IMAGE_NAME

出现此错误的原因如下:

未能创建 Cloud Build

如果您通过没有 Cloud Build Editor (roles/cloudbuild.builds.editor) 角色的服务账号使用 gcloud app deploy 命令,则会发生以下错误。

Failed to create cloud build: Permission denied

如需解决此问题,请向服务账号授予 Cloud Build Editor 角色

提取应用时出错

如果用于部署应用的服务账号没有 App Engine Deployer 角色,则会出现以下错误。

Permissions error fetching application apps/app_name. Please make sure you are using the correct project ID and that you have permission to view applications on the project.

If you are running Google Cloud CLI version 328 or later, the following error occurs
when you deploy your app:

make sure that you have permission to view applications on the project and that
SERVICE_ACCOUNT has the App Engine Deployer (roles/appengine.deployer) role.

如需解决此问题,请向用于部署应用的服务账号授予 App Engine Deployer 角色。

使用无服务器 VPC 访问通道连接器部署服务时出错

当尝试使用无服务器 VPC 访问通道连接器部署应用的用户或服务账号没有所需的权限时,便会发生以下错误:

Please ensure you have [compute.globalOperations.get] on the service project

要解决此问题,请确保用于部署的用户或服务账号具有 Serverless VPC Access UserCompute Viewer IAM 角色。

常见的部署错误

本部分介绍了针对应用或项目中的配置错误的问题排查策略。

在共享 VPC 设置中进行部署时出现无效值错误

部署应用时,Flex 虚拟机实例的 Cloud Logging 中会显示以下错误:

Invalid value for field 'resource.tags.items[1]': 'aef-instance'. Duplicate
tags are not allowed: aef-instance on compute.instances.insert

这是已知问题,在 app.yaml 文件中设置 instance_tag 会导致在创建实例时出错。

要解决此问题,请从 app.yaml 文件中移除 instance_tag 字段并重新部署。

部署实例数上限不超过 3 个的应用时出错

部署时将 max_instances 设置为 3 或更少的应用可能会遇到意外错误或停机。如需解决此问题,请在 app.yaml 文件中指定至少四个实例并重新部署。

超出实例数上限

部署应用时,系统会出现以下错误:

You may not have more than 'xx' total max instances in your project.

每个项目可以创建的实例数存在上限。如果超出此限制,创建其他实例的请求会失败。

如需解决此问题,请在 app.yaml 文件中将 max_instances 的值设置为低于此限制的值,或者删除一些服务或版本以使 max_instances 的总和在此限制范围内。

在部署期间构建失败,但日志中没有错误

部署应用时,系统会出现以下错误:

ERROR: (gcloud.app.deploy) Cloud build failed. Check logs at https://console.cloud.google.com/cloud-build/builds/BUILD_ID?project=PROJECT_NUMBER Failure status: UNKNOWN: Error Response: [2] Build failed; check build logs for details

如果您点击错误消息中的链接,发现所有构建步骤均已成功执行,但应用仍未成功构建,则可能是因为以下某个原因:

如需解决此问题,请更改存储桶的以下设置:

运行 Node.js 应用时构建失败

部署 Node.js 应用时可能会发生构建失败。

默认情况下,如果在 package.json 文件中检测到构建脚本,则 Node.js 运行时将执行 npm run build。这可能会导致意外行为,例如长时间运行的构建或内存不足错误。

如需解决此问题,请在 app.yaml 文件中指定 NODE_ENV=development,以确保执行具有所有必需的依赖项。

尽管存在错误,您也可以在 app.yaml 文件中的 build-env-variables 下指定 NODE_ENV: 'production' 来强制实现生产环境:

  build_env_variables:
    NODE_ENV: 'production'

如需了解详情,请参阅在部署期间执行自定义构建步骤