AWS Lambda未执行完代码就终止,无法获取转换文件URL
AWS Lambda提前终止无法获取转换文件URL的原因及修复
核心原因
你的Lambda handler是async函数,但后续的异步操作没有被正确等待,导致Lambda提前终止:
fs.writeFile是回调式API,不会返回Promise,handler执行到这里时不会等待文件写入完成,直接继续执行后续代码,很快就走完整个handler函数,触发Lambda的终止流程。- 就算文件写入完成后调用的
convertapi.convert返回了Promise,你也只是用.then()注册了回调,没有用await等待这个转换操作完成,Lambda依然不会等它执行完就终止。
修复方案
把回调式的文件写入操作换成Promise版本,并用await等待所有异步步骤完成,确保Lambda会等到所有流程结束再终止:
修复后的代码示例:
import fs from 'fs/promises'; // 使用Promise版本的fs模块 export const handler = async (event, context) => { // 获取S3中的对象 const bucket = "s3fileconverterinput"; const key = event.Records[0].s3.object.key; const file = await getObject(bucket, key); console.log(file); const filePath = "/tmp/" + key; try { // 等待文件写入完成 await fs.writeFile(filePath, file); console.log("File saved successfully!"); // 等待格式转换完成并获取结果 const result = await convertapi.convert("pdf", { File: filePath }); console.log("Converted file url: " + result.file.url); // 可选:返回转换后的URL给调用方 return { statusCode: 200, body: JSON.stringify({ convertedUrl: result.file.url }) }; } catch (err) { // 处理错误,避免静默失败 console.error("处理过程出错:", err); throw err; // 抛出错误让Lambda标记为执行失败 } };
补充说明
Lambda的async handler会严格等待所有被await的Promise完成后,才会结束整个执行流程。如果有异步操作没被await或者没有返回对应的Promise,Lambda会判定handler已经执行完毕,立刻终止运行,导致后续的文件写入、格式转换等操作还没完成就被中断。
内容的提问来源于stack exchange,提问作者DSATH
相关产品推荐
相关产品推荐

