排查 App Engine 中的部署问题

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

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

权限错误

本部分介绍了在部署应用时由于缺少账号权限或组织政策发生更改而可能出现的错误。

如需确定您用于访问 Google Cloud Platform 中的 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

发生此错误是由以下某种原因造成的:

  • 默认的 App Engine 服务账号没有 Storage Object Viewer (roles/storage.objectViewer) 角色

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

  • 您的项目具有 VPC Service Controls 服务边界,该边界使用访问权限级别限制对 Cloud Storage API 的访问。

    如需解决此问题,请将用于部署应用的服务账号添加到相应的 VPC Service Controls 服务边界 accessPolicies

  • 2024 年 5 月 15 日之后,Artifact Registry 将在之前未使用 Container Registry 的 Google Cloud 项目中托管 gcr.io 网域的映像。如果您在该日期之后创建的新项目中部署现有应用,服务账号可能没有部署应用所需的权限。如需授予所需权限,请参阅部署到 App Engine

未能创建 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 设置中进行部署时出现无效值错误

部署应用时,柔性虚拟机实例的 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'

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