如何正确地从另一个 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
我尝试从“父”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