2017-05-29 305 views
0

我想使用AWS lambda函数将视频上传到S3。该视频在我的本地计算机中不可用。我有'下载网址'。我不想将它下载到我的本地计算机并上传到S3。我正在寻找一个解决方案,使用lambda函数将这个视频文件直接放入S3中​​。如果我使用缓冲区或流媒体,我将消耗大量内存。有没有更好的解决方案?使用AWS lambda将视频上传到S3,下载URL为

我真的很感谢你的帮助。

+0

欢迎来到StackOverflow!你能否澄清你从哪里复制文件? –

+0

嗨,约翰,在我的项目中,我需要上传视频在API后面。这些视频在云中可用,并且我有下载URL。我需要使用Amazon lambda将其直接发送到S3,而无需在本地下载。 – Dasu

+0

当你说“视频在云中可用”时,它们到底在哪里可用?从S3,Google,Dropbox?或者只是从一些随机的URL? –

回答

0

你当然可以写一个AWS lambda函数会:

  • 从网址下载文件并使用/tmp
  • 上传其存储到亚马逊S3 AWS的S3 SDK

下载完整文件最容易,而不是尝试以“比特”的形式进行流式传输。但请注意,限制为500MB的磁盘空间可用于存储数据。如果您的下载量大于500MB,则需要进行一些创意编程才能下载部分文件,然后将其上传为多部分上传文件。

至于如何下载它,请使用您喜欢的任何库来下载网络文件。

1

我有同样的问题,并开发了以下不依赖于/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)