[PYTHON] Docker-Lambda und Yumda sind nützlich beim Erstellen von Lambda-Ebenen

Einführung

Mit dem Build-Image von Docker-Lambda können Sie eine Ebene erstellen, die jeder Zeilenzeitversion entspricht!

$ docker run --rm -v $(pwd):/var/task lambci/lambda:build-python3.8 \
> pip install -r requirements.txt -t python/lib/python3.8/site-packages/

Softwarepakete, die Sie auf AWS Lambda ausführen möchten, können mit yumda überlagert werden!

$ docker run --rm -v $(pwd)/git-layer:/lambda/opt lambci/yumda:2 yum install -y <package>

Die Vorbereitung auf die Umwelt ist ziemlich schwierig, wenn Sie dies von Grund auf neu tun

Eine häufige Einschränkung bei AWS Lambda und Lambda Layers ist der Umgang mit nativen Binärdateien. Weil die Lambda-Laufumgebung auf einer bestimmten Amazon Linux-Umgebung und Kernel-Version basiert Die in Lambda verwendeten nativen Binärdateien müssen auch in dieser Umgebung kompiliert werden.

Abhängig von der Version der verwendeten Laufzeit befindet sich derzeit eine Übergangsphase des Endes der Unterstützung für Amazon Linux. Der Unterschied zwischen einer Basis auf Amazon Linux oder einer Basis auf Amazon Linux 2 ist ebenfalls ärgerlich. Im Fall von Python ist dies beispielsweise ab dem 28. März 2020 wie folgt.

Version OS
Python 3.8 Amazon Linux 2
Python 3.7 Amazon Linux
Python 3.6 Amazon Linux
Python 2.7 Amazon Linux

AWS Lambda Runtimes https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html

Es ist wirklich mühsam, EC2 jedes Mal zu starten, wenn ein Paket erstellt wird. Sie können auch das auf Docker Hub veröffentlichte Amazon Linux-Container-Image verwenden. Dieses Bild enthält also nur eine minimale Anzahl von Paketen Es ist erforderlich, zusätzlich die Ziellaufzeitumgebung zu installieren, die dieses als Basisimage verwendet. Verwalten Sie bei der Entwicklung für mehrere Laufzeiten und Versionen Docker-Dateien und Images für jede Umgebung Ich denke, das ist etwas schwierig.

Die Einführung ist lang geworden, aber Docker-Lambda und Yumda sind in solchen Fällen nützlich.

docker-lambda

Was ist Docker-Lambda?

Docker-Lambda reproduziert die AWS Lambda-Ausführungsumgebung im Docker-Container so genau wie möglich. (Aber keine perfekte Kopie) Das Container-Image wird unter lambci / lambda auf Docker Hub veröffentlicht. Es wurde als OSS von Michael Hart von AWS Severless Hero entwickelt.

docker-lambda https://github.com/lambci/docker-lambda

Es wird auch als Ausführungsumgebung für Lambda-Funktionen in der AWS SAM CLI verwendet. Intern wird Docker-Lambda ausgeführt, wenn die Lambda-Funktion lokal in der SAM-CLI aufgerufen wird.

Docker-Lambda-Build-Image

Docker-Lambda bietet auch ein Build-Image zum Erstellen und Verpacken von Lambda-Funktionen. Build-Images werden für jede Laufzeitversion mit Image-Tags wie build-python3.x bereitgestellt. Pakete, die zusätzlich im Build-Image installiert sind Siehe https://hub.docker.com/r/lambci/lambda/#build-environment. Es enthält auch die AWS CLI und die AWS SAM CLI. Wenn Sie dies tun möchten, können Sie alles im Container ausführen.

Beispiel für die Erstellung einer Python3.8-kompatiblen Ebene

Verwenden Sie lambci / lambda: build-python3.8. Beschreiben Sie die Bibliothek, die Sie zur Datei resources.txt hinzufügen möchten. Ich füge hier einfach nur Pandas hinzu.

requirements.txt


pandas

Pip-Installation im Build-Image, um die Bibliothek in die Ebene aufzunehmen.

$ docker run --rm -v $(pwd):/var/task lambci/lambda:build-python3.8 \
> pip install -r requirements.txt -t python/lib/python3.8/site-packages/

$ zip -r pandas-1.0.3.zip ./python > /dev/null

Wenn Sie mehrere Versionen miteinander kompatibel machen möchten, verwenden Sie das Build-Image für jede Version. Führen Sie einen Docker mit Site-Paketen aus und komprimieren Sie ihn anschließend. Die Verzeichnisstruktur ist wie folgt. Sie sollten die Beschränkung der Paketgröße (250 MB) nach der Bereitstellung kennen.

.
`-- python
    `-- lib
        |-- python3.6
        |   `-- site-packages
        |-- python3.7
        |   `-- site-packages
        `-- python3.8
            `-- site-packages

Wenn ich versuche, den Vorgang mit dem folgenden supereinfachen Code unter Verwendung der vorherigen Ebene zu überprüfen, ...

lambda_function.py


import pandas as pd;

def lambda_handler(event, context):
    pd.show_versions()

Ich konnte es schaffen!

START RequestId: 813889ca-958c-4b60-ae1d-442870679429 Version: $LATEST

INSTALLED VERSIONS
------------------
commit           : None
python           : 3.8.2.final.0
python-bits      : 64
OS               : Linux
OS-release       : 4.14.165-102.205.amzn2.x86_64
machine          : x86_64
processor        : x86_64
byteorder        : little
LC_ALL           : None
LANG             : en_US.UTF-8
LOCALE           : en_US.UTF-8

pandas           : 1.0.3
numpy            : 1.18.2
~~Unten weggelassen~~

yumda Verwenden Sie yumda, um Softwarepakete zu erstellen, die in einer AWS Lambda-Umgebung ausgeführt werden können Es kann mit dem Befehl yum vorbereitet werden. Wie Docker-Lambda wird es als OSS entwickelt.

yumda – yum for Lambda https://github.com/lambci/yumda

Das Containerbild wird unter lambci / yumda veröffentlicht. Ein Image für die Amazon Linux 2-Umgebung und ein Image für die Amazon Linux-Umgebung sind verfügbar. nodejs10.x, nodejs12.x, python3.8, java11, ruby2.7 sind lambci / yumbda: 2, Andere Laufzeitversionen verwenden lambci / yumbda: 1.

Führen Sie einen Befehl aus, der dem folgenden ähnelt, um festzustellen, welche Pakete für Ihre Amazon Linux 2-Umgebung verfügbar sind:

$ docker run --rm lambci/yumda:2 yum list available
Loaded plugins: ovl, priorities
Available Packages
GraphicsMagick.x86_64        1.3.34-1.lambda2                            lambda2
GraphicsMagick-c++.x86_64    1.3.34-1.lambda2                            lambda2
ImageMagick.x86_64           6.7.8.9-18.lambda2                          lambda2
OpenEXR.x86_64               1.7.1-7.lambda2.0.2                         lambda2
OpenEXR-libs.x86_64          1.7.1-7.lambda2.0.2                         lambda2
~~Unten weggelassen~~

Oder Sie können Folgendes überprüfen. https://github.com/lambci/yumda/blob/master/amazon-linux-2/packages.txt

Das Paket wird in einem eigenen Repository verwaltet und Sie können zusätzliche Anforderungen in GitHub Issues senden. Alles, was bereits im Amazon Linux Core Repository und im Amazon-Linux-Extras Repository vorhanden ist Es scheint, dass es eine Richtlinie ist, die hinzugefügt werden muss.

Please file a GitHub Issue with your request and add the package suggestion label. For now we'll only be considering additions that already exist in the Amazon Linux core repositories, or the amazon-linux-extras repositories (including epel).

Beispiel für das Erstellen einer Ebene mit yumda

Hier werde ich versuchen, den Befehl git mit der Lmabda-Funktion von python3.8 auszuführen.

lambda_function.py


import subprocess

def lambda_handler(event, context):
    return subprocess.check_output(
        "git --version;exit 0",
        stderr=subprocess.STDOUT,
        shell=True
    )

Wenn Sie keine Lambda-Ebenen verwenden, wird das Ergebnis natürlich nicht gefunden.

$ aws lambda invoke --function-name git-layer-test outfile
ExecutedVersion: $LATEST
StatusCode: 200

$ cat outfile
/bin/sh: git: command not found

Erstelle eine Ebene mit yumda.

$ docker run --rm -v $(pwd)/git-layer:/lambda/opt lambci/yumda:2 yum install -y git
$ cd git-layer
$ zip -yr ../git-2.25.0-1.zip . > /dev/null

Sie können sehen, dass git und seine Abhängigkeiten mit einer Verzeichnisstruktur ähnlich der folgenden installiert werden.

.
|-- bin
|-- etc
|   |-- alternatives
|   |-- pki
|   |-- prelink.conf.d
|   `-- ssh
|-- lib
|   |-- fipscheck
|   `-- nss
|-- libexec
|   |-- git-core
|   `-- openssh
`-- share
    |-- git-core
    `-- licenses

Veröffentlichen Sie die Ebene und stellen Sie sie in der obigen Lambda-Funktion ein.

$ aws lambda publish-layer-version \
> --layer-name git-2-25-0-1 --zip-file fileb://git-2.25.0-1.zip

$ aws lambda update-function-configuration \
>  --function-name git-layer-test \
>  --layers arn:aws:lambda:ap-northeast-1:123456789012:layer:git-2-25-0-1:1

Als ich es lief, bekam ich eine Git-Version!

$ aws lambda invoke --function-name git-layer-test outfile
ExecutedVersion: $LATEST
StatusCode: 200

$ cat outfile
git version 2.25.0

Referenz: Verwenden Sie veröffentlichte Lambda-Schichten

Ich habe bisher geschrieben, aber Lambda Layers ist auch im Sevelress Application Repository verfügbar. Viele sind registriert und es gibt auch ein GitHub-Repository namens λ AWSome Lambda Layers. Eine Liste verschiedener Ebenen wird zusammengestellt. Wenn Sie das haben, was Sie für diese benötigen, ist es einfach, sie zu verwenden!

das ist alles. Ich bin froh, wenn Sie es als Referenz verwenden können.

Recommended Posts

Docker-Lambda und Yumda sind nützlich beim Erstellen von Lambda-Ebenen
[Python] Verwenden Sie und und oder beim Erstellen von Variablen
Erstellen eines Alias (wenn mehrere Argumente vorhanden sind) [Vergleich von Bash und PowerShell]
Dies und das ist nützlich, wenn es mit nohup verwendet wird