如何设置仅当90MB以上文件上传至Amazon S3时触发SNS通知
实现Amazon S3仅在大文件(>90MB)上传时触发SNS通知的方法
S3原生事件通知无法直接按文件大小过滤,需要通过Lambda函数作为中间层实现条件判断,具体步骤如下:
1. 创建/配置Lambda处理函数
Lambda负责接收S3上传事件,判断文件大小和类型后,再决定是否调用SNS发送通知。
示例Python代码
import boto3 import os sns_client = boto3.client('sns') # 从环境变量读取配置,避免硬编码 SNS_TOPIC_ARN = os.environ['SNS_TOPIC_ARN'] # 替换为你需要监控的文件扩展名 TARGET_EXTENSIONS = ['.pdf', '.zip', '.tar'] # 90MB转换为字节(1MB=1024*1024字节) MIN_SIZE_BYTES = 90 * 1024 * 1024 def lambda_handler(event, context): for record in event['Records']: bucket_name = record['s3']['bucket']['name'] object_key = record['s3']['object']['key'] object_size = record['s3']['object']['size'] # 检查文件扩展名是否匹配 if any(object_key.lower().endswith(ext) for ext in TARGET_EXTENSIONS): # 检查文件大小是否超过阈值 if object_size > MIN_SIZE_BYTES: # 构造通知内容 msg = f"检测到大文件上传:\n存储桶: {bucket_name}\n文件路径: {object_key}\n文件大小: {round(object_size/(1024*1024), 2)} MB" # 发送SNS通知 sns_client.publish( TopicArn=SNS_TOPIC_ARN, Message=msg, Subject="S3大文件上传告警" ) return {'statusCode': 200, 'body': '事件处理完成'}
配置Lambda环境变量
在Lambda函数的「配置」-「环境变量」中添加:
SNS_TOPIC_ARN:填入你已有的SNS主题ARN
配置Lambda权限
确保Lambda执行角色拥有以下权限:
sns:Publish:允许向目标SNS主题发送消息s3:GetObject(可选):若需要额外读取文件元数据时使用
示例IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "sns:Publish", "Resource": "你的SNS主题ARN" }, { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::你的存储桶名/目标文件夹前缀*" } ] }
2. 修改S3事件通知配置
- 登录S3控制台,找到目标存储桶,进入「属性」-「事件通知」
- 删除之前直接绑定SNS的通知规则
- 创建新规则:
- 事件类型选择
ObjectCreated下的具体触发场景(如Put、Post或*) - 前缀填写你要监控的文件夹路径(如
docs/) - 后缀保留你需要的文件类型(如
.pdf) - 目标选择「Lambda函数」,选中你创建的Lambda函数
- 事件类型选择
3. 测试验证
- 上传一个小于90MB的目标类型文件,确认不会收到SNS通知
- 上传一个大于90MB的目标类型文件,检查是否收到通知邮件
内容的提问来源于stack exchange,提问作者mamesaye
相关产品推荐
相关产品推荐

