如何在Node.js AWS Lambda中验证第一个Lambda已成功连接第二个Lambda
AWS Lambda跨函数调用异常及需求实现
场景与代码
我有两个AWS Lambda函数,第一个Lambda尝试调用第二个Lambda,第一个Lambda的代码如下:
try { const requestId = `${uuidv4()}` // 生成GUID,但无法确认调用是否成功 lambda.invoke({ FunctionName: `download-lambda-fn`, InvocationType: 'Event', Payload: JSON.stringify({ path: `${APP_CONSTANTS.API_ENDPOINT_PREFIX}/download`, headers: { "Content-Type": "application/json" }, body: JSON.stringify(req?.body), httpMethod: "POST" }), }).promise(); // 即发即弃调用,不等待第二个Lambda的响应 console.log(`Your requestId : ${requestId} is being processed`); // 希望仅在成功建立连接/调用第二个Lambda时打印此消息 } catch (e) { console.log('error occured'); }
问题现象
- 首次调用第二个Lambda时:部署后首次调用,生成GUID
1xxx-xxx-xx-xx1,但第二个Lambda的CloudWatch始终无日志输出。 - 后续调用第二个Lambda时:再次调用生成新GUID
2xxx-xxx-xx-xx2,但实际执行的是1xxx-xxx-xx-xx1的请求,仅能看到该请求的日志,新请求无日志,此问题循环出现。
需求说明
仅在第一个Lambda成功与第二个Lambda建立连接时生成GUID,同时保持**即发即弃(fire and forget)**机制,不等待第二个Lambda的执行响应。
解决方案
代码修改要点
- 先等待Lambda服务确认接受调用请求(Event类型调用会立即返回,无需等待执行完成),再生成GUID。
- 使用
await处理lambda.invoke().promise(),确保捕获调用过程中的错误,同时避免Lambda上下文提前结束导致请求丢失。 - 校验Lambda服务返回的状态码(202表示请求已被接受),确认调用成功后再生成GUID。
修改后的代码
try { // 发起调用并等待Lambda服务确认请求已被接受 const invokeResponse = await lambda.invoke({ FunctionName: `download-lambda-fn`, InvocationType: 'Event', Payload: JSON.stringify({ path: `${APP_CONSTANTS.API_ENDPOINT_PREFIX}/download`, headers: { "Content-Type": "application/json" }, body: JSON.stringify(req?.body), httpMethod: "POST" }), }).promise(); // 仅当调用被成功接受时(返回202状态码),生成GUID并打印日志 if (invokeResponse.StatusCode === 202) { const requestId = `${uuidv4()}`; console.log(`Your requestId : ${requestId} is being processed`); } else { console.log(`调用未被接受,状态码:${invokeResponse.StatusCode}`); } } catch (e) { console.log('调用发生错误:', e); }
额外排查项
- 确保第一个Lambda的执行角色拥有
lambda:InvokeFunction权限,目标函数为download-lambda-fn。 - 检查第二个Lambda是否配置了CloudWatch Logs权限,以及是否有足够的并发资源处理请求。
内容的提问来源于stack exchange,提问作者micronyks
相关产品推荐
相关产品推荐

