AWS Lambda不等待Async/Await执行、未等API响应就提前终止如何解决?
问题根本原因
你当前使用的是async类型的Lambda Handler,但S3上传调用的是回调风格API,async函数不会等待异步回调执行完成,代码执行到s3.putObject(...)调用后就直接走完了try块主逻辑,Lambda检测到主流程执行完毕就会提前终止进程,不会等待回调内的上传结果处理逻辑执行。
你之前添加的context.callbackWaitsForEmptyEventLoop = false配置反而会加剧该问题:该配置的作用是告诉Lambda调用callback后立刻冻结进程,无需等待剩余异步任务执行完成,和你需要等待上传完成的需求完全相悖。
解决方案
将S3上传改为Promise调用搭配await等待执行完成即可,async类型Handler无需额外使用callback,直接返回结果或抛出错误即可。
修正后的完整代码如下:
exports.handler = async (event, context) => { try { console.log('FETCHING RECORDS FROM DATOCMS') const allItems = await client.items.all({}, { allPages: true }) if (!fs.existsSync(backupDir)){ // Create backup directory console.log('CRETING BACKUP DIRECTORY') fs.mkdirSync(backupDir, { recursive: true }); } console.log('FILL JSON WITH RECORDS FETCHED FROM DATOCMS') fs.writeFileSync('backup/records.json', JSON.stringify(allItems, null, 2)); console.log('ADDING BACKUP FOLDER TO ZIP') zip.addLocalFolder(backupDir); const zipFileContents = zip.toBuffer(); const params = { Bucket: S3_BUCKET, Key: `backup_zip-${backupDate}`, Body: zipFileContents, ContentType: "application/zip", ContentDisposition: `attachment; filename="${fileName}-${backupDate}"` } console.log('UPLOADING ZIP TO S3', params) // 改为Promise形式调用,await等待上传完成 await s3.putObject(params).promise() console.log('Uploaded correctly') fs.rmdirSync(backupDir, { recursive: true }); return 'Success' } catch (err) { console.error('An error occurred', err) return 'Error..' } }
修正点说明
- 移除了不必要的callback参数,async类型Handler直接通过return返回执行结果
- 将回调形式的S3上传改为
.promise()调用搭配await,确保进程等待上传完成再继续执行后续逻辑 - 删除了无效的
setInterval和context.callbackWaitsForEmptyEventLoop = false配置 - 异常捕获逻辑改为直接打印错误返回结果,避免重复抛错导致异常上报混乱
内容的提问来源于stack exchange,提问作者Turkex
相关产品推荐
相关产品推荐

