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

区域 ID

REGION_ID 是 Google 根据您在创建应用时选择的区域分配的缩写代码。此代码不对应于国家/地区或省,尽管某些区域 ID 可能类似于常用国家/地区代码和省代码。对于 2020 年 2 月以后创建的应用,REGION_ID.r 包含在 App Engine 网址中。对于在此日期之前创建的现有应用,网址中的区域 ID 是可选的。

详细了解区域 ID

借助 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,
      }
      
      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
            }
          }
        }
      ]
    }
    

后续步骤