从节点应用程序调用amazon lambda函数

时间:2015-11-11 20:16:22

标签: javascript node.js amazon-web-services aws-lambda

我正在浏览一个关于如何创建lambda函数的基本AWS:

http://docs.aws.amazon.com/lambda/latest/dg/walkthrough-s3-events-adminuser-create-test-function-create-function.html

在这个例子中,我们正在创建一个图像重新调整大小的服务,触发它的一种方法是监听一些图像被推送到S3存储桶然后执行lambda函数。

但是我试图理解如何从我的nodejs应用程序调用这个lambda函数,当用户将图像发送到我的节点服务器时,我通过REST API将此图像发送到aws lambda以重新调整大小然后接收新的图像位置作为响应。

我可以效仿任何一个例子吗?我对实际的调用部分更感兴趣,因为我已经启动并运行了我的lambda服务。

由于

2 个答案:

答案 0 :(得分:34)

由于您使用的是node.js服务器,因此您只需使用AWS JavaScript SDK(https://www.npmjs.com/package/aws-sdk)直接调用lambda即可。这样您就不必担心使用API​​网关了。

从您的服务器调用非常简单:

var AWS = require('aws-sdk');

// you shouldn't hardcode your keys in production! See http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
AWS.config.update({accessKeyId: 'akid', secretAccessKey: 'secret'});

var lambda = new AWS.Lambda();
var params = {
  FunctionName: 'myImageProcessingLambdaFn', /* required */
  Payload: PAYLOAD_AS_A_STRING
};
lambda.invoke(params, function(err, data) {
  if (err) console.log(err, err.stack); // an error occurred
  else     console.log(data);           // successful response
});

请在此处查看SDK文档的其余部分:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

答案 1 :(得分:7)

这是一个对最新的JavaScript更具风格的答案。

import AWS from 'aws-sdk';

const invokeLambda = (lambda, params) => new Promise((resolve, reject) => {
  lambda.invoke(params, (error, data) => {
    if (error) {
      reject(error);
    } else {
      resolve(data);
    }
  });
});

const main = async () => {

  // You shouldn't hard-code your keys in production! 
  // http://docs.aws.amazon.com/AWSJavaScriptSDK/guide/node-configuring.html
  AWS.config.update({ 
    accessKeyId: 'AWSAccessKeyId', 
    secretAccessKey: 'AWSAccessKeySecret', 
    region: 'eu-west-1',
  });

  const lambda = new AWS.Lambda();

  const params = {
    FunctionName: 'my-lambda-function', 
    Payload: JSON.stringify({
      'x': 1, 
      'y': 2,
      'z': 3,
    }),
  };

  const result = await invokeLambda(lambda, params);

  console.log('Success!');
  console.log(result);
};

main().catch(error => console.error(error));