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

8
我希望能够使用AWS lambda函数将视频上传到S3。这个视频不在我的本地电脑上,我只有一个'下载URL'。我不想先下载到本地电脑,再上传到S3。我正在寻找一种直接使用lambda函数将此视频文件放入S3的解决方案。如果使用缓冲或流式传输,会消耗大量内存。有没有更好更高效的解决方案呢?非常感谢您的帮助。

欢迎来到StackOverflow!您能否澄清一下您正在从哪里复制文件? - John Rotenstein
嗨John,我的项目需要上传视频,这些视频可以在API的后面获得。这些视频位于云端,并且我有下载链接。我需要直接将它发送到Amazon Lambda上的S3而无需在本地下载它。 - Dasu
当你说“视频可在云中使用”时,它们确切地在哪里可以使用?是从S3、Google、Dropbox还是一些随机的URL? - John Rotenstein
嗨John,它们可以在视频会议工具的云中使用。我们有API来访问视频详细信息。我必须将这些视频放入S3中。 - Dasu
@Dasu 你的问题是如何使用Lambda下载文件并如何使用Lambda将它们上传到S3吗? - Usman Mutawakil
嗨Usman,我的问题是使用“下载URL”直接下载文件到S3。我不想将它们下载到本地再上传到S3。我想检查AWS Lambda是否能够处理下载链接并将文件直接传输到S3。 - Dasu
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)
    

最佳答案!刚试了一下很大的文件,它可以工作。 - Pak
上传前先压缩文件,这个版本怎么样? - user433342
4
不适用于botocore 1.15.39。AttributeError:模块“botocore.vendored.requests.packages.urllib3”没有属性“PoolManager”。已验证urllib3 1.25.8确实具有它。 - lobi
我的Lambda位于与我的S3不同的账户中。上面的代码确实将文件放入了S3,但我无法从S3访问它。有什么帮助吗? - elfersi

2
您可以编写一个AWS Lambda函数,实现以下功能:
  • 从URL下载文件并将其存储在/tmp
  • 使用AWS S3 SDK上传到Amazon S3
最好下载完整的文件而不是尝试以“位”为单位流式传输。但是,请注意,可用于存储数据的磁盘空间限制为500MB。如果您要下载的文件大于500MB,则需要进行一些创意编程,将其下载为多部分上传。
至于如何下载文件,请使用您喜欢的任何库来下载Web文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接