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
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.
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.
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
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));
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With