上传至S3存储桶子文件夹时AWS Lambda触发器不生效问题咨询
问题解答
S3的Lambda触发器完全支持任意层级的前缀、后缀过滤规则,不存在仅支持绑定存储桶根目录的限制。你遇到的无法触发问题可按以下优先级排查:
- 前缀配置格式错误:检查你填写的前缀是否为精确的
uploads/,不要添加前导斜杠,S3的对象键不存在根斜杠概念,若错误填写为/uploads/,会完全匹配不到uploads/路径下的对象,导致触发器不生效。 - 触发事件类型不匹配:确认你选择的触发事件覆盖了实际的上传场景,若你使用分段上传、控制台拖拽上传等操作,仅勾选
s3:ObjectCreated:Put事件不会触发,建议直接勾选所有ObjectCreated类事件,覆盖Put、Post、Copy、CompleteMultipartUpload全场景。 - 事件规则冲突:检查当前S3桶的事件通知配置,是否存在其他同前缀的触发器规则、或者已禁用的同前缀规则,同前缀的规则冲突会导致触发逻辑异常。
- 权限配置问题:确认Lambda执行角色的IAM权限包含
uploads/路径下的s3:GetObject权限,若之前的权限仅开放了根目录的读取权限,触发器触发后函数会直接报错退出,表面看起来和未触发效果一致,可查看Lambda对应的CloudWatch日志确认是否有权限类报错。
代码潜在问题修复
你当前提供的代码在处理uploads/路径下的文件时会出现本地路径不存在的报错:当上传文件的key为uploads/xxx.jpg时,直接拼接生成的/tmp/{uuid}uploads/xxx.jpg路径要求/tmp/uploads目录存在,而Lambda默认/tmp目录下没有该子目录,会导致下载失败。修正后的参考代码如下:
import os import uuid import boto3 s3_client = boto3.client('s3') def lambda_handler(event, context): for record in event["Records"]: bucket = record["s3"]["bucket"]["name"] key = record["s3"]["object"]["key"] # 提取文件名避免嵌套路径问题,也可根据需求保留原路径提前创建目录 file_suffix = os.path.basename(key) download_path = f"/tmp/{uuid.uuid4()}_{file_suffix}" upload_path = f"/tmp/resized_{file_suffix}" s3_client.download_file(bucket, key, download_path) # 后续图片处理、上传逻辑
内容的提问来源于stack exchange,提问作者WayBehind
相关产品推荐
相关产品推荐

