Я хочу загрузить видео в S3, используя функцию AWS лямбда. Это видео недоступно на моем локальном компьютере. У меня есть «URL для загрузки». Я не хочу загружать его на свой локальный компьютер и загружать в S3. Я ищу решение для непосредственного размещения этого видеофайла в S3 с использованием лямбда-функции. Если я использую буфер или потоковую передачу, я буду использовать много памяти. Есть ли более эффективное решение для этого?

Я действительно ценю твою помощь.

3
Dasu 29 Май 2017 в 05:09

2 ответа

Лучший ответ

Вы, конечно, могли бы написать лямбда-функцию AWS, которая бы:

  • Загрузите файл с URL-адреса и сохраните его в /tmp
  • Загрузить на Amazon S3 с помощью AWS S3 SDK

Было бы проще загрузить полный файл, чем пытаться передать его в битах. Однако обратите внимание, что для хранения данных доступно ограничение в 500 МБ дискового пространства . Если размер загружаемого вами файла превышает 500 МБ, вам необходимо выполнить творческое программирование, чтобы загрузить его части, а затем загрузить его как загрузку из нескольких частей.

Что касается того, как загрузить его, используйте любую библиотеку, которую вы предпочитаете для загрузки веб-файла.

1
John Rotenstein 29 Май 2017 в 04:59

У меня был тот же вопрос, и я разработал следующее быстрое решение, которое не зависит от ограничений диска /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)
    
11
Reza Hashemi 10 Дек 2017 в 07:15