Я боролся с этим больше недели, прошел через всевозможные проблемы и сообщения на форуме и не могу решить. Я пытаюсь упаковать numpy в функцию, индивидуально создавая требования (у меня есть несколько функций с несколькими требованиями, которые я хотел бы сохранить отдельно).
Окружающая обстановка:
Windows 10 Домашняя
Docker Toolbox для Windows:
Client:
Version: 18.03.0-ce
API version: 1.37
Go version: go1.9.4
Git commit: 0520e24302
Built: Fri Mar 23 08:31:36 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
Server: Docker Engine - Community
Engine:
Version: 18.09.0
API version: 1.39 (minimum version 1.12)
Go version: go1.10.4
Git commit: 4d60db4
Built: Wed Nov 7 00:52:55 2018
OS/Arch: linux/amd64
Experimental: false
Бессерверная версия:
serverless version 6.4.1
serverless-python-requirements version 6.4.1
Структура каталогов:
|-test
|-env.yml
|-serverless.yml
|-Dockerfile
|-functions
|-f1
|-index.py
|-requirements.txt
|-sub_function_1.py
|-sub_function_2.py
|-f2
|-index.py
|-requirements.txt
|-sub_function_3.py
|-sub_function_4.py
serverless.yml
service: test
plugins:
- serverless-python-requirements
custom:
pythonRequirements:
zip: true
dockerFile: Dockerfile
dockerizePip: non-linux
provider:
name: aws
runtime: python3.6
stage: dev
environment: ${file(./env.yml):${opt:stage, self:provider.stage}.env}
region: ${file(./env.yml):${opt:stage, self:provider.stage}.aws.region}
profile: ${file(./env.yml):${opt:stage, self:provider.stage}.aws.profile}
package:
individually: true
functions:
f1:
handler:index.handler
module:functions/f1
f2:
handler:index.handleer
module:functions/f2
У меня есть файлы проекта в C: \ Serverless \ test. Я запускаю npm init, а затем npm i --save serverless-python-requirements, принимая все значения по умолчанию. Получаю на sls deploy -v следующее. хотя я добавил C: \ к общим папкам на работающей виртуальной машине по умолчанию в VirtualBox и выбрал автоматическое монтирование и постоянное.

Если я закомментирую как dockerizePip, так и dockerFile, я получу следующее, как и ожидалось, на основе здесь и других сообщений SO:
Serverless: Invoke invoke
{
"errorMessage": "Unable to import module 'index'"
}
Если я закомментирую файл докеров, я получу:
Serverless: Docker Image: lambci/lambda:build-python3.6
Error --------------------------------------------------
error during connect: Get https://XXXXXX/v1.37/version: dial tcp
XXXXXXXXXX: connectex: A connection attempt failed because the
connected party did not properly respond after a period of time, or
established connection failed because connected host has failed to
respond.
at dockerCommand (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:20:11)
at getBindPath (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:100:3)
С Dockerfile
# AWS Lambda execution environment is based on Amazon Linux 1
FROM amazonlinux:1
# Install Python 3.6
RUN yum -y install python36 python36-pip
# Install your dependencies
RUN curl -s https://bootstrap.pypa.io/get-pip.py | python3
RUN yum -y install python3-devel mysql-devel gcc
# Set the same WORKDIR as default image
RUN mkdir /var/task
WORKDIR /var/task
.
Serverless: Building custom docker image from Dockerfile...
Serverless: Docker Image: sls-py-reqs-custom
Error --------------------------------------------------
Unable to find good bind path format
For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
Stack Trace --------------------------------------------
Error: Unable to find good bind path format
at getBindPath (C:\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:142:9)
at installRequirements (C:\Serverless\test\node_modules\serverless-python-requirements\lib\pip.js:152:7)
at installRequirementsIfNeeded (C:\Serverless\test\node_modules\serverless-python-requirements\lib\pip.js:451:3)
Если я перенесу свой проект в C: \ Users \, я получу следующее:
Serverless: Docker Image: sls-py-reqs-custom
Serverless: Trying bindPath /c/Users/Serverless/test/.serverless/requirements (run,--rm,-v,/c/Users/Serverless/test/.serverless/req
uirements:/test,alpine,ls,/test/requirements.txt)
Serverless: /test/requirements.txt
Error --------------------------------------------------
docker: Error response from daemon: create "/c/Users/Serverless/test/.serverless/requirements": "\"/c/Users/Serverless/test/.serv
erless/requirements\"" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you in
tended to pass a host directory, use absolute path.
See 'docker run --help'.
For debugging logs, run again after setting the "SLS_DEBUG=*" environment variable.
Stack Trace --------------------------------------------
Error: docker: Error response from daemon: create "/c/Users/Serverless/test/.serverless/requirements": "\"/c/Users/Serverless/test/
.serverless/requirements\"" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If y
ou intended to pass a host directory, use absolute path.
See 'docker run --help'.
at dockerCommand (C:\Users\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:20:11)
at getDockerUid (C:\Users\Serverless\test\node_modules\serverless-python-requirements\lib\docker.js:162:14)
Я видел рекомендации по стилю Makefile от @brianz здесь, но я не уверен, как приспособить это к этому (Makefile не моя сильная сторона). Я немного не понимаю, что делать дальше, и я буду благодарен за совет. TIA.






Мне не удалось заставить плагин работать, но я все равно нашел лучшее решение - Lambda Layers. Это бонус, поскольку он уменьшает размер лямбда-выражения и позволяет повторно использовать код / файл. Существует предварительно созданный слой лямбда для numpy и scipy, который вы можете использовать, но я создал свой собственный, чтобы показать себе, как все это работает. Вот как я заставил это работать:
Создайте пакет слоя:
Сделайте zip-архив пакета зависимостей - необходимо использовать структуру каталогов python/lib/python3.6/site-packages для поиска python во время выполнения.
mkdir -p tmpdir/python/lib/python3.6/site-packages
pip install -r requirements.txt --no-deps -t tmpdir/python/lib/python3.6/site-packages
cd tmpdir zip -r ../py_dependencies.zip .
cd ..
rm -r tmpdir
Передача ZIP-архива в AWS - требуется последняя версия awscli
sudo pip install awscli --upgrade --user
sudo aws lambda publish-layer-version \
--layer-name py_dependencies \
--description "Python 3.6 dependencies [numpy=0.15.4]" \
--license-info "MIT" \
--compatible-runtimes python3.6 \
--zip-file fileb://py_dependencies.zip \
--profile python_dev_serverless
Чтобы использовать в любой функции, которая требует numpy, просто используйте arn, который отображается в консоли или во время загрузки выше
f1:
handler: index.handler_f_use_numpy
include:
- functions/f_use_numpy.py
layers:
- arn:aws:lambda:us-west-2:XXXXX:layer:py_dependencies:1
В качестве дополнительного бонуса вы также можете помещать в слой общие файлы, такие как константы. Вот как я сделал это для тестирования использования в Windows и лямбда-выражениях:
import platform
\# Set common path
COMMON_PATH = "../../layers/common/"
if platform.system() == "Linux": COMMON_PATH = "/opt/common/"
def handler_common(event, context):
# Read from a constants.json file
with open(COMMON_PATH + 'constants.json') as f:
return text = json.load(f)
когда у меня возникла такая же проблема, я открыл докер, пошел в настройки / общий диск решил сбросить учетные данные и после применения моих изменений, и это устранило ошибку
Я исправил эту проблему, временно отключив брандмауэр Windows.