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

Invoke amazon lambda function from node app

本文关键字:lambda 函数 amazon 调用 节点 应用程序      更新时间:2023-09-26

我正在学习如何创建lambda函数的基本AWS:将AWS lambda与Amazon S3 一起使用

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

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

有什么我可以效仿的榜样吗?我对实际的调用部分更感兴趣,因为我已经启动并运行了lambda服务。

感谢

由于您使用的是node.js服务器,因此您可以直接使用AWS JavaScript SDK调用lambda(https://www.npmjs.com/package/aws-sdk)。通过这种方式,您不必担心使用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

以下是最新JavaScript的一个更具idomatic的答案。

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));

更新

高兴!AWS SDK现在支持承诺:

import AWS from 'aws-sdk';
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 params = {
    FunctionName: 'my-lambda-function', 
    Payload: JSON.stringify({
      'x': 1, 
      'y': 2,
      'z': 3,
    }),
  };
  const result = await (new AWS.Lambda().invoke(params).promise());
  console.log('Success!');
  console.log(result);
};
main().catch(error => console.error(error));

2023更新

您可以使用AWS JavaScript SDK 调用Lambda函数

  let bucketRegion = "AWS_BUCKET_REGION";
            let IdentityPoolId = "IDENTITY_POOLID";
            AWS.config.update({
                region: bucketRegion,
                credentials: new AWS.CognitoIdentityCredentials({
                    IdentityPoolId: IdentityPoolId
                })
            });
            let lambda = new AWS.Lambda();
            let params = {
                FunctionName: 'LAMBDA_FUNCTION_NAME', /* required */
                Payload: JSON.stringify( {
                        parameter1: value,
                        parameter2: value

                })
            };
            lambda.invoke(params,  function (err, data){
                if (err) {
                    // an error occurred
                    
                }else{
                    // successful response
                    console.log('Success, payload', data);
                   
                }
            });

       
   

AWS SDK v3更新

与文档和Isaac的回答类似,只是包括导入,以避免混淆AWS SDK v2和v3。

import { InvokeCommand, LambdaClient, LogType } from "@aws-sdk/client-lambda";
async function executeMyLambda() {
  const client = new LambdaClient({ region: "YOURREGION" });
  const command = new InvokeCommand({
    FunctionName: "YOURLAMBDANAME",
    Payload: JSON.stringify(YOURJSONINPUTOBJECT),
    LogType: LogType.Tail,
  });
  const { Payload, LogResult } = await client.send(command);
  const result = Buffer.from(Payload).toString();
  const logs = Buffer.from(LogResult, "base64").toString();
}