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
相关产品推荐
相关产品推荐

