Ich wollte ein Modul registrieren, das häufig in der Python-Laufzeit von AWS Lambda mit Lambda Layers verwendet wird. Da es jedoch schwierig ist, eine EC2-Instanz zu starten und ein Paket zu erstellen, habe ich dies mit Docker ermöglicht.
Weitere Informationen: AWS Lambda Layer --AWS Lambda
Die Python 3.8-Laufzeit scheint unter Amazon Linux 2 [^ Laufzeit] zu laufen, daher sollten Sie normalerweise eine EC2-Instanz unter Amazon Linux 2 einrichten und Ebenen darin erstellen (obwohl Linux alles andere sein könnte). Zumindest mit macOS erstellte Layer funktionieren nicht mit AWS Lambda [^ macos]), aber tatsächlich hat Amazon Linux ein offizielles Image, das auf Docker Hub [^ dockerhub] verteilt wird. Installieren Sie Python 3.8 basierend auf diesem [^ dockerhub]. Wenn Sie ein Docker-Image erstellen, müssen Sie keine EC2-Instanz einrichten.
[^ Laufzeit]: AWS Lambda Runtime-AWS Lambda [^ macos]: Mac, aber ich möchte Lambda mit Python AWS! --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"]
Registrieren Sie in Entrypoint ein Skript, das installiert und komprimiert wird.
entrypoint.sh
#!/bin/bash -eu
SRC=/python
DIST=/dist/layer.zip
pip3 install -t ${SRC} $@
rm -f ${DIST}
zip -q -r ${DIST} ${SRC}
Erstellen Sie das Bild.
$ docker build . -t bundle-pip-modules-for-aws-lambda-layers:python3.8
Es scheint, dass der Bildname lang ist, aber hier ist alles in Ordnung.
Zum Beispiel beim Erstellen einer Lambda-Ebene, die Pandas verwenden kann.
$ docker run --rm \
-v $(pwd):/dist \
bundle-pip-modules-for-aws-lambda-layers:python3.8 \
pandas
Bei Erfolg wird "layer.zip" im aktuellen Verzeichnis erstellt.
Im obigen Beispiel wurde "pandas" direkt angegeben, aber da alle Argumente, die von "pip3 install" angegeben werden können, für die Argumente nach dem Image-Namen übergeben werden können, geben Sie beispielsweise "require.txt" ein und geben Sie dann die Option "-r" an. Sie können auch viele Module zu einer Ebene mit kombinieren.
$ 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
Laden Sie die erstellte layer.zip
hoch.
Als einfachstes Beispiel erstellen wir eine Lambda-Funktion, die nur Pandas lädt.
lambda_function.py
import pandas
def lambda_handler(event, context):
pass
Fügen Sie die registrierte Ebene zur erstellten Lambda-Funktion hinzu.
Wenn Sie versuchen, diese Lambda-Funktion auszuführen und kein Fehler auftritt, ist dies in Ordnung.
Recommended Posts