使用AWS Lambda将视频上传到S3并获取下载链接

8 投票
2 回答
10863 浏览
提问于 2025-05-17 16:26

我想通过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,那你就得想办法分段下载,然后再把这些部分合并上传。

至于怎么下载文件,你可以用你喜欢的任何库来下载网页文件。

撰写回答