从Firebase云功能调用Google ML引擎预测

时间:2018-02-11 13:59:04

标签: firebase google-cloud-platform google-cloud-functions google-cloud-ml google-iam

我尝试使用邮递员的HTTP API method在我部署的某个模型上调用预测请求,我将此作为回复:

  

{       “错误”:{           “代码”:401,           “message”:“请求缺少必需的身份验证凭据。预期的OAuth 2访问令牌,登录cookie或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project。”,           “身份”:“未经证实”       }   }

我意识到我们需要身份验证,因此我尝试使用Firebase云功能进行相同的HTTP调用,我仍然得到与上面相同的响应。我做了一些挖掘并遇到了可用于云功能的所有services,我看到了ML Engine。

我在我的模型的权限选项卡中添加了Cloud Functions服务帐户作为ML引擎所有者,期望它添加API调用所需的身份验证,但仍无效。

我不想使用cli或python-client-library,目的是让这项工作服务器更少。

任何能帮助我解决这个问题的人或者我如何对预测请求进行HTTP调用?

感谢。

2 个答案:

答案 0 :(得分:2)

您是否为http请求设置了授权标头? 授权:持票人

这里有关于cloud ml引擎的一些文档: https://cloud.google.com/ml-engine/docs/access-control

其他Google Cloud功能的文档(概念相同): https://cloud.google.com/vision/docs/auth#using_a_service_account

顺便说一句,以防万一,函数不是必须的,我相信你可以从你的原生应用程序调用标题中传递ApiKey。

答案 1 :(得分:0)

对我来说,它的工作原理如下。在同一个Google Cloud项目中,我已经部署了ML模型(ML平台->模型)和Cloud Function,我已经创建了角色为“ Cloud ML Developer”的服务帐户。在Cloud Function配置中必须提供创建的服务帐户名称:

enter image description here 云功能代码: main.py

googleapiclient import discovery
import json

def run(request):
  request_json = request.get_json()
  if request.args and 'message' in request.args:
    return request.args.get('message')
  elif request_json and 'message' in request_json:
    return request_json['message']
  elif request_json and hasattr(request_json, "__len__"):
    res = ml_call(prepare_frame(request_json))
    return json.dumps(res) 

  else:
    return f'Request error'

def ml_call(req):    
  PROJECT = 'test_proj'
  MODEL_NAME = 'test_name'
  MODEL_VERSION = 'test_ver'
  parent = 'projects/{}/models/{}/versions/{}'.format(PROJECT, MODEL_NAME, MODEL_VERSION)

  # Build a representation of the Cloud ML API.
  ml = discovery.build('ml', 'v1')

  # Create a dictionary with the fields from the request body.
  data = {'instances': [{'input_image': req}]}

  # Create a request 
  request = ml.projects().predict(name = parent, body = data) 

  response = request.execute()
  return response

def prepare_frame(xxx):
...
  return x

requirements.txt:

google-api-python-client