Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Serverless Lambda invoking Lambda. Getting no errors but a empty response

Now day we can use the AWS StepFunctions if we want to make an lambda function to call another one. But for now I need do support the code in production that was written before the StepFunctions time. For that reason I need to understand how it works. I was trying to create a very simple lambda calling another lambda function trough AWS-SDk.

I have the follow serverless.yml

service: lambdaCallLambda

provider:
  name: aws
  runtime: nodejs6.10

functions:
  hello:
    handler: handler.hello
  funcOne:
    handler: handler.funcOne  
  funcTwo:
    handler: handler.funcTwo

#Must install aws-sdk.  #npm install --save aws-sdk

And this is the handler.js:

'use strict';


//https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
var Lambda = require('aws-sdk/clients/lambda');


module.exports.hello = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'hello',
      input: event,
    }),
  };

  callback(null, response);
};


module.exports.funcOne = (event, context, callback) => { 
  var text='';
  var i = 0;
  for (i = 0; i < 5; i++) {
    text += "The number is " + i + "\n";
  }
  console.log(text);


  //https://docs.aws.amazon.com/general/latest/gr/rande.html
  const lambda = new Lambda({
    region: 'us-east-1'
  });
  console.log('control 3');



  /*

    https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#constructor-property
    To invoke a Lambda function
    This operation invokes a Lambda function

    https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html
    Payload - JSON that you want to provide to your Lambda function as input.

  */
  var params = {
    ClientContext: "lambdaCallLambda", 
    FunctionName: "lambdaCallLambda-dev-funcOne", 
    InvocationType: "Event", 
    LogType: "Tail", 
    Payload: '{"jsonKey2":123}', 
    Qualifier: "1"
  };
  lambda.invoke(params, function(err, data) {
    if (err){
      console.log('control error\n');
      console.log(err, err.stack); // an error occurred
    } 
    else{
      console.log('control OK\n');
      console.log(data);           // successful response
    }     
    /*
    data = {
      FunctionError: "", 
      LogResult: "", 
      Payload: <Binary String>, 
      StatusCode: 123
    }
    */
  });  
};


module.exports.funcTwo = async (event, context) => { 
  return 2;
  //return '{"funcTwo":20000}';
  //console.log("funcTwo = " + event);
};  

After deploy sls deploy and call funcOne I get this 2 outputs:

LOCAL: sls invoke local --function funcOne

Serverless: INVOKING INVOKE
The number is 0
The number is 1
The number is 2
The number is 3
The number is 4

control 3
control OK

{ StatusCode: 202, Payload: '' }

Invoking remotely in AWS: sls invoke --function funcOne

{
    "errorMessage": "Unexpected token (",
    "errorType": "SyntaxError",
    "stackTrace": [
        "                               ^",
        "SyntaxError: Unexpected token (",
        "createScript (vm.js:56:10)",
        "Object.runInThisContext (vm.js:97:10)",
        "Module._compile (module.js:542:28)",
        "Object.Module._extensions..js (module.js:579:10)",
        "Module.load (module.js:487:32)",
        "tryModuleLoad (module.js:446:12)",
        "Function.Module._load (module.js:438:3)",
        "Module.require (module.js:497:17)",
        "require (internal/module.js:20:19)"
    ]
}

  Error --------------------------------------------------

  Invoked function failed

     For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.

  Get Support --------------------------------------------
     Docs:          docs.serverless.com
     Bugs:          github.com/serverless/serverless/issues
     Issues:        forum.serverless.com

  Your Environment Information -----------------------------
     OS:                     linux
     Node Version:           8.11.3
     Serverless Version:     1.29.2

Does someone knows hat is happening here? Specially for the first scenario where I dont have any error. This is what I get from the documentation

Parameters:

err (Error) — the error object returned from the request. Set to null if the request is successful.
data (Object) — the de-serialized data returned from the request. Set to null if a request error occurs. The data object has the following properties:
Status — (Integer)
It will be 202 upon success.

Update

After Eduardo Díaz suggestion - I have changed lambda.invoke to:

lambda.invoke({
    FunctionName: 'lambdaCallLambda-dev-funcOne',
    Payload: JSON.stringify(event, null, 2)
  }, function(error, data) {
    if (error) {
      console.log('control ErrorFoncOne\n');
      context.done('error', error);
    }
    if(data.Payload){
     console.log('control SuccessFoncOne\n'); 
     context.succeed(data)
    }
  });

And this what I get for Local and Remote:

{
    "errorMessage": "Unexpected token (",
    "errorType": "SyntaxError",
    "stackTrace": [
        "Module.load (module.js:487:32)",
        "tryModuleLoad (module.js:446:12)",
        "Function.Module._load (module.js:438:3)",
        "Module.require (module.js:497:17)",
        "require (internal/module.js:20:19)"
    ]
}

It is a SyntaxError. There is a "(" somewhere. I have found another developer with the same error here.

Note:

No error logs in CloudWatch

like image 688
IgorAlves Avatar asked Aug 15 '26 10:08

IgorAlves


1 Answers

just a change of one line would get you the respose do change in params

    'use strict';


   //https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
    var Lambda = require('aws-sdk/clients/lambda');


    module.exports.hello = (event, context, callback) => {
     const response = {
     statusCode: 200,
     body: JSON.stringify({
     message: 'hello',
     input: event,
      }),
     };

    callback(null, response);
    };


   module.exports.funcOne = (event, context, callback) => { 
    var text='';
    var i = 0;
    for (i = 0; i < 5; i++) {
    text += "The number is " + i + "\n";
     }
     console.log(text);


      //https://docs.aws.amazon.com/general/latest/gr/rande.html
     const lambda = new Lambda({
     region: 'us-east-1'
      });
      console.log('control 3');

             
         var params = {
          ClientContext: "lambdaCallLambda", 
          FunctionName: "lambdaCallLambda-dev-funcOne", 
          InvocationType: "RequestResponse", /* changed this line from 
                                 "Event" to "RequestResponse"*/
          LogType: "Tail", 
          Payload: '{"jsonKey2":123}', 
          Qualifier: "1"
           };
       lambda.invoke(params, function(err, data) {
        if (err){
        console.log('control error\n');
        console.log(err, err.stack); // an error occurred
        } 
      else{
        console.log('control OK\n');
        console.log(data);           // successful response
        }     
       /*
       data = {
       FunctionError: "", 
       LogResult: "", 
       Payload: <Binary String>, 
       StatusCode: 123
          }
           */
       });  
      };


    module.exports.funcTwo = async (event, context) => { 
     return 2;
    //return '{"funcTwo":20000}';
    //console.log("funcTwo = " + event);
     };  
like image 168
Shravan Kumar L.P Avatar answered Aug 18 '26 03:08

Shravan Kumar L.P



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!