区域 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 中的应用中,请执行以下操作:
授权您的 HTTP 请求,例如获取访问令牌。
您可以使用不同的 OAuth 流程来完成 Admin API 的访问授权,具体取决于 API 应用的需求。如需了解详情,请参阅访问 API。
发送 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" }
验证版本是否已部署到 App Engine 应用:
查看实际部署操作的状态:
您在上一步中使用的 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 参考。
验证 App Engine 应用中是否已创建此版本:
如需查看版本的详细信息,您可以使用
apps.services.versions
集合的GET
方法。必须指定您在 HTTPGET
请求中部署的版本,例如: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
可选:如需启动浏览器并在
https://VERSION_ID-dot-default-dot-PROJECT_ID.REGION_ID.r.appspot.com
上查看应用,您可以运行以下命令:gcloud app browse -v [MY_VERSION_ID]
配置您刚刚部署的版本应当接收的流量。
默认情况下,部署到 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
版本,请执行以下操作:
- 为
backend
服务创建新代码和源文件。 - 在 Cloud Storage 存储桶中暂存
backend
服务的应用资源。 - 创建
backend/app.json
配置文件。 使用 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 } } } ] }