使用Express作为AWS Lambda的RESTful网关

时间:2018-03-13 00:41:56

标签: node.js express aws-lambda

我目前正在构建一个基于AWS lambda函数构建的应用程序,并希望将Express用作请求的中间件和网关,然后将其传递给lambda。

但是,我想知道下面的设置是否有任何风险。基本上,我定义了所有可接受的路由,使用router.all('/ *')来捕获每个请求,然后如果请求的路由在routes对象中并且请求的方法是正确的,它将验证用户然后运行lambda函数。我还将添加用于身份验证的逻辑,将数据发送到lambda等。

我的问题是:

  1. 将res对象传递给lambda执行函数是否可以接受?
  2. 在不同的地方进行身份验证会更好吗,或者在router.all函数中这样做是否可以?
  3. 使用这个简单的框架对许多请求的可伸缩性/处理有任何顾虑吗?

    const express        = require('express');
    const app            = express();
    var AWS = require('aws-sdk');
    
    var router = express.Router();
    
    const routes = {
    'lambdaFunctionA': { 'method' : 'POST', 'data' : 'body'},
    'lambdaFunctionB': {'method' : 'GET', 'data' : 'queryParams'},
    'lambdaFunctionC': {'method' : 'GET'}
    }
    
    router.all('/*', function (req, res) {
    
      const path = req.path.split('/')[1];
    
      if (path in routes) {
    
        if ( routes[path].method == req.method ) {
            //authentication logic here 
            //if authenticated, execute lambda
            executeLambda(path,someDataHere, res);
        }
        else
        {
            res.status(405).send('Method not allowed');
        }
      }
      else
      {
          res.status(404).send('Not found');
      }
    });
    
    app.use('/api', router);
    
    app.listen(8080);
    
    function executeLambda(functionName,payload, res) {
    
        var params = {
          FunctionName: functionName,
          Payload: payload
        };
    
        var lambda = new AWS.Lambda();      
        lambda.invoke(params, function (err, data) {
          if (err) {
            //need to handle errors here
            res.send(err.stack);
          } else {
            res.send(JSON.parse(data.Payload));
          }
        });
    }
    

1 个答案:

答案 0 :(得分:2)

为什么不使用express的内置功能来做这个而不是自己动手?当express附带内置的

时,无需创建自己的路由
function lambdaHandler(req, res){
    executeLambda(path, someDataHere, res);
}
function auth(next){
    //...Do auth stuff
   if(!auth) return next("router");
   next();
}
router.use(auth);
router.post("/lambdaFunctionA", lambdaHandler)
router.get("/lambdaFunctionB", lambdaHandler)
router.get("/lambdaFunctionC", lambdaHandler)

查找express middleware

通过这种方式,您可以让Express为您处理方法等,而不必自己处理。它也可以验证。

在每次请求时,它都会使用router.use(auth)中的中间件进行身份验证,然后才能进入lambdaHandler

res传递给lambda处理程序也是完美的。这只是一个对象。

作为旁注:

你见过AWS API Gateway吗?

它可以像处理用例一样处理路由并使用lambdas。无需管理自己的服务器。