部署应用,以便将应用上传到 App Engine 并在 App Engine 上运行应用。部署应用时,您可以在 App Engine 中创建这些应用的版本及其对应的服务。您可以部署整个应用(包括所有源代码和配置文件),也可以部署和更新单个版本或配置文件。
要以编程方式部署应用,请使用 Admin API。
准备工作
在部署应用之前,请做好以下准备:
Google Cloud 项目的所有者必须创建 App Engine 应用。
确保您的用户账号具备所需的权限。
授予 Cloud Build 在项目中部署应用的权限。在部署应用时,App Engine 使用 Cloud Build 将应用构建到容器中,并将容器部署到应用所在区域中的运行时。默认情况下,Cloud Build 没有部署 Java 8 应用的权限,因此您需要先授予权限才能部署应用。
设置 Maven 构建工具(推荐)
要使用 Maven 构建工具部署应用,您必须将项目设置为使用 App Engine Maven 插件。
安装 gcloud CLI
如需使用 gcloud CLI 部署应用,您必须下载、安装并初始化 gcloud CLI。
如果您已安装 gcloud CLI,并且想要将其配置为使用其他 Google Cloud 项目 ID 而不是初始化时设置的 Google Cloud 项目 ID,请参阅管理 gcloud CLI 配置。
使用代理
如果您从使用 HTTP 或 HTTPS 代理的系统运行部署命令,则必须配置该工具,以使其可以通过代理通信。
运行以下命令以配置 gcloud CLI:
gcloud config set proxy/type [PROXY_TYPE]
gcloud config set proxy/address [PROXY_ADDRESS]
gcloud config set proxy/port [PROXY_PORT]
您还可以为代理设置 username
和 password
。如需了解详情,请参阅 gcloud config。
部署应用
如需将应用部署到 App Engine,请在应用的根目录中使用 Maven 构建工具(推荐)或 gcloud app deploy
命令。
使用 Maven(推荐)
如需使用 Maven 构建工具部署您的应用,请从您项目的顶级目录(pom.xml
文件所在的位置)中运行以下命令:
mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID
将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。 如果您的 pom.xml
文件已经指定了您的项目 ID,则您无需在运行的命令中添加 -Dapp.deploy.projectId
属性。
使用 gcloud 命令行
gcloud app deploy [CONFIGURATION_FILES]
将 [CONFIGURATION_FILES]
替换为一个或多个配置文件的路径。
使用单个空格来分隔路径名。
可选标志:
--version
:指定自定义版本 ID。如果您未指定版本 ID,App Engine 会生成一个版本 ID。--no-promote
:部署您的应用,而不自动将所有流量路由到该版本。默认情况下,您部署的每个版本都会自动配置为接收 100% 的流量。--project
:为您在 gcloud CLI 中初始化为默认值的 Google Cloud 项目 ID 指定一个备用 Google Cloud 项目 ID。
如需了解有关详情,请参阅 gcloud app deploy
参考文档或从命令行运行 gcloud help
。
选择唯一的版本 ID
对于手动扩缩的实例,版本的 ID 应该以字母开头,以与数字实例 ID 区分开。这可以确保将请求路由到正确的目标,并避免网址格式(如123-dot-my-service.[REGION_ID].r.appspot.com
)造成的歧义,此类网址格式可通过两种方式解释:
- 如果版本
123
已存在,则请求将路由到my-service
服务的版本123
。 - 如果版本
123
不存在,则请求将路由到运行my-service
服务的实例 ID123
。
对于配置为自动扩缩或基本扩缩的实例,您可以根据需要命名您的版本,因为系统不支持定位此类实例。
部署多个服务应用
当您的应用被分解为多项服务时,您可以单独部署和更新目标服务,也可以同时部署和更新所有服务。部署服务更新可能包括更新单个配置文件或更新相应版本中的源代码。
例如,您可以在 App Engine 中部署和创建两个版本,其中每个版本都在各自的服务中运行。第一个版本用作前端服务,另一个版本用作应用的后端。然后,您可以部署单独的配置文件以仅更新服务的设置。您还可以选择将新版本部署到服务,以便同时更新前端和/或后端的源代码。
多项服务的要求
您可以使用相同的部署命令来部署和更新应用的多项服务,但需要满足以下要求:
您必须先将应用的某个版本部署到
default
服务,然后才能创建和部署后续服务。您必须在相应版本的
appengine-web.xml
配置文件中指定服务的 ID。如需指定服务 ID,请在每个配置文件中添加module: [YOUR_SERVICE_ID]
元素定义。如果没有在配置文件中添加此元素定义,则该版本默认部署到default
服务。您必须在部署命令中指定所有相应的
appengine-web.xml
配置文件,才能同时部署多项服务。必须首先列出default
服务。
部署多项服务
从配置文件所在的应用根目录中,运行部署命令并为每项服务的 appengine-web.xml
文件指定相对路径和文件名。
使用 Maven 构建工具
如果项目的根目录仅包含您的服务,您可以使用单个 Maven 命令来部署所有这些服务。
Maven 部署命令会遍历项目的所有服务以查找其配置文件,然后部署各项服务。
如需使用 Maven 插件部署多项服务,请执行以下操作:
- 确保已将 appengine-maven-plugin 添加到父级
pom.xml
文件中。 运行以下命令:
mvn package appengine:deploy -Dapp.deploy.projectId=PROJECT_ID
将 PROJECT_ID 替换为您的 Google Cloud 项目的 ID。 如果您的
pom.xml
文件已经指定了您的项目 ID,则您无需在运行的命令中添加-Dapp.deploy.projectId
属性。
使用 gcloud
gcloud app deploy [CONFIGURATION_FILES]
将 [CONFIGURATION_FILES]
替换为一个或多个配置文件的路径。
使用单个空格来分隔路径名。
每项服务成功部署后,您将通过命令行收到验证。
查看构建日志
Cloud Build 会流式传输构建日志和部署日志,您可以在 Google Cloud 控制台的 Cloud Build 历史记录部分查看这些日志。要查看应用所在区域中的构建,请使用页面顶部的区域下拉菜单选择要作为过滤条件的区域。
更新索引
如需创建或更新应用使用的索引,请将 datastore-indexes.xml
配置文件上传到 Datastore。上传该配置文件之后,系统将创建尚不存在的索引。
Datastore 可能需要一段时间才能创建所有索引,因此 App Engine 无法立即使用这些索引。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。
为避免异常,您必须留出时间来构建所有索引,例如:
在部署版本之前,请先将
index.xml
配置文件上传到 Datastore:将
index.xml
文件上传到 Datastore: 如需了解详情,请参阅gcloud datastore indexes create index.yaml
gcloud datastore
参考文档。使用 Google Cloud 控制台监控所有索引的状态:
构建所有索引后,将新版本部署到 App Engine。
将流量迁移或拆分到您的版本之前构建索引:
-
在应用的
appengine-web.xml
文件中定义新版本 ID。 - 部署新版本。
- 使用 Google Cloud 控制台监控所有索引的状态:
- 构建完所有索引之后,请使用 Google Cloud 控制台将流量迁移或拆分到您的版本:
-
在应用的
如需详细了解索引,请参阅配置数据存储区索引。
问题排查
下面是您可能会遇到的常见错误消息:
PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
- 如果 Google Cloud 项目不包含所需的 App Engine 应用,则
gcloud app deploy
命令在尝试运行gcloud app create
命令时可能会失败。只有拥有 Owner 角色的账号才具备创建 App Engine 应用所需的权限。 Command not found
- 如需了解如何设置本地开发服务器工具,请参阅使用本地开发服务器。
Import Error
- 如果您同时安装了 gcloud CLI 以及初始版本 App Engine SDK,则 PATH 的条目可能会相互冲突并造成导入错误。如果您在运行 gcloud CLI 命令时收到错误,请按照运行本地开发服务器的说明进行操作。
[400] The first service (module) you upload to a new application must be the 'default' service (module)
- 您必须先部署并创建
default
服务,然后才能部署并创建应用的多项服务。如需详细了解如何将版本部署到default
服务,请参阅部署多个服务应用。 Too Many Versions (403)
- App Engine 对应用的已部署版本数量设定了限制。针对免费应用和已部署应用的限制有所不同。您可以使用 Google Cloud 控制台删除旧版本,然后上传最新代码。
You do not have permission to modify this app (403)
- 经过身份验证的账号没有权限部署到您的命令或
appengine-web.xml
中指定的应用 ID 时,就会发生这种情况。请检查您的应用 ID 是否准确,以及该 ID 是否与您的 Google Cloud 控制台项目 ID 的值相匹配。接下来,请检查控制台中的项目权限,并验证您的账号是否拥有足以部署应用的权限级别。 [13] An internal error occurred while creating a Cloud Storage bucket.
App Engine 将代表您在应用创建的同一区域中创建默认的 Cloud Storage 多区域存储桶。此存储桶是存储应用内容所必需的。无法创建此存储桶时,在以下情况下会返回此错误:
您的项目中不存在默认 App Engine 服务账号。如果您的账号已在删除后 30 天内移除,您可以将其恢复。
您的项目隶属于执行
constraints/gcp.resourceLocations
政策的组织,并且该组织不允许在创建您的 App Engine 的同一区域上创建资源。您将需要替换针对您的项目强制执行的constraints/gcp.resourceLocations
政策,并允许在创建您的 App Engine 应用的同一区域中使用多区域位置。
[13] An internal error occurred
如果 App Engine 的
app.yaml
配置文件在vpc_access_connector
键下包含无效资源name
,则可能会发生此错误。确定name
字段包含在其中创建了无服务器 VPC 访问通道连接器的正确项目和区域。如果在确保
app.yaml
配置有效后此问题仍然存在,请使用 Google Cloud SDK 重新部署您的服务,添加--verbosity=debug
标志,然后联系 Cloud 支持团队并提供该命令的输出。- 其他部署错误
如果部署失败,请确保 Cloud Build API 已在项目中启用。App Engine 会在您首次部署应用时自动启用此 API,但如果有人停用了 API,则部署将失败。