Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invoke amazon lambda function from node app

I am going through a basic AWS on how to create a lambda function:

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

In this example we are creating an image re-sizing service, one way to trigger it is to listen for some image to be pushed to a S3 bucket and then lambda function will be executed.

But I am trying to understand how to invoke this lambda function from my nodejs app, when user send an image to my node server, I send this image to aws lambda via REST API to be re-sized and then receive the new image location as a response.

Is there any kind of example I can follow? I am more interested in the actual invocation part, since I already have my lambda service up and running.

Thanks

like image 230
inside Avatar asked Nov 11 '15 20:11

inside


People also ask

Can AWS Lambda be called from mobile app?

You can call a Lambda function from a mobile application. Put business logic in functions to separate its development lifecycle from that of front-end clients, making mobile applications less complex to develop and maintain.

How are AWS Lambda function invoked?

You can invoke Lambda functions directly using the Lambda console, a function URL HTTP(S) endpoint, the Lambda API, an AWS SDK, the AWS Command Line Interface (AWS CLI), and AWS toolkits.


2 Answers

Since you are using a node.js server you can just invoke your lambda directly with the AWS JavaScript SDK(https://www.npmjs.com/package/aws-sdk). This way you don't have to worry about using API Gateway.

Invoking from your server is as simple as:

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

See the rest of the SDK docs here: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

like image 133
Ryan Avatar answered Sep 29 '22 00:09

Ryan


Here is an answer that is more idomatic for the latest 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)); 

Update

Rejoice! The AWS SDK now supports promises:

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)); 
like image 31
sdgfsdh Avatar answered Sep 29 '22 01:09

sdgfsdh