Собственные библиотеки компиляции python для бессерверных приложений с требованиями serverless-python

Я пытаюсь скомпилировать numpy для использования в функциях AWS Lambda с моей машины с Windows.

Я следил за этим простым примером serverless-python-requirements для лямбда-выражения для печати массива numpy.

Я запускаю serverless deploy из virtualenv в моем локальном каталоге ../numpy-test

(numpy-test) C:\Users\...\numpy-test>serverless deploy
Serverless: Generated requirements from C:\Users\...\numpy-test\requirements.txt in C:\Users\...\numpy-test\.serverless\requirements.txt...
Serverless: Installing requirements from C:\Users\...\numpy-test\.serverless\requirements\requirements.txt ...
Serverless: Packaging service...
Serverless: Excluding development dependencies...
Serverless: Injecting required Python packages to package...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading artifacts...
Serverless: Uploading service .zip file to S3 (42.86 MB)...
Serverless: Validating template...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...

Мой файл requirements.txt просто содержит

numpy==1.13.1

и мой файл YML выглядит так:

service: numpy-test 

frameworkVersion: ">=1.1.0 <2.0.0"

plugins:
  - serverless-domain-manager
  - serverless-python-requirements
custom:
  pythonRequirements:
    dockerizePip:non-linux

  stage: ${opt:stage, self:provider.stage}
  domains:
    prod: ...
    staging: ...
    dev: ...

Когда я пытаюсь протестировать функцию после загрузки с помощью serverless invoke -f numpy --log, я получаю следующую ошибку

    "errorMessage": "Unable to import module 'handler'"
}
--------------------------------------------------------------------
START RequestId: 24584f5c-5145-4694-b21b-7c6e4700f985 Version: $LATEST
Unable to import module 'handler':
Importing the multiarray numpy extension module failed.  Most
likely you are trying to import a failed build of numpy.
If you're working with a numpy git repo, try `git clean -xdf` (removes all
files not under version control).  Otherwise reinstall numpy.

Original error was: cannot import name 'multiarray'

Когда я загружаю зависимости непосредственно из AWS lambda, похоже, что пакет скомпилирован в Windows.

введите здесь описание изображения

У меня установлен Docker, и, насколько я могу судить, он работает правильно. Я не использовал его раньше, поэтому я пытаюсь использовать это решение, а не изучать множество новых команд в Docker.

Что не так?


person deseosuho    schedule 04.02.2019    source источник


Ответы (1)


Я не уверен, что именно происходит в вашем случае, но если вы хотите использовать numpy в Lambda, посмотрите Лямбда-слои и официальный (AWS) уровень с numpy и scipy.

Чтобы использовать его, добавьте layers раздел. к функции в вашем serverless.yml

functions:
  myFunction:
    layers:
      - arn:aws:lambda:us-east-1:668099181075:layer:AWSLambda-Python36-SciPy1x:2

Возможно, вам придется изменить ARN в зависимости от целевого региона AWS.

person Milan Cermak    schedule 04.02.2019
comment
Я буду смотреть в него. Я пытаюсь решить общий случай нативной компиляции для произвольных зависимостей, поэтому я не смогу использовать предварительно созданные слои, как в простейшем примере, но это очень похоже на идею лямбда-слоев. Просто нужно выяснить, как успешно скомпилировать зависимости в совместимом с AWS контейнере xD. - person deseosuho; 04.02.2019