部署应用,以便将应用上传到 App Engine 并在 App Engine 上运行应用。部署应用时,您可以在 App Engine 中创建这些应用的版本及其对应的服务。您可以部署整个应用(包括所有源代码和配置文件),也可以部署和更新单个版本或配置文件。
要以编程方式部署应用,请使用 Admin API。
准备工作
在部署应用之前,请做好以下准备:
Google Cloud 项目的所有者必须创建 App Engine 应用。
确保您的用户账号具备所需的权限。
授予 Cloud Build 在项目中部署应用的权限。在部署应用时,App Engine 使用 Cloud Build 将应用构建到容器中,并将容器部署到应用所在区域中的运行时。默认情况下,Cloud Build 没有部署 Python 2 应用的权限,因此您需要先授予权限才能部署应用。
安装 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,请从配置文件所在的位置使用 gcloud app deploy
命令,例如 app.yaml
。
选择唯一的版本 ID
对于手动扩缩的实例,版本的 ID 应该以字母开头,以与数字实例 ID 区分开。这可以确保将请求路由到正确的目标,并避免网址格式(如123-dot-my-service.[REGION_ID].r.appspot.com
)造成的歧义,此类网址格式可通过两种方式解释:
- 如果版本
123
已存在,则请求将路由到my-service
服务的版本123
。 - 如果版本
123
不存在,则请求将路由到运行my-service
服务的实例 ID123
。
对于配置为自动扩缩或基本扩缩的实例,您可以根据需要命名您的版本,因为系统不支持定位此类实例。
gcloud app deploy [CONFIGURATION_FILES]
默认情况下,该命令从当前目录部署 app.yaml
配置文件。如果从不包含应用 app.yaml
的目录运行命令,或者想部署多个应用,请将 [CONFIGURATION_FILES]
替换为一个或多个配置文件的路径。使用单个空格来分隔路径名。
可选标志:
--version
:指定自定义版本 ID。默认情况下,App Engine 会生成一个版本 ID。--no-promote
:部署您的应用,而不自动将所有流量路由到该版本。默认情况下,您部署的每个版本都会自动配置为接收 100% 的流量。--project
:为您在 gcloud CLI 中初始化为默认值的 Google Cloud 项目 ID 指定一个备用 Google Cloud 项目 ID。
如需了解详情,请参阅 gcloud app deploy
参考文档或从命令行运行 gcloud help
。
示例:
gcloud app deploy
gcloud app deploy app.yaml dos.yaml index.yaml
gcloud app deploy --version [YOUR_VERSION_ID] --no-promote --project [YOUR_PROJECT_ID]
如果您部署的版本所指定的版本 ID 与 App Engine 上已存在的版本相同,则您部署的文件将覆盖现有版本。如果该版本正在处理流量,则可能会出现问题,因为流向应用的流量可能会中断。如果您使用不同的版本 ID 部署新版本,然后将流量迁移到该版本,则可以避免中断流量。
部署多个服务应用
当您的应用被分解为多项服务时,您可以单独部署和更新目标服务,也可以同时部署和更新所有服务。部署服务更新可能包括更新单个配置文件或更新相应版本中的源代码。
例如,您可以在 App Engine 中部署和创建两个版本,其中每个版本都在各自的服务中运行。第一个版本用作前端服务,另一个版本用作应用的后端。然后,您可以部署单独的配置文件以仅更新服务的设置。您还可以选择将新版本部署到服务,以便同时更新前端和/或后端的源代码。
多项服务的要求
您可以使用相同的部署命令来部署和更新应用的多项服务,但需要满足以下要求:
您必须先将应用的某个版本部署到
default
服务,然后才能创建和部署后续服务。您必须在相应版本的
app.yaml
配置文件中指定服务的 ID。如需指定服务 ID,请在每个配置文件中添加service: [YOUR_SERVICE_ID]
元素定义。如果没有在配置文件中添加此元素定义,则该版本默认部署到default
服务。您必须在部署命令中指定所有相应的
app.yaml
配置文件,才能同时部署多项服务。
部署多项服务
从配置文件所在的应用根目录中,运行部署命令并为每项服务的 app.yaml
文件指定相对路径和文件名。
gcloud app deploy [CONFIGURATION_FILES]
其中 [CONFIGURATION_FILES]
是一个或多个配置文件的路径和名称,由单个空格分隔。
示例
gcloud app deploy main/app.yaml service1/app.yaml service2/app.yaml
每项服务成功部署后,您将通过命令行收到验证。
查看构建日志
Cloud Build 会流式传输构建日志和部署日志,您可以在 Google Cloud 控制台的 Cloud Build 历史记录部分查看这些日志。要查看应用所在区域中的构建,请使用页面顶部的区域下拉菜单选择要作为过滤条件的区域。
更新索引
如需创建或更新应用使用的索引,请将 index.yaml
配置文件上传到 Datastore。上传该配置文件之后,系统将创建尚不存在的索引。
Datastore 可能需要一段时间才能创建所有索引,因此 App Engine 无法立即使用这些索引。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。
为避免异常,您必须留出时间来构建所有索引,例如:
在部署版本之前,请先将
index.yaml
配置文件上传到 Datastore:将
index.yaml
文件上传到 Datastore:gcloud datastore indexes create index.yaml
如需了解详情,请参阅
gcloud datastore
参考文档。使用 Google Cloud 控制台监控所有索引的状态:
构建所有索引后,将新版本部署到 App Engine。
将流量迁移或拆分到您的版本之前构建索引:
-
部署新版本,而不将流量路由到该版本:必须同时指定
app.yaml
和index.yaml
文件,另外添加--no-promote
标志以免将流量路由到该版本:gcloud app deploy app.yaml index.yaml --no-promote
- 使用 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 控制台删除旧版本,然后上传最新代码。
[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,则部署将失败。