【问题标题】:Invoking a Lambda function from within another Lambda function not getting invoked从另一个未被调用的 Lambda 函数中调用 Lambda 函数
【发布时间】:2019-07-01 05:31:52
【问题描述】:

如何在 Lambda 函数中调用 Lambda 函数?

例如,

函数1中,它将由API网关请求触发,并将调用第二个lambda函数作为事件(InvocationType = Event)。

函数2中,它将向端点发出http请求。

另外,我要在 serverless.yml 中编码吗?还是仅在 index/app/handler.js 上编码?

我在 stackoverflow 上尝试了这里的链接 -> Nodejs - Invoke an AWS.Lambda function from within another lambda function 但它不起作用。

var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();

//LAMBDA A
exports.handler = function(event, context) {
  var params = {
    FunctionName: 'Lambda_B', // the lambda function we are going to invoke
    InvocationType: 'RequestResponse',
    LogType: 'Tail',
    Payload: '{ "name" : "Yza" }'
  };

  lambda.invoke(params, function(err, data) {
    if (err) {
      context.fail(err);
    } else {
      context.succeed('Lambda_B said '+ data.Payload);
    }
  })
};

 //LAMBDA B
 exports.handler = function(event, context) {
   console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
   context.succeed('Hello ' + event.name);
 };

【问题讨论】:

    标签: javascript node.js amazon-web-services aws-lambda invoke


    【解决方案1】:

    您的问题是 lambda.invoke() 函数是非阻塞的,因此 Lambda_A 在调用 Lambda_B 之前完成了它的执行。你可以使用 Promise 来处理它。如果你是using Node.js 8.10+,你可以这样做:

    Lambda_A:

    let AWS = require('aws-sdk');
    let lambda = new AWS.Lambda();
    
    exports.handler = async (event) => {
    
        let params = {
          FunctionName: 'Lambda_B',
          InvocationType: 'RequestResponse',
          Payload: '{ "foo" : "bar" }'
        };
    
        return await lambda.invoke(params, function(err, data) {
          if (err) {
            throw err;
          } else {
            console.log('LambdaB invoked: ' +  data.Payload);
          }
        }).promise();
    };
    

    Lambda_B:

    exports.handler = async (event) => {
        return {
            statusCode: 200,
            body: JSON.stringify('Hello from Lambda_B!'),
        };
    };
    

    调用 Lambda_A 时的响应:

    {
      "StatusCode": 200,
      "ExecutedVersion": "$LATEST",
      "Payload": "{\"statusCode\":200,\"body\":\"\\\"Hello from Lambda_B!\\\"\"}"
    }
    

    调用时来自 Lambda_A 的控制台输出:

    START RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Version: $LATEST
    2019-02-07T08:07:11.154Z    016a763d-c79e-4d72-bd44-0aaa89a5efaf    LambdaB invoked: {"statusCode":200,"body":"\"Hello from Lambda_B!\""}
    END RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf
    REPORT RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf  Duration: 717.40 ms Billed Duration: 800 ms     Memory Size: 128 MB Max Memory Used: 30 MB  
    

    【讨论】:

    • 我对无服务器项目不是很熟悉,但我认为代码应该放在 handler.js 中
    • 我试过你的代码,但它给了我一个错误 Serverless Error --------------- ------------ Stack:arn:aws:cloudformation:us-east-1:376014394890:stack/lambda-test-dev/be4e1a40-29c0-11e9-8b17-0a9ef6cbb06a 处于 UPDATE_IN_PROGRESS 状态并且无法更新。
    【解决方案2】:

    您可以添加策略包括 LambdaInvoke 的用户,然后添加以下配置

    enter code var credentials = {
    accessKeyId : process.env.ACCESS_KEY,
    secretAccessKey : process.env.SECRET_KEY};   
    AWS.config.update(
    {
    "credentials":credentials,
    "region":"eu-central-1"
    });
    

    【讨论】:

      猜你喜欢
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-19
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多