将应用的多个版本部署到 App Engine

地区 ID

REGION_ID 是 Google 根据您在创建应用时选择的地区分配的缩写代码。此代码不对应于国家/地区或省,尽管某些地区 ID 可能类似于常用国家/地区代码和省代码。在 App Engine 网址中包含 REGION_ID.r 对于现有应用是可选项,但在不久后将成为所有新应用的必要项。

为了确保顺利过渡,我们正在逐步更新 App Engine 以使用地区 ID。如果我们尚未更新您的 Google Cloud 项目,则您不会看到应用的区域 ID。由于该 ID 对于现有应用是可选的,因此您在现有应用可以使用区域 ID 后无需更新网址或进行其他更改。

详细了解区域 ID

借助 Google App Engine Admin API,您能够以编程方式通过 HTTP POST 请求将应用的多个版本部署到 App Engine 应用。

准备工作

您必须能够向 HTTP 请求提供授权、访问应用的暂存文件并具有 JSON 格式的配置文件,才能发送 HTTP 部署请求。请参阅以下主题,帮助您了解这些前提条件:

借助 Admin API 将应用部署到 App Engine

要将应用的某版本部署到 App Engine 中的应用中,请执行以下操作:

  1. 授权您的 HTTP 请求,例如获取访问令牌。

    您可以使用不同的 OAuth 流程来完成 Admin API 的访问授权,具体取决于 API 应用的需求。如需了解详情,请参阅访问 API

  2. 发送 HTTP POST 请求,该请求使用访问令牌和 Admin API 将您的版本部署到 App Engine 应用:

    要部署某一个版本,您需要发送一个 HTTP POST 请求,该请求指定 JSON 配置文件并定义目标服务和 App Engine 应用的 Version 资源

    例如,您可以使用以下 HTTP POST 请求将 JSON 配置文件中指定的版本部署到 MY_PROJECT_ID 应用的 default 服务:

    POST https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions app.json
    

    示例 cURL 命令:

    curl -X POST -T "app.json" -H "Content-Type: application/json" -H "Authorization: Bearer [MY_ACCESS_TOKEN]" https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions
    

    其中:

    • [MY_ACCESS_TOKEN] 是您为了向 HTTP 请求授权而获取的访问令牌。
    • [MY_PROJECT_ID] 是要在其中部署版本的项目的 ID。

    示例响应:

    {
      "metadata": {
        "@type": "type.googleapis.com/google.appengine.v1.OperationMetadataV1",
        "insertTime": "2015-05-29T17:12:44.679Z",
        "method": "google.appengine.v1.Versions.CreateVersion",
        "target": "apps/[MY_PROJECT_ID]/services/default/versions/v1",
        "user": "me@example.com"
      }
      "name": "apps/[MY_PROJECT_ID]/operations/89729825-ef1f-4ffa-b3e3-e2c25eb66a85"
    }
    
  3. 验证版本是否已部署到 App Engine 应用:

    1. 查看实际部署操作的状态:

      您在上一步中使用的 HTTP POST 请求在 name 字段中返回了操作名称,您可以在 apps.operations 集合GET 方法中使用该名称来检查部署操作的状态。

      例如,如果响应的 name 字段如下:

      "name": "apps/[MY_PROJECT_ID]/operations/89729825-ef1f-4ffa-b3e3-e2c25eb66a85"
      

      您发送以下 HTTP GET 请求:

      GET https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/operations/89729825-ef1f-4ffa-b3e3-e2c25eb66a85
      

      示例 cURL 命令:

      curl -H "Authorization: Bearer [MY_ACCESS_TOKEN]" https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/operations/89729825-ef1f-4ffa-b3e3-e2c25eb66a85
      

      其中 [MY_ACCESS_TOKEN] 是您的访问令牌,[MY_PROJECT_ID] 是部署版本的项目的 ID。

      示例响应:

      {
        "done": true,
        "metadata": {
          "@type": "type.googleapis.com/google.appengine.v1.OperationMetadataV1",
          "endTime": "2015-05-29T17:13:20.424Z",
          "insertTime": "2015-05-29T17:12:44.679Z",
          "method": "google.appengine.v1.Versions.CreateVersion",
          "target": "apps/[MY_PROJECT_ID]/services/default/versions/v1",
          "user": "me@example.com"
        },
        "name": "apps/[MY_PROJECT_ID]/operations/89729825-ef1f-4ffa-b3e3-e2c25eb66a85",
        "response": {
          "@type": "type.googleapis.com/google.appengine.v1.Version",
          "creationTime": "2015-05-29T17:12:46.000Z",
          "deployer": "me@example.com",
          "id": "v1",
          "name": "apps/[MY_PROJECT_ID]/services/default/versions/v1",
          "runtime": "python27",
          "servingStatus": "SERVING",
          "threadsafe": true,
        }
      }
      

      如需详细了解如何轮询长时间运行的操作,请参阅 google.longrunning RPC 参考。

    2. 验证 App Engine 应用中是否已创建此版本:

      如需查看版本的详细信息,您可以使用 apps.services.versions 集合GET 方法。必须指定您在 HTTP GET 请求中部署的版本,例如:

      GET https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions/v1
      

      示例 cURL 命令:

      curl -H "Authorization: Bearer [MY_ACCESS_TOKEN]" https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions/v1
      

      其中 [MY_ACCESS_TOKEN] 是您的访问令牌,[MY_PROJECT_ID] 是部署版本的项目的 ID。

      示例响应:

      {
        "creationTime": "2015-05-29T17:12:46.000Z",
        "deployer": "me@example.com",
        "deployment": {
          "files": {
            "my-python-app.py": {
              "sha1Sum": "7cffbdaa9fcfa46e5e58269bfe336dd815de0566",
              "sourceUrl": "https://storage.googleapis.com/[YOUR_BUCKET_ID]/my-application/logo.jpg",
            },
            "logo.jpg": {
              "sha1Sum": "13f7ea1e24f7cd2de5c66660525f2b509da37c14",
              "sourceUrl": "https://storage.googleapis.com/[YOUR_BUCKET_ID]/my-application/my-python-app.py"
            }
          }
        },
        "handlers": [
          {
            "authFailAction": "AUTH_FAIL_ACTION_REDIRECT",
            "login": "LOGIN_OPTIONAL",
            "script": {
              "scriptPath": "my-python-app.application",
            },
            "securityLevel": "SECURE_OPTIONAL",
            "urlRegex": "/.*"
          }
        ]
        "id": "v1",
        "name": "apps/[MY_PROJECT_ID]/services/default/versions/v1",
        "runtime": "python27",
        "servingStatus": "SERVING",
        "threadsafe": true,
      }
      

      提示:您可以附加 view=FULL 参数以查看该版本的所有可用信息,例如:

      GET https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions/v1?view=FULL
      
  4. 可选:如需启动浏览器并在 https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com 上查看应用,可以运行以下命令:

    gcloud app browse -v [MY_VERSION_ID]
    
  5. 配置您刚刚部署的版本应当接收的流量。

    默认情况下,部署到 App Engine 应用的初始版本会自动配置为接收 100% 的流量。但是,必须手动配置部署到同一 App Engine 应用的所有后续版本,否则它们将不会收到流量。

    如需详细了解如何为版本配置流量,请参阅迁移和拆分流量

部署其他版本和服务

部署应用的后续版本(包括创建其他服务)的步骤与此任务中介绍的部署步骤基本相同。如果要替换 App Engine 应用中运行的当前版本,或者如果要添加其他服务,可以对配置文件进行一些修改,然后部署新的版本。

请参阅以下示例,了解如何将其他版本部署到 App Engine 应用。请注意,完成版本部署后,您需要为其配置流量

示例:部署其他版本

如果 App Engine 中运行的版本较旧或存在错误,您可以将另一个版本部署到 App Engine 应用将其替换,然后将流量路由到替换后的版本。例如,修改应用的源代码之后,您可以更改 app.yaml 文件中的 version 的值,创建新的 app.json 文件,然后使用另一个 HTTP POST 请求部署应用的 v2 版本:

更新后的 app.yaml 文件示例:

  service: default
  version: v2
  runtime: python27
  threadsafe: true
  handlers:
  - url: /.*
    script: my-python-app.application

版本 v2 的 HTTP POST 请求的示例:

  POST https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/versions app.json

完成确保版本成功部署的各步骤之后,您可以发送 HTTP PATCH 请求,将所有流量路由到新版本,例如:

  PATCH https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/default/?updateMask=split {"split": { "allocations": { "v2": "1" } } }

如需详细了解如何路由流量,请参阅迁移和拆分流量

示例:部署多个服务

如果您在 App Engine 应用中运行 v1 版本,并希望部署其他服务(例如 backend),则执行相同的部署步骤。

例如,如需部署创建 backend 服务的 v1 版本,请执行以下操作:

  1. backend 服务创建新代码和源文件。
  2. 在 Cloud Storage 存储分区中暂存 backend 服务的应用资源。
  3. 创建 backend/app.json 配置文件。
  4. 使用 HTTP 请求将 backend 服务的 v1 版本部署到 App Engine 应用:

    示例 HTTP POST 请求:

    POST https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services/backend/versions backend/app.json
    

    示例 HTTP GET 请求,用于验证 backend 服务中的 v1 版本已创建:

    GET https://appengine.googleapis.com/v1/apps/[MY_PROJECT_ID]/services
    

    示例响应:

    {
      "services": [
        {
          "name": "apps/[MY_PROJECT_ID]/services/default",
          "id": "default",
          "split": {
            "allocations": {
              "v2": 1
            }
          }
        },
        {
          "name": "apps/[MY_PROJECT_ID]/services/backend",
          "id": "backend",
          "split": {
            "allocations": {
              "v1": 1
            }
          }
        }
      ]
    }
    

后续步骤