Je voulais enregistrer un module que j'utilise souvent dans l'environnement d'exécution Python d'AWS Lambda avec Lambda Layers, mais je l'ai rendu possible avec Docker car il est difficile de lancer une instance EC2 et de créer un package.
/ opt
au moment de l'exécution et les rendra disponibles au moment de l'exécution.
--Si vous placez le module dans le répertoire avec le nom spécifié pour chaque langue, il transmettra le chemin afin qu'il puisse être lu à partir de la fonction Lambda.python
dans le zip de la couche, vous pouvez charger ce module avec ʻimport` du côté de la fonction Lambda.Pour plus d'informations: AWS Lambda Layer --AWS Lambda
Le runtime Python 3.8 semble fonctionner sur Amazon Linux 2 [^ runtime], vous devez donc normalement configurer une instance EC2 sur Amazon Linux 2 et y créer des couches (bien que Linux puisse être autre chose). , Au moins les couches créées avec macOS ne fonctionnent pas avec AWS Lambda [^ macos]), mais en fait Amazon Linux a une image officielle distribuée sur Docker Hub [^ dockerhub], alors installez Python 3.8 basé sur ce [^ dockerhub] Si vous créez une image Docker, vous n'avez pas besoin de configurer une instance EC2.
[^ runtime]: AWS Lambda Runtime-AWS Lambda [^ macos]: Mac mais je veux AWS Lambda avec Python! --Qiita
Dockerfile
FROM amazonlinux:2
ARG PYTHON_VERSION=3.8.2
RUN yum update -y && yum install -y tar gzip make gcc openssl-devel bzip2-devel libffi-devel \
&& curl https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tgz | tar xz \
&& cd Python-${PYTHON_VERSION} && ./configure && make && make install \
&& cd - && rm -rf Python-${PYTHON_VERSION}
ADD entrypoint.sh /
RUN yum install -y zip \
&& mkdir /python \
&& chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Dans Entrypoint, enregistrez un script que pip installe et zippez-le.
entrypoint.sh
#!/bin/bash -eu
SRC=/python
DIST=/dist/layer.zip
pip3 install -t ${SRC} $@
rm -f ${DIST}
zip -q -r ${DIST} ${SRC}
Construisez l'image.
$ docker build . -t bundle-pip-modules-for-aws-lambda-layers:python3.8
Il semble que le nom de l'image soit long, mais tout va bien ici.
Par exemple, lors de la création d'une couche Lambda qui peut utiliser Pandas.
$ docker run --rm \
-v $(pwd):/dist \
bundle-pip-modules-for-aws-lambda-layers:python3.8 \
pandas
En cas de succès, layer.zip
sera créé dans le répertoire courant.
Dans l'exemple ci-dessus, pandas
a été spécifié directement, mais puisque tous les arguments qui peuvent être spécifiés par pip3 install
peuvent être passés pour les arguments après le nom de l'image, par exemple, montez requirements.txt, puis spécifiez l'option -r
. Vous pouvez également combiner de nombreux modules dans une couche avec.
$ echo 'pandas' > requirements.txt
$ docker run --rm \
-v $(pwd)/requirements.txt:/requirements.txt \
-v $(pwd):/dist \
bundle-pip-modules-for-aws-lambda-layers:python3.8 \
-r requirements.txt
Téléchargez le fichier "layer.zip" créé.
À titre d'exemple le plus simple, créons une fonction Lambda qui ne fait que charger des Pandas.
lambda_function.py
import pandas
def lambda_handler(event, context):
pass
Ajoutez le calque enregistré à la fonction Lambda créée.
Si vous essayez d'exécuter cette fonction Lambda et qu'aucune erreur ne se produit, c'est OK.
Recommended Posts