Существуют модули, которые нельзя добавить непосредственно в каталог site-packages
, чтобы их можно было распознать в среде AWS Lambda. Когда это происходит, вы должны получить образ Amazon Linux из репозиториев Docker и создать свою собственную скомпилированную среду в контейнерной версии, которая будет работать на AWS Lambda
Например, если вы хотите использовать Python 3.6, хорошим выбором будет amazonlinux:2018.03
на тот случай, если вы захотите установить больше пакетов, например. Панды, Numpy, Scipy
docker run -v $(pwd):/outputs -it amazonlinux:2018.03
Поскольку Amazon Linux основан на Red Hat, вы должны установить через yum
все зависимости, когда запускаете Docker и уже создали свою виртуальную среду
yum update -y
yum install -y \
python36 \
python36-devel \
python36-virtualenv \
python34-setuptools \
gcc \
gcc-c++ \
findutils \
rsync \
Cython \
findutils \
which \
gzip \
tar \
man-pages \
man \
wget \
make \
zip
Для lxml
вам также понадобится
(lambda_docker) bash-4.2# yum install libxml2
...
(lambda_docker) bash-4.2# yum install libxslt
...
Вы устанавливаете модуль как обычно
pip3.6 install lxml
Вы должны увидеть что-то вроде
(lambda_docker) bash-4.2# pip3.6 install lxml
Collecting lxml
Downloading https://files.pythonhosted.org/packages/2d/53/34a9f0c79c548e430148837892b6ae91adee571a0e8b6c17bd7ff9c2d12e/lxml-4.3.4-cp36-cp36m-manylinux1_x86_64.whl (5.7MB)
|################################| 5.7MB 2.0MB/s
Installing collected packages: lxml
Затем создайте свою функцию lambda_function.py
и добавьте ее в zip-пакет pushd-ed и popd-ed из сеанса Docker
from lxml import etree
def lambda_handler(event, context):
print(__name__)
print(etree.LXML_VERSION)
После создания
zip -g site-packages.zip lambda_function.py
Перед загрузкой вы можете проверить, что ваш zip-файл содержит каталоги lxml
[jonathan@docker lambda_docker]$ unzip -l site-packages.zip
Archive: site-packages.zip
Length Date Time Name
--------- ---------- ----- ----
0 06-29-2019 23:09 __pycache__/
277 06-29-2019 23:09 __pycache__/easy_install.cpython-36.pyc
126 06-29-2019 23:09 easy_install.py
119 06-29-2019 23:29 lambda_function.py
0 06-29-2019 23:21 lib/
0 06-29-2019 23:39 lxml/
0 06-29-2019 23:37 lxml-4.3.4.dist-info/
4 06-29-2019 23:37 lxml-4.3.4.dist-info/INSTALLER
2954 06-29-2019 23:37 lxml-4.3.4.dist-info/METADATA
13384 06-29-2019 23:37 lxml-4.3.4.dist-info/RECORD
109 06-29-2019 23:37 lxml-4.3.4.dist-info/WHEEL
5 06-29-2019 23:37 lxml-4.3.4.dist-info/top_level.txt
7668 06-29-2019 23:37 lxml/ElementInclude.py
551 06-29-2019 23:37 lxml/__init__.py
0 06-29-2019 23:37 lxml/__pycache__/
3331 06-29-2019 23:37 lxml/__pycache__/ElementInclude.cpython-36.pyc
...
Теперь загрузите zip и создайте пустой тест {}
в вашей функции лямбда
Результат
START RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64 Version: $LATEST
lambda_function
(4, 3, 4, 0)
END RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64
REPORT RequestId: bb240a17-c2dd-4d63-92c8-fa7561c09f64 Duration: 0.30 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 50 MB
Если вы предпочитаете изображение
Отлично готов к AWS Lambda
Надеюсь, это поможет (: