使用Google Cloud Functions API作为服务发现

时间:2018-01-31 19:24:14

标签: google-cloud-platform microservices google-cloud-functions

我们正致力于开发采用Google Cloud Functions的基于微服务的架构。

我们开发了一些功能,并希望实现发现服务。此发现服务将用于确定特定功能是否存在且是否可操作。

服务发现本身就是一个云功能。它向以下API发出休息请求,并使用函数模拟器和默认应用程序凭据成功进行本地开发。

Google为此[https://cloud.google.com/functions/docs/reference/rest/v1beta2/projects.locations.functions/get][1]

提供了API

部署到生产时,我们会收到: {"代码":401,"消息":"请求缺少必需的身份验证凭据。预期的OAuth 2访问令牌,登录cookie或其他有效的身份验证凭据。见https://developers.google.com/identity/sign-in/web/devconsole-project。"," status":" UNAUTHENTICATED" }}

云功能是无状态的,因此我无法使用我能看到的服务帐户。如何验证云函数以调用函数api以确定函数是否可用?

以下是我们在本地开发环境中完成此任务的方法:

var options = {
    method: 'get',
    uri: `https://cloudfunctions.googleapis.com/v1beta2/projects/${config.PROJECT_ID}/locations/${config.LOCATION_ID}/functions/${functionName}`
  }

  console.log (options.uri);
  request(options, function (err, res, body) {
    if (!err && res.status === 200) {
      if(typeof res.body.httpsTrigger.url !== undefined) {
        console.log('found a function');
        return cb(false, res.body.httpsTrigger.url);
      }
      else {
        console.log('no function found, looking for static content');
        return cb(true, `Service doesn't exist, returned ${res.status}`)
      }
    }
    else {
      console.log('no function found, looking for static content'); 
      return cb(true, `Service doesn't exist, returned ${res.status}`);
    }
  });

2 个答案:

答案 0 :(得分:1)

所以我终于想出了如何做到这一点。这有点黑客攻击:

  1. 下载服务帐户的JSON密钥文件。
  2. 将JSON文件添加到Function源。
  3. 安装google-auth-library NPM模块。
  4. 修改使用google-auth-library

    客户端的请求
    const keys = require('./VirtualAssistantCred.json');
    

    const {auth} = require(' google-auth-library');   const client = auth.fromJSON(keys);   client.scopes = [' https://www.googleapis.com/auth/cloud-platform'];   client.authorize()。then(function(){       const url = https://cloudfunctions.googleapis.com/v1beta2/projects/${config.PROJECT_ID}/locations/${config.LOCATION_ID}/functions/${functionName};       client.request({url},function(err,res){         if(错误){           的console.log(Error: ${err});           return cb(true,Service, ${functionName} doesn't exist, returned ${res})         } else {           的console.log(RESPONSE: ${JSON.stringify(res.data)});           的console.log(Found Service at ${res.data.httpsTrigger.url});           return cb(false,res.data.httpsTrigger.url);         }       });     }   );

答案 1 :(得分:0)

您提到的API包含方法:projects.locations.functions.get,它需要以下OAuth范围之一:

https://www.googleapis.com/auth/cloudfunctions

https://www.googleapis.com/auth/cloud-platform

您可以查看Authentication in HTTP Cloud Functions在线文档。