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

AWS Lambda重复数据库记录、PDF/CSV生成及邮件发送问题求助

Lambda重复操作问题:数据库重复记录、重复生成文件与邮件的解决方法

核心原因

你的代码逻辑本身无重复执行问题,但AWS Lambda的自动重试机制是主要诱因:当函数超时、抛出未捕获异常,或上游服务未及时收到响应时,Lambda会自动重新触发执行。此外,客户端重复提交请求也可能导致该问题。

解决方案

1. 实现幂等性(彻底解决重复问题)

给请求添加唯一标识,确保同一请求只被处理一次:

  • 给数据库表的unique_number字段添加唯一约束,阻止重复插入:
    ALTER TABLE lgsandradean.sandytable ADD UNIQUE INDEX idx_unique_number (unique_number);
    
  • 在Lambda代码中捕获唯一约束冲突异常,直接返回成功响应,跳过后续操作:
    def lambda_handler(event, context):
        # ...其他初始化代码
        try:
            with pymysql.connect(host=endpoint, user=username, passwd=password, db=database_name) as connection:
                with connection.cursor() as cursor:
                    insert_query = "INSERT INTO lgsandradean.sandytable (time_stamp, unique_number, ...) VALUES (%s, %s, ...)"
                    cursor.execute(insert_query, (timestamp, unique_number, firstName, lastName, ...))
                connection.commit()
        except pymysql.IntegrityError as e:
            logger.info("重复请求,跳过处理")
            return {
                'statusCode': 200,
                'body': '请求已处理'
            }
        # ...后续CSV、PDF生成与邮件发送代码
    

2. 调整Lambda配置避免重试触发

  • 延长Lambda函数的超时时间:如果函数执行接近默认超时(3秒),调整为更合理的值(比如10秒),避免因超时触发重试
  • 捕获所有异常:确保代码中所有可能的异常都被捕获处理,防止Lambda因报错自动重试

3. 修复临时文件命名冲突

当前PDF生成路径为固定的/tmp/filled_form.pdf,并发执行时会导致文件覆盖或重复写入,改用UUID命名:

def generate_pdf_with_data(form_data):
    # ...其他代码
    filled_pdf_path = f'/tmp/filled_form_{uuid.uuid4()}.pdf'
    pdfkit.from_file(filled_html_path, filled_pdf_path, configuration=pdfkit.configuration(wkhtmltopdf='/opt/bin/wkhtmltopdf'))
    # ...其他代码

4. 客户端防重复提交

如果是用户多次点击提交按钮导致,前端添加按钮禁用逻辑:点击提交后立即禁用按钮,直到收到服务端响应。

排查建议

查看CloudWatch日志,搜索同一请求ID的多次执行记录,确认是否为Lambda重试导致。同时,不要在代码中硬编码敏感信息(如SMTP账号密码),改用AWS Secrets Manager或环境变量存储。

内容的提问来源于stack exchange,提问作者Lance Stubbs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:45:15