如何正确地从另一个 Lambda 调用一个 Lambda

How to invoke a Lambda from another Lambda correctly

我尝试从“父”lambda 调用“子”lambda

示例代码很简单(我使用的是Serverless框架)

child_lambda

const mainHandler = async (event, context) => {
    console.log('event: ', JSON.stringify(event));    
    return context.functionName;
  };
export const handler = mainHandler;

parent_lambda

import AWS from 'aws-sdk';
const lambda = new AWS.Lambda();

const invokeLambda = async () => {
  let sampleData = { number1: 1, number2: 2 };

  let params = {
    FunctionName: 'child_lambda',
    Payload: JSON.stringify(sampleData),
    Qualifier: '1'
  };

  try {
    await lambda.invoke(params).promise();
    return true;
  } catch (e) {
    console.log('invokeLambda :: Error: ' + e);
  }
};

const mainHandler = async (event, context) => {
  console.log('event: ', JSON.stringify(event));
  await invokeLambda();
  return context.functionName;
};

export const handler = mainHandler;

serverless.yml

parent_lambda:
    handler: handlers/lambda/parent_lambda.handler
    name: dev_parent_lambda
    iamRoleStatements:
      - Effect: "Allow"        
        Action:
          - lambda: InvokeFunction
          - lambda: InvokeAsync   
        Resource: "*"
    events:
      - http:
          path: test/invokeLambda
          method: GET

child_lambda:
    handler: handlers/lambda/child_lambda.handler
    name: dev_child_lambda

我 运行 来自 Postman 的父对象,结果是

ResourceNotFoundException: Function not found: arn:aws:lambda:xxxx:xxxxx:function:dev_child_lambda

我尝试从 S3 事件触发 child_lambda,它运行良好,但从未将 invoke 作为 AWS SDK 使用。

欢迎任何建议

从评论来看,问题中给出的代码除了Qualifier参数

是完美的

限定符用于

Specify a version or alias to invoke a published version of the function.

在这种情况下,lambda 没有版本控制。因此我们只需要删除限定符 .

const invokeLambda = async () => {
  let sampleData = { number1: 1, number 2: 2 };

  let params = {
    FunctionName: 'child_lambda',
    Payload: JSON.stringify(sampleData)
  };

  try {
    await lambda.invoke(params).promise();
    return true;
  } catch (e) {
    console.log('invokeLambda :: Error: ' + e);
  }
};

Lambda Asynchronous invocation

Amazon Simple Storage Service (Amazon S3) invoke functions asynchronously to process events. When you invoke a function asynchronously, you don't wait for a response from the function code. You hand off the event to Lambda and Lambda handles the rest.

在这种情况下,我会使用 AWS lambda 目的地简单地链接 lambda。支持的目的地:

  • 亚马逊 SQS – sqs:SendMessage

  • 亚马逊社交网络 – sns:Publish

  • Lambda – lambda:InvokeFunction

  • EventBridge – events:PutEvents

Configuring destinations for asynchronous invocation

Introducing AWS Lambda Destinations