2

Integration with Cloud Pub/Sub APIs from App Engine Standard

I am working on developing a Google app engine app in standard Python environment. For some portions of the code, I need to integrate with Google Cloud pub/sub APIs.

As mentioned here, Pub/Sub can only be integrated in the App Engine flexible environment (BTW it is also only in alpha). Can someone please describe how to integrate with Pub/Sub in the App Engine Standard environment?

My use case description

I am trying to integrate MQTT with google app engine by using Agosto IOT broker. I will be using MQTT for clients (Currently mobile platforms) and on server side, I plan to use pub/sub for receiving/sending the messages and saving relevant data to the database.

4

2 回答 2

3

您可能想尝试改用新的Google Cloud IoT Core产品(完全公开,我参与了它),而不是在 App Engine 上托管 MQTT。Cloud IoT Core 可让您连接到 Google 提供的 MQTT 桥接器,该桥接器会将您的数据放入 Google Cloud PubSub。您可以使用 Google Cloud DataFlow 将数据从 PubSub 移动到您的数据仓库以进行分析,也可以使用您自己的数据库作为 DataFlow 的输出。

文档中详细讨论了与 Google Cloud IoT Core MQTT 桥通信的连接详细信息,但您需要注意的重要连接属性是主机名 (mqtt.googleapis.com) 端口(8883 或 443)和MQTT 密码/客户端 ID,将基于您为服务配置的设备。

需要根据您尝试访问 MQTT 桥的编程语言来选择您的实际 MQTT 客户端。如果您尝试从 Android 开始,您可以从Java MQTT 客户端示例开始,最终可能会使用来自 AndroidThings 团队的 Android Things Cloud IoT 传感器集线器连接器之类的东西。

于 2017-09-19T23:27:03.620 回答
0

TL;DR -App Engine 标准不支持较新的Google Cloud 客户端库。您将需要使用较旧的Google Cloud API 客户端库Cloud Pub/Sub进行通信。

Cloud API 客户端库(较旧)与 Google Cloud 客户端库(较新)

您指向的Cloud Pub/Sub 客户端库文档建议您使用较旧的Google API 客户端库(App Engine 标准环境支持)而不是Google Cloud 客户端库(App Engine 灵活环境支持但不支持标准)

客户端库在此处详细说明。

适用于 Cloud Pub/Sub 的 Google API 客户端库

以下是使用 Google API 客户端库支持的所有API 列表。Cloud Pub/Sub API也是此列表的一部分。

将 Google API 客户端库与 App Engine Standard 结合使用

如果您向下滚动该页面,则会有一节描述如何在 App Engine 标准环境中使用此 API 库。简而言之,您需要将库与您的应用程序捆绑在一起,就像您使用的其他第三方库一样。

应用引擎

由于 Python 客户端库未安装在App Engine Python 运行时环境中,因此它们必须像第三方库一样供应到您的应用程序中。

您将在页面上看到的此警告建议您尽可能使用常规的云客户端库。但由于 App Engine Standard 不支持它,您可以在该用例中忽略它。

虽然仍然支持此库,但我们建议尝试使用更新的 Cloud Client Library for Google Cloud Pub/Sub,尤其是对于新项目。有关安装和使用详情,请参阅Google Cloud Pub/Sub 库

使用 google-api-python-client 库调用 PubSub API 的示例

使用服务帐户 json 文件中的凭据

以下示例向您展示了如何使用服务帐号向 Google Cloud PubSub API 进行身份验证并调用它们。有关如何使用服务帐户中的凭据的信息可在此处获得

您需要预先安装以下 python 包才能使此示例正常工作:google-api-python-clientoauth2client.

如果您正在使用pip,您可以执行以下操作:

pip install google-api-python-client oauth2client

我亲自测试过的例子:

from googleapiclient import discovery
from httplib2 import Http
from oauth2client.service_account import ServiceAccountCredentials

# BEGIN CONFIG
PRIVATE_KEY_JSON = 'path/to/service_account_private_key.json'
API_SCOPES = ['https://www.googleapis.com/auth/pubsub']
PROJECT_NAME = 'FILL_IN_PROJECT_NAME_HERE'
# END CONFIG

# The format of project name expected by PubSub
PROJECT = 'projects/{0}'.format(PROJECT_NAME)

# Create a ServiceAccountCredentials object by reading the credentials from
# your JSON file.
credentials = ServiceAccountCredentials.from_json_keyfile_name(
    PRIVATE_KEY_JSON, scopes=API_SCOPES)

# Build the Cloud PubSub API object which you will be using for
# invoking the corresponding APIs using the credentials object
# you created previously
pubsub = discovery.build('pubsub', 'v1', credentials=credentials)

# List all topics the specified project
topics = pubsub.projects().topics().list(
    project=PROJECT).execute()
print topics

# Add a new topic
topic_name = 'TOPIC_NAME_TO_ADD'
added_topic_response = pubsub.projects().topics().create(
    name='{0}/topics/{1}'.format(PROJECT, topic_name), body={}).execute()
print added_topic_response

在 App Engine 应用中使用来自服务帐户的凭据

这里有一些关于如何使用 App Engine 应用程序中的服务帐户凭据的信息。

上面的示例大部分都适用于调用 PubSub API,但您将初始化凭证对象的部分除外。该部分可以大致如下所述进行更换:

服务帐号

如果您的 App Engine 应用程序需要调用 API 来访问应用程序项目拥有的数据,您可以使用服务帐户来简化 OAuth 2.0 。这些服务器到服务器的交互不涉及用户,只有您的应用程序需要对其自身进行身份验证。使用AppAssertionCredentials类创建 Credentials 对象,而不使用 Flow 对象。

在以下代码片段中,创建了一个 Credentials 对象并授权了一个 Http 对象:

import httplib2
from google.appengine.api import memcache
from oauth2client.contrib.appengine import AppAssertionCredentials
...
credentials = AppAssertionCredentials(scope='https://www.googleapis.com/auth/devstorage.read_write')
http = credentials.authorize(httplib2.Http(memcache))

pubsub = discovery.build('pubsub', 'v1', http=http)
...

一旦你有一个授权的 Http 对象,你可以像往常一样将它传递给 build()execute()函数。

使用应用程序默认凭据

您还可以使用应用程序默认凭据进行本地测试,也可以在 App Engine 环境中工作。

from oauth2client.client import GoogleCredentials

...

credentials = GoogleCredentials.get_application_default()
pubsub = discovery.build('pubsub', 'v1', credentials=credentials)

...
于 2017-06-25T19:59:26.080 回答