You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 02:18:20