【发布时间】:2020-10-15 09:19:18
【问题描述】:
我正在尝试在无服务器框架中构建一个架构,其中一个 Lambda 使用 Node.js AWS 开发工具包异步调用另一个 Lambda。我知道在异步调用时,调用 Lambda 不会等待被调用的 Lambda 运行并响应,而是会从 AWS 获得带有调用本身状态的响应。
根据我的阅读,异步调用 Lambda 的方法是在参数中使用带有 InvocationType: 'Event' 的 Lambda invoke() 方法(而不是使用 InvocationType: 'RequestResponse' 进行同步调用)。但是,我设置为InvocationType 似乎并不重要;第二个 Lambda 始终完整运行并将其响应返回给第一个,就像我设置了 InvocationType: 'RequestResponse'。
在我的serverless.yml 文件中,我有:
functions:
receive_deltas:
handler: src/record/delta_lambdas.receive
vpc: ${self:custom.vpc}
events:
- http:
method: post
path: v1/deltas
process_deltas:
handler: src/record/delta_lambdas.process
vpc: ${self:custom.vpc}
在我的 TypeScript 处理程序中,我有:
import { Lambda } from 'aws-sdk';
export const receive = async (event) => {
const { recordIds } = JSON.parse(event.body);
const lambda = new Lambda({
region: 'us-west-2',
endpoint: 'http://localhost:3003',
});
const params = {
FunctionName: 'orgconfig-dev-process_deltas',
InvocationType: 'Event',
Payload: JSON.stringify({ recordIds }),
};
lambda.invoke(params, (err, data) => {
if (err) {
console.log(err);
return failureResponse(err);
} else {
return parseResponse(data);
}
});
};
export const process = async (event) => {
console.log('running process lambda');
// process a bunch of stuff
console.log('finished processing');
};
第一个 Lambda 总是等待第二个 Lambda 完整运行,并最终得到{ StatusCode: 200, Payload: '' } 的响应。我期待一个成功的异步调用返回一个带有StatusCode: 202 的即时响应。
我错过了什么?
【问题讨论】:
标签: node.js asynchronous aws-lambda serverless-framework aws-sdk-nodejs