使用AWS Lambda将视频上传到S3并获取下载链接
我想通过AWS的lambda函数把视频上传到S3存储里。这个视频不在我的电脑上,我只有一个“下载链接”。我不想先把视频下载到我的电脑再上传到S3。我希望能找到一个直接用lambda函数把这个视频文件放到S3的方法。如果我使用缓冲区或者流式传输的话,会消耗很多内存。有没有更好的高效解决方案呢?
非常感谢你的帮助。
相关问题:
- 暂无相关问题
2 个回答
26
我之前也遇到过同样的问题,于是想出了一个快速的解决方案,这个方案不受 /tmp
磁盘限制的影响。它使用下载流作为类似文件的对象。
这个方案的特点:
- 不需要额外的 Python 模块,使用的是 AWS Lambda 自带的 Python 3.6 中的 boto3 和 urllib3
- 内置了分块读取功能,适合下载大文件
- 通过 urllib3 的连接池管理,能有效利用连接和内存
使用可配置的 upload_fileobj 内置多部分和多线程上传
import boto3 import botocore.vendored.requests.packages.urllib3 as urllib3 def lambda_handler(event, context): url='http://yourdownloadurl/file.tgz' # put your url here bucket = 'aws-s3-bucket' #your s3 bucket key = 'folder/filename' #your desired s3 path or filename s3=boto3.client('s3') http=urllib3.PoolManager() s3.upload_fileobj(http.request('GET', url,preload_content=False), bucket, key)
2
你可以写一个AWS Lambda函数来完成以下事情:
- 从网址下载文件,并把它存储在
/tmp
这个地方 - 使用AWS S3的工具把文件上传到Amazon S3
下载整个文件会比试着分开下载要简单得多。不过要注意的是,存储数据的地方有500MB的限制。如果你要下载的文件超过500MB,那你就得想办法分段下载,然后再把这些部分合并上传。
至于怎么下载文件,你可以用你喜欢的任何库来下载网页文件。