排查 App Engine 中的部署问题

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

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

权限错误

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

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

  • 如果您使用 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 的项目中托管 gcr.io 网域的映像。 Google Cloud 如果您在该日期之后创建的新项目中部署现有应用,服务账号可能没有部署该应用所需的权限。如需授予所需权限,请参阅部署到 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 角色。

等待应用基础架构运行状况恢复正常时超时

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

Timed out waiting for the app infrastructure to become flex_await_healthy

各种因素都可能会导致此错误,例如缺少权限、代码错误、CPU 或内存不足或健康检查失败。

如需解决此问题,请排除以下可能的原因:

  1. 检查项目的组织政策是否限制对外部 IP 地址的访问。如需了解详情,请参阅 App Engine 柔性环境已知问题

  2. 确认您已向用于运行应用的服务账号(通常是默认服务账号,即 app-id@appspot.gserviceaccount.com)授予以下角色:

  3. 根据部署错误,如果服务账号没有剩余的角色,请授予这些角色。

  4. 如果您要在共享 VPC 设置中进行部署,并在 app.yaml 文件中配置 instance_tag,请参阅在共享 VPC 设置中进行部署时出现无效值错误以解决问题。

在运行版本下重启实例时出错

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

error when restarting the instance under the running versions

自 2024 年 5 月起, Google Cloud 将对所有新组织强制执行从设计上保证安全组织政策。此政策要求在新项目中创建的所有虚拟机实例都必须启用虚拟机管理器。对于新项目和现有项目,此限制条件将阻止会在项目或实例级别停用虚拟机管理器的元数据更新。

如需解决此问题,您必须停用组织政策限制条件“要求使用 OS Config”(constraints/compute.requireOsConfig)。

如果此问题仍然存在,您还必须停用可能已在项目级或组织级启用的以下组织政策:

所需的 compute.firewalls.list 权限

在共享 VPC 网络上部署应用时,系统会出现以下错误:

Request to https://compute.googleapis.com/compute/v1/projects/projects/PROJECT_ID/global/firewalls?key failed, details: Required 'compute.firewalls.list' permission for 'projects/PROJECT_ID'

如果宿主项目的以下服务账号没有 Compute Network User (roles/compute.networkUser) 角色,则系统会出现此错误:

如需解决此问题,请向宿主项目的 Google API 服务代理和 App Engine 柔性环境服务代理服务账号授予 Compute Network User 角色

由于组织政策限制条件,部署失败

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

ERROR: (gcloud.app.deploy) Error Response: [13] An internal error occurred while processing task /app-engine-flex/....: Request to https://compute.googleapis.com/compute/VERSION/projects/PROJECT_ID/... failed, details: Constraint constraints/compute.disableGuestAttributesAccess violated for project PROJECT_ID.

这可能是因为在部署应用时强制执行了 constraints/compute.disableGuestAttributesAccess 限制条件。默认情况下,App Engine 柔性环境中的所有应用都会强制执行此组织政策。

如需解决此问题,您必须停用 constraints/compute.disableGuestAttributesAccess 限制条件。

常见的部署错误

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

在共享 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

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

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

部署到现有 App Engine 版本时出错

部署到 App Engine 柔性环境中的现有版本时,可能会出现以下错误:

ERROR: (gcloud.app.deploy) Error Response: [9] An internal error occurred while
processing task /app-engine-flex/flex_await_healthy/flex_await_healthy

此错误表示使用有效的 Docker 映像更新健康状况不佳的部署并不总是会产生健康状况良好的部署。结果取决于健康状况不佳的部署中的实例状态。尽管存在错误,但如果您提供了良好的 Docker 映像,则部署最终可能会正常运行。虽然允许使用新的 Docker 映像更新现有版本,但这并不是一种好的做法。如果版本失败,系统不会回滚。