部署 Python 应用

部署应用,以便将应用上传到 App Engine 并在 App Engine 上运行应用。部署应用时,您可以在 App Engine 中创建这些应用的版本及其对应的服务。您可以部署整个应用(包括所有源代码和配置文件),也可以部署和更新单个版本或配置文件

要以编程方式部署应用,请使用 Admin API

准备工作

在部署应用之前,请做好以下准备:

安装 gcloud CLI

如需使用 gcloud CLI 部署应用,您必须下载、安装并初始化 gcloud CLI

下载 SDK

如果您已安装 gcloud CLI,并希望将其配置为使用 Cloud 项目 ID,而不是初始化时设置的 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]

您还可以为代理设置 usernamepassword。如需了解详情,请参阅 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 服务的实例 ID 123

对于配置为自动扩缩或基本扩缩的实例,您可以根据需要命名您的版本,因为系统不支持定位此类实例

gcloud app deploy [CONFIGURATION_FILES]

默认情况下,该命令从当前目录部署 app.yaml 配置文件。如果从不包含应用 app.yaml 的目录运行命令,或者想部署多个应用,请将 [CONFIGURATION_FILES] 替换为一个或多个配置文件的路径。使用单个空格来分隔路径名。

可选标志:

  • --version:指定自定义版本 ID。默认情况下,App Engine 会生成一个版本 ID。
  • --no-promote:部署您的应用,而不自动将所有流量路由到该版本。默认情况下,您部署的每个版本都会自动配置为接收 100% 的流量。
  • --project:为您在 gcloud CLI 中初始化为默认值的 Cloud 项目 ID 指定一个备用 Cloud 项目。

如需了解详情,请参阅 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 会流式传输构建日志和部署日志,您可以在控制台的 Cloud Build 历史记录部分查看这些日志。要查看应用所在区域中的构建,请使用页面顶部的区域下拉菜单选择要作为过滤条件的区域。

更新索引

如需创建或更新应用使用的索引,请将 index.yaml 配置文件上传到 Datastore。上传该配置文件之后,系统将创建尚不存在的索引。

Datastore 可能需要一段时间才能创建所有索引,因此 App Engine 无法立即使用这些索引。如果您的应用已配置为接收流量,而查询需要的索引仍在构建过程中,则查询时可能会发生异常。

为避免异常,您必须留出时间来构建所有索引,例如:

  • 在部署版本之前,请先将 index.yaml 配置文件上传到 Datastore:

    1. index.yaml 文件上传到 Datastore:

        <pre class="prettyprint lang-sh">gcloud datastore indexes create index.yaml</pre>
        For information, see the <a
        href="/sdk/gcloud/reference/datastore/"><code>gcloud
        datastore</code> reference</a>.
      
    2. 使用控制台监控所有索引的状态:

      前往 Datastore 页面

    3. 构建所有索引后,将新版本部署到 App Engine

  • 将流量迁移或拆分到您的版本之前构建索引:

    1. 部署新版本,而不将流量路由到该版本:必须同时指定 app.yamlindex.yaml 文件,另外添加 --no-promote 标志以免将流量路由到该版本:
      gcloud app deploy app.yaml index.yaml --no-promote
    2. 使用控制台监控所有索引的状态:

      前往 Datastore 页面

    3. 构建完所有索引之后,请使用控制台将流量迁移或拆分到您的版本:

      打开“版本”页面

如需详细了解索引,请参阅配置数据存储区索引

问题排查

下面是您可能会遇到的常见错误消息:

PERMISSION_DENIED: Operation not allowed
The "appengine.applications.create" permission is required.
如果 Cloud 项目不包含所需的 App Engine 应用,则 gcloud app deploy 命令在尝试运行 gcloud app create 命令时可能会失败。只有拥有 Owner 角色的帐号才具备创建 App Engine 应用所需的权限。
Command not found
如果您在安装 App Engine SDK(已弃用)时没有为 dev_appserver.sh 工具创建符号链接,则可能需要指定完整目录路径(例如 [PATH_TO_CLOUD_SDK]/bin/dev_appserver.py)来运行相应工具。
Import Error
如果您同时安装了 gcloud CLI 以及初始版本 App Engine SDK,则 PATH 的条目可能会相互冲突并造成导入错误。如果您在运行 gcloud CLI 命令时收到错误,请尝试明确使用原始 App Engine SDK。您可以将原始 App Engine SDK 的条目移到 PATH 中较为靠前的位置,以使相应命令具有优先权。或者,您可以通过指定完整目录路径 [PATH_TO_APP_ENGINE_SDK]/dev_appserver.py 来运行该命令。
[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 对应用的已部署版本数量设定了限制。针对免费应用和已部署应用的限制有所不同。您可以使用控制台删除旧版本,然后上传最新代码。
[13] An internal error occurred while creating a Cloud Storage bucket.

App Engine 将代表您在应用创建的同一区域中创建默认的 Cloud Storage 多区域存储桶。此存储桶是存储应用内容所必需的。无法创建此存储桶时,在以下情况下会返回此错误:

[13] An internal error occurred

如果 App Engine 的 app.yaml 配置文件在 vpc_access_connector 键下包含无效资源 name,则可能会发生此错误。确定 name 字段包含在其中创建了无服务器 VPC 访问通道连接器的正确项目和区域。

如果在确保 app.yaml 配置有效后此问题仍然存在,请使用 Google Cloud SDK 重新部署您的服务,添加 --verbosity=debug 标志,然后联系 GCP 支持并提供该命令的输出。

其他部署错误

如果部署失败,请确保 Cloud Build API 已在项目中启用。App Engine 会在您首次部署应用时自动启用此 API,但如果有人停用了 API,则部署将失败。

后续步骤