Хорошо, у меня та же проблема, что и здесь: Использование pydub и AWS Lambda , но подумал, что было бы чище повторно спросить здесь, поскольку я добился некоторого прогресса (я думаю?).
Я следовал инструкциям здесь: https://medium.com/faun/how-to-use-aws-lambda-layers-f4fe6624aff1 вот так:
- Я создал файл lambda_function.py:
from python.pydub import AudioSegment
print('Loading function')
def lambda_handler(event, context):
print(event)
sound = AudioSegment.from_mp3("https://s3-eu-west-1.amazonaws.com/audio.mp3")
etc...
Используя docker, я создал зависимости с помощью этого скрипта:
#!/bin/bash
export PKG_DIR="python"
rm -rf ${PKG_DIR} && mkdir -p ${PKG_DIR}
docker run --rm -v $(pwd):/foo -w /foo lambci/lambda:build-python3.6 \
pip install -r requirements.txt --no-deps -t ${PKG_DIR}
и файл requirements.txt:
pydub
ffmpeg
Docker скачал 4 папки:
ffmpeg
ffmpeg-1.4.dist-info
pydub
pydub-0.24.1.dist-info
и я загрузил весь проект в lambda в виде zip-файла.
Когда я запускаю код, я получаю сообщение об ошибке:
/var/task/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
Я предполагаю, что Мне нужна загрузка двоичного файла ffmpeg в Lambda, но я не уверен, а если да, то не уверен, как это сделать.
Какие шаги мне не хватает?
ОБНОВЛЕНИЕ:
Итак, я изменил свой код, а также запустил его с помощью pycharm. Хотя ffmpeg и ffprobe загружены в мою лямбда-функцию, и я программно подтвердил их присутствие, они не запускаются.
Мой код теперь выглядит так:
def lambda_handler(event, context):
l = logging.getLogger("pydub.converter")
l.setLevel(logging.DEBUG)
l.addHandler(logging.StreamHandler())
AudioSegment.converter='/var/task/ffmpeg'
print(event)
print("00000")
print (os.getcwd())
print("00000")
print ("1111")
path = "/var/task"
dir_list = os.listdir(path)
print (dir_list)
print ("1111")
print ("11111111111111111")
out = check_output(['/var/task/ffprobe', 'test.mp3'])
print (out)
print ("11111111111111111")
, и это журнал ошибок cloudwatch:
00000
/var/task
00000
1111
['.DS_Store', 'ffmpeg', 'get_layer_packages.sh', 'lambda_function.py', 'lambda_function.py.orig.py', 'python', 'requirements.txt', 'test.mp3']
1111
11111111111111111
[Errno 8] Exec format error: '/var/task/ffmpeg': OSError
Traceback (most recent call last):
File "/var/task/lambda_function.py", line 32, in lambda_handler
out = check_output(['/var/task/ffmpeg', 'test.mp3'])
File "/var/lang/lib/python3.6/subprocess.py", line 356, in check_output
**kwargs).stdout
File "/var/lang/lib/python3.6/subprocess.py", line 423, in run
with Popen(*popenargs, **kwargs) as process:
File "/var/lang/lib/python3.6/subprocess.py", line 729, in __init__
restore_signals, start_new_session)
File "/var/lang/lib/python3.6/subprocess.py", line 1364, in _execute_child
raise child_exception_type(errno_num, err_msg, err_filename)
OSError: [Errno 8] Exec format error: '/var/task/ffmpeg'
Есть идеи? Я сделал исполняемые файлы ffmpeg и ffprobe с помощью chmod + x
Может ли это быть проблемой с разрешениями лямбда-выражения?