Node.js Lambda上传S3文件间歇性失效问题排查
AWS Lambda向S3写入日志间歇性失败的问题修复
问题描述
我使用以下Node.js代码通过AWS Lambda向S3写入日志文件,但函数仅能间歇性运行(成功率约50%),无法定位原因,请求帮助。
原代码:
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async (event) => { let key = 'log.' + Date.now() + '.txt' let data = 'How are you?' put_object('test', key, data).then((e) => { console.log(e) }) } let put_object = async (bucket, file, data) => { return await new Promise((resolve, reject) => { const params = { Body: data, Bucket: bucket, Key: file, ACL: "public-read", ContentType: "text/html" } s3.putObject(params, (err, results) => { if (err) reject(err); else resolve(results); }) }) }
问题原因
你的Lambda handler是async函数,但调用put_object时没有用await等待异步操作完成。Lambda执行环境会在handler返回后立即终止进程,这就导致S3的写入操作可能还没完成,进程就被销毁了——运气好的时候,写入操作在进程终止前完成,函数成功;运气差的时候,进程提前结束,写入失败,所以出现间歇性成功的情况。
修复方案
在调用put_object时添加await,确保Lambda等待S3写入操作完成后再结束执行。
修复后代码:
const AWS = require('aws-sdk') const s3 = new AWS.S3() exports.handler = async (event) => { let key = 'log.' + Date.now() + '.txt' let data = 'How are you?' await put_object('test', key, data).then((e) => { console.log(e) }) } let put_object = async (bucket, file, data) => { return await new Promise((resolve, reject) => { const params = { Body: data, Bucket: bucket, Key: file, ACL: "public-read", ContentType: "text/html" } s3.putObject(params, (err, results) => { if (err) reject(err); else resolve(results); }) }) }
额外优化建议
可以把.then()换成try/catch结构,更优雅地处理错误,避免未捕获的Promise异常:
exports.handler = async (event) => { let key = 'log.' + Date.now() + '.txt' let data = 'How are you?' try { const result = await put_object('test', key, data) console.log(result) } catch (err) { console.error('写入S3失败:', err) // 按需抛出错误或进行其他处理 throw err } }
内容的提问来源于stack exchange,提问作者Adrian Smith
相关产品推荐
相关产品推荐

