【问题标题】:google endpoints on flex app engineflex 应用引擎上的谷歌端点
【发布时间】:2017-05-14 01:10:05
【问题描述】:

当我们在标准应用引擎环境中使用端点时 app.yaml 中的以下几行,定义了应用程序的起点

- url: /_ah/spi/.*
  script: main.api 

但由于 flex 引擎使用 'gunicorn' 来定义如下所示的起点

entrypoint: gunicorn -b :$PORT main:app

应该如何将我的云端点的main.py 定义为 flex 环境中谷歌应用引擎的起点?

编辑1:

根据this link的以下建议。

我将 app.yaml 更新为:

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:api
service: s2

endpoints_api_service:
  name: echo-api.endpoints.my-project-id.cloud.goog
  config_id: my-config-id

但现在在部署时,在我的 main.py 文件中出现导入错误

ImportError: No module named endpoints

甚至将导入语句更改为

from google.appengine.ext import endpoints

没有帮助

编辑2:

我将端点库添加到项目 lib 文件夹中,还添加了 appengine_config.py 文件来处理这个库,但它仍然在 import endpoints 处中断。

我的目录结构参考下图

【问题讨论】:

标签: google-app-engine google-cloud-platform google-cloud-endpoints google-managed-vm


【解决方案1】:

来自Quickstart for Endpoints on App Engine Flexible Environment的总结(假设下面是python,如果使用其他语言,请选择相应的示例):

  • 配置端点:

要配置端点,请将YOUR-PROJECT-ID 替换为您自己的 openapi.yaml 配置文件的主机字段中的项目 ID:

swagger: "2.0"
info:
  description: "A simple Google Cloud Endpoints API example."
  title: "Endpoints Example"
  version: "1.0.0"
host: "echo-api.endpoints.YOUR-PROJECT-ID.cloud.goog"
  • 部署您的 Open API 规范:

要部署您的 Open API 规范,请运行以下 gcloud 命令:

gcloud service-management deploy openapi.yaml

这将创建一个新的 Cloud Endpoints 服务,其名称为 echo-api.endpoints.YOUR-PROJECT_ID.cloud.goog 如果不存在, 然后将该服务的配置更新为您的 Open API 规范。

该命令返回多行信息,包括一行 类似于以下内容:

Service Configuration [2016-04-27R2] uploaded for service
"echo-api.endpoints.[YOUR-PROJECT-ID].cloud.goog"

记下服务名称和服务配置ID,它 用于下一步。

  • 更新你的app.yaml:

编辑 app.yaml 以反映 Endpoints 配置 ID 并添加 在 App Engine 上启用 Endpoints API 管理功能 Flex 并添加服务名称和配置 ID:

beta_settings:
  use_endpoints_api_management: true

endpoints_api_service:
  name: echo-api.endpoints.[YOUR-PROJECT-ID].cloud.goog
  config_id: YOUR-CONFIG-ID # 2016-04-27R2 in this example.

保存app.yaml 文件。您将需要重复这些步骤并 对 Open API 进行更改时更新 app.yaml 文件 规范。

【讨论】:

【解决方案2】:

对于 Endpoints Frameworks v1.0,您必须将端点模块复制到您的应用程序目录中才能将其部署在 Flex 上。如果您使用的是 Cloud SDK,它位于 /path/to/google-cloud-sdk/platform/google_appengine/lib/endpoints-1.0

【讨论】:

  • 嘿saiyr,我不能将这些库添加到“requirement.txt”文件中吗?我应该添加什么以确保我的导入端点语句有效?
  • 不,因为 v1(您正在使用的)不在 PyPI 上。我编辑了我的答案。如果您使用 v2,那么您会将 google-endpoints 放入您的 requirements.txt。
  • 非常感谢 saiyr 的正确指导。两个问题/ 1. 由于 v1-endpoint 不在 pip 上,我可以将端点文件夹从 sdk 复制到项目中的 lib 文件夹,然后使用 appengine_config.py 添加它。但这仍然给我同样的问题。 2. 使用 v2 是否意味着我必须更改我的 main.py 代码?
  • 关于 1,是的,应该可以。确保您复制的是endpoints 目录,而不是endpoints-1.0 目录。我相信您还需要为 Flex 添加其他依赖项到 requirements.txt,PyCrypto 就是其中之一。关于2,见cloud.google.com/appengine/docs/python/endpoints/migrating
  • 嘿 saiyr,pycrpto 已添加到 requirements.txt。而且我已经更新了问题以适应项目的目录结构。我仍然无法在 main.py 中导入端点。谢谢
【解决方案3】:

您引用的文档/链接是 Google App Engine 提供的可扩展服务代理,它使用 OpenAPI 规范,可以使用普通的 http 请求调用。可以通过使用 App Engine 提供的Access Control 来限制对端点服务的访问。整个事情只适用于 App Engine 柔性环境。

在 Flex 上查看 GAE 端点

可扩展服务代理需要与我们的传统端点进行不同的配置。

  • 使用 gcloud service-management deploy openapi.yaml 部署开放 API 配置
  • 部署 API 后端。 gcloud 服务管理配置列表 --service=[YOUR-PROJECT-ID].appspot.com
  • 替换 app.yaml 中的 ENDPOINTS-SERVICE-NAME 和 ENDPOINTS-CONFIG-ID,然后使用 gcloud app deploy 进行部署

对于 App Engine 标准环境用户,可以使用新版本的 Endpoints(Endpoint Framework 2.0)。目前,App Engine 柔性环境不支持端点框架。如果你想使用你现有的代码,我建议使用migration to Endpoint Frameworks 2.0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    相关资源
    最近更新 更多