【问题标题】:Use AWS lambda to upload video into S3 with download URL使用 AWS lambda 通过下载 URL 将视频上传到 S3
【发布时间】:2020-04-16 10:04:08
【问题描述】:

我想使用 AWS lambda 函数将视频上传到 S3。该视频在我的本地计算机中不可用。我有“下载网址”。我不想将它下载到我的本地计算机并将其上传到 S3。我正在寻找一种使用 lambda 函数直接将此视频文件放入 S3 的解决方案。如果我使用缓冲区或流式传输,我会消耗大量内存。有没有更有效的解决方案?

非常感谢您的帮助。

【问题讨论】:

  • 欢迎来到 StackOverflow!你能澄清一下你从哪里复制文件吗?
  • 嗨,约翰,在我的项目中,我需要上传 API 后面可用的视频。这些视频在云中可用,我有下载 URL。我需要使用 Amazon lambda 将其直接发送到 S3,而无需在本地下载。
  • 当您说“视频在云中可用”时,它们究竟在哪里可用?来自 S3、谷歌、Dropbox?还是只是来自某个随机 URL?
  • 嗨,John,它们在视频会议工具云中可用。我们有 API 来访问视频详细信息。我必须把这些视频放到 S3 中。
  • @Dasu 您的问题是如何使用 lambda 下载文件以及如何使用 lambda 将它们上传到 s3?

标签: python amazon-web-services amazon-s3 aws-lambda


【解决方案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)
    

【讨论】:

  • 最佳答案!刚刚尝试了相当重的文件,它可以工作
  • 在上传之前添加一个压缩版本怎么样?
  • 无法使用 botocore 1.15.39。 AttributeError:模块“botocore.vendored.requests.packages.urllib3”没有属性“PoolManager”。经过验证的 urllib3 1.25.8 确实有它
  • 我的 lambda 与我的 S3 位于不同的帐户中。上面的代码确实将文件放入 S3,但我无法从 S3 访问它。有什么帮助吗?
【解决方案2】:

您当然可以编写一个 AWS Lambda 函数:

  • 从 URL 下载文件并存储在/tmp
  • 使用 AWS S3 开发工具包上传到 Amazon S3

下载完整文件比尝试以“位”流式传输更容易。但是,请注意500MB 的磁盘空间限制可用于存储数据。如果您的下载大于 500MB,您需要进行一些创造性的编程以下载部分内容,然后将其作为分段上传上传。

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

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2018-07-12
    • 2021-01-19
    • 2017-04-24
    • 1970-01-01
    • 2020-03-23
    • 2020-04-02
    • 2012-03-31
    相关资源
    最近更新 更多