S3桶上传触发Lambda函数读取JSON文件时无日志输出问题排查
问题排查与解决方案
核心原因
取消注释bucket和key的赋值代码后无日志输出,是因为这两行代码抛出了未被捕获的异常——它们不在try块范围内,异常直接导致Lambda函数崩溃,后续的print('I was triggered')根本没机会执行,所以日志毫无输出。
分步修复与实现
1. 捕获异常,先让日志正常输出
把获取bucket和key的代码移入try块内,确保异常能被捕获并打印,避免函数静默崩溃:
import boto3 import json s3 = boto3.client('s3') def LambdaHandler(event, context): try: print('I was triggered') # 移到try块内,异常可被捕获并打印 bucket = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] print(f"Bucket: {bucket}, Key: {key}") except Exception as e: print(f"Error details: {str(e)}") raise e
2. 验证Event结构是否匹配
- 如果是S3自动触发:检查S3触发器配置,确保事件类型选择的是
s3:ObjectCreated:*类事件 - 如果是手动测试:必须使用标准的S3触发格式作为测试事件,示例如下:
{ "Records": [ { "s3": { "bucket": { "name": "your-target-bucket" }, "object": { "key": "your-json-file.json" } } } ] }
3. 处理URL编码的Key值
S3触发事件中的key会自动URL编码(比如空格会变成%20),需要解码后才能正常使用:
import urllib.parse # 在获取key后添加解码逻辑 key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'])
4. 实现JSON文件读取功能
确认bucket和key正常后,添加读取S3文件的代码,完成目标需求:
import boto3 import json import urllib.parse s3 = boto3.client('s3') def LambdaHandler(event, context): try: print('I was triggered') bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key']) # 读取并解析S3中的JSON文件 response = s3.get_object(Bucket=bucket, Key=key) json_data = json.loads(response['Body'].read().decode('utf-8')) print(f"Parsed JSON content: {json_data}") # 后续业务逻辑可在此添加 except Exception as e: print(f"Error occurred: {str(e)}") raise e
额外排查点
- 确认Lambda执行角色已配置
s3:GetObject权限,且策略已正确关联 - 检查CloudWatch日志组的过滤规则,确保没有屏蔽错误日志
内容的提问来源于stack exchange,提问作者Blue Moonshine
相关产品推荐
相关产品推荐

