我们有IOT传感器,可以将wav文件上传到S3 Bucket中。
我们希望能够使用aws-lambda从上传的每个文件中提取声音特征(创建obj事件(
为此,我们需要:
- python-librosa或pyAudio分析包+numpy和scipy。(约2.4亿未洗(
- ffmpeg(~70mb未zzled(
正如您所看到的,没有办法将它们放在同一个lambda包中(最大250mb未压缩(。在收集wav文件时,我在层中不包括ffmpeg时出错:
[ERROR] FileNotFoundError: [Errno 2] No such file or directory: 'ffprobe': 'ffprobe'
这与ffmpeg有关。
我们正在寻找实施建议,我们考虑过:
将ffmpeg文件放在s3中,并在每次调用时获取它(无需将其放在层中。(如果可能的话(
链接两个lambda:1用于通过ffmpeg处理输入文件,并将输出文件放入另一个bucket>2函数调用并从处理后的数据中提取特征。(使用SNS/链接机制((如果可能的话(
- 转到EC2,在那里,当两个文件同时上传时,我们将遇到并发调用指控的问题。
必须有一种更简单的方法,在深入实施之前,我很乐意听取其他意见,谢谢大家!
场景看起来是:
- 文件随机进入
- 文件需要处理,但不能实时处理
- AWS Lambda函数所需的库太大
建议的架构:
- 配置Amazon S3事件以在文件到达时向Amazon SQS队列发送消息
- 配置Amazon CloudWatch事件以定期触发AWS Lambda功能(例如1小时(
- Lambda函数检查队列中是否有消息
- 如果有消息,它将启动一个带有用户数据脚本的Amazon EC2实例,该脚本将安装并启动处理系统
- 处理系统将:
- 从队列中获取消息
- 处理消息(不受Lambda的限制(
- 删除消息
- 如果队列中没有剩余消息,它将终止EC2实例
这可能非常具有成本效益,因为Amazon EC2 Linux实例是每秒收费的。您可以并行运行多个工人来处理消息(但在编写终止代码时要小心,以确保所有工人都已完成处理消息(。或者,如果不是时间关键型的,只需选择最小的可用实例类型并单线程即可,因为较大的实例无论如何都会花费更多的成本(因此从成本效益的角度来看,它们并没有更好(。
请确保设置监控,以确保正在处理消息。在Amazon SQS中实现死信队列以捕获无法处理的消息,并在DLQ上设置CloudWatch警报,以便在出现问题时通知您。