如何阻止AWS Lambda函数发生递归调用?
解决AWS Lambda递归调用问题
问题背景
Lambda函数负责读取S3桶中的Excel文件,处理后生成HTML文件上传到另一个S3桶,预期执行一次后返回URL退出。但实际出现递归调用,第二次执行时因event['status']缺失触发异常,根源是上传HTML文件的操作触发了Lambda的S3触发器。
原因分析
你的Lambda函数被配置了**写入结果的S3桶(write-excel-file-bucket)**的触发器,导致每次上传HTML文件时,都会触发Lambda再次执行。而S3触发事件的event结构和手动调用时的结构完全不同,没有status字段,因此抛出异常。
解决方案
1. 修正S3触发器配置
- 进入Lambda函数的触发器配置页面,移除write-excel-file-bucket的触发器绑定
- 仅保留read-data-s3桶的触发器(如果是该桶触发初始执行),确保只有源数据桶的文件上传才会触发处理逻辑
2. 增强函数的事件兼容性
即使触发器配置出现疏漏,也能通过代码避免递归执行和异常:
- 判断事件来源:如果是S3触发的事件,直接返回不执行处理逻辑
- 给
status字段设置默认值,避免缺失时抛出异常
修改后的代码
Lambda处理函数
def lambda_handler(event, context): try: # 识别S3触发事件,直接返回避免递归 if 'Records' in event and len(event['Records']) > 0: record_source = event['Records'][0].get('eventSource') if record_source == 'aws:s3': return {"statusCode": 200, "message": "S3 trigger event skipped"} # 兼容无status字段的情况,默认设为0 status = int(event.get('status', 0)) if status: Reading_Bucket_Name = 'read-data-s3' Writing_Bucket_Name = 'write-excel-file-bucket' rowDataFile = 'Analyse.xlsx' HTMLfileName = 'index.html' url = loading_function(Reading_Bucket_Name=Reading_Bucket_Name, Writing_Bucket_Name=Writing_Bucket_Name, rowDataFile=rowDataFile, HTMLfileName=HTMLfileName) return {"statusCode": 200, "URL": url} else: return {"statusCode": 400, "Error": "The code could not be executed"} except Exception as e: print('#________ 处理过程中出现错误 ________#') print(e) raise e
上传文件代码(无需修改)
s3_client = boto3.client('s3') fig.write_html('/tmp/' + HTMLfileName, auto_play=False) response = s3_client.upload_file('/tmp/' + HTMLfileName, Writing_Bucket_Name, HTMLfileName, ExtraArgs={'ACL':'public-read', 'ContentType':'text/html'}) return True
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

