web-dev-qa-db-fra.com

Appeler la fonction Amazon lambda depuis l'application de nœud

Je passe par un AWS de base sur la façon de créer une fonction lambda:

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

Dans cet exemple, nous créons un service de redimensionnement d'image, une façon de le déclencher est d'écouter une image à pousser vers un compartiment S3, puis la fonction lambda sera exécutée.

Mais j'essaie de comprendre comment appeler cette fonction lambda à partir de mon application nodejs, lorsque l'utilisateur envoie une image à mon serveur de noeud, j'envoie cette image à aws lambda via REST pour être à nouveau puis recevoir le nouvel emplacement de l'image en réponse.

Y a-t-il un exemple que je peux suivre? Je suis plus intéressé par la partie réelle de l'invocation, car j'ai déjà mon service lambda opérationnel.

Merci

20
inside

Puisque vous utilisez un serveur node.js, vous pouvez simplement appeler votre lambda directement avec le SDK JavaScript AWS ( https://www.npmjs.com/package/aws-sdk ). De cette façon, vous n'avez pas à vous soucier de l'utilisation d'API Gateway.

L'appel depuis votre serveur est aussi simple que:

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

Voir le reste de la documentation du SDK ici: http://docs.aws.Amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

35
Ryan

Voici une réponse plus idomatique pour le dernier 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));
9
sdgfsdh