S3上传无法触发AWS Lambda导致Kibana无数据问题求助
排查S3触发Lambda失效的实操方案
我之前搭建类似数据流时也碰到过一模一样的问题,结合你的场景,给你梳理几个核心排查步骤,一步步定位问题:
1. 先确认S3事件通知配置是否正确
- 检查存储桶的事件类型:Kinesis Firehose是通过
PutObject写入S3的,所以你得确保事件通知选了All object create events,或者至少勾选了Put操作,别漏选了触发类型。 - 核对目标Lambda:确认事件通知的目标是你用来转发数据的那个Lambda函数,ARN别填错,也别不小心选成了其他函数。
- 过滤规则检查:如果Firehose写入的文件有特定前缀(比如
twitter-data/)或后缀(比如.json.gz),你的事件通知过滤规则要完全匹配,不然S3会忽略这些文件的触发请求。
2. 验证Lambda的权限配置
- 检查Lambda的资源策略:必须允许S3调用这个函数,你可以在Lambda控制台的「配置」→「权限」→「资源策略」里查看,确保有类似这样的语句:
{ "Version": "2012-10-17", "Id": "S3InvokeLambdaPolicy", "Statement": [ { "Sid": "AllowS3Trigger", "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:你的区域:账号ID:function:你的Lambda函数名", "Condition": { "ArnLike": { "AWS:SourceArn": "arn:aws:s3:::你的S3存储桶名" } } } ] }
- 确认Lambda执行角色权限:这个角色需要能读取S3里的文件(因为要把Firehose写入的数据拿出来转发到ES),所以权限里必须包含
s3:GetObject和s3:GetObjectVersion这两个动作。
3. 用CloudWatch日志找线索
- 先看Lambda的日志组:如果S3触发了Lambda,哪怕函数执行失败,CloudWatch里也会有日志记录。如果完全没有日志,说明S3根本没触发Lambda;如果有日志,直接看里面的错误信息(比如权限不足、数据解析失败等)。
- 再查S3的访问日志:确认Firehose确实在往桶里写文件,同时看看有没有触发事件的相关记录,排除Firehose写入异常的可能。
4. 检查Firehose的缓冲配置
- Firehose默认的缓冲时间是15分钟,如果你的测试数据量不大,可能要等很久才会生成一个文件触发Lambda。可以临时把缓冲时间调小(比如1分钟),测试是否能快速触发Lambda,验证流程是否通顺。
- 核对Firehose的文件路径:如果Firehose写的文件带时间前缀(比如
year=2024/month=05/...),要确保S3事件通知的前缀过滤规则能匹配上这个路径,不然也不会触发。
5. 手动触发Lambda做测试
- 从Lambda控制台的「测试」功能里,选「S3 Put」模板,修改桶名和对象键为你S3里实际存在的Firehose文件路径,手动执行函数。如果手动执行能成功把数据同步到ES,说明问题出在S3触发环节;如果手动执行失败,那先解决Lambda本身的逻辑或权限问题。
内容的提问来源于stack exchange,提问作者Graham Hesketh
相关产品推荐
相关产品推荐

