Arbeiten mit Ebenen für Python-Lambda-Funktionen - AWS Lambda

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Arbeiten mit Ebenen für Python-Lambda-Funktionen

Eine Lambda-Schicht ist ein ZIP-Dateiarchiv, das zusätzlichen Code oder Daten enthält. Ebenen enthalten üblicherweise Bibliotheksabhängigkeiten, eine benutzerdefinierte Laufzeit oder Konfigurationsdateien. Das Erstellen einer Ebene umfasst drei allgemeine Schritte:

  1. Package Sie Ihren Layer-Inhalt. Das bedeutet, dass Sie ein ZIP-Dateiarchiv erstellen müssen, das die Abhängigkeiten enthält, die Sie in Ihren Funktionen verwenden möchten.

  2. Erstellen Sie die Ebene in Lambda.

  3. Fügen Sie die Ebene zu Ihren Funktionen hinzu.

Dieses Thema enthält Schritte und Anleitungen zum ordnungsgemäßen Verpacken und Erstellen einer Python-Lambda-Schicht mit externen Bibliotheksabhängigkeiten.

Voraussetzungen

Um die Schritte in diesem Abschnitt ausführen zu können, benötigen Sie Folgendes:

In diesem Thema verweisen wir auf die layer-pythonBeispielanwendung im awsdocs-Repository GitHub . Diese Anwendung enthält Skripte, die die Abhängigkeiten herunterladen und die Ebenen generieren. Die Anwendung enthält auch entsprechende Funktionen, die Abhängigkeiten von den Ebenen nutzen. Nachdem Sie eine Ebene erstellt haben, können Sie die entsprechende Funktion bereitstellen und aufrufen, um zu überprüfen, ob alles ordnungsgemäß funktioniert. Da Sie die Python 3.11-Laufzeit für die Funktionen verwenden, müssen die Layer auch mit Python 3.11 kompatibel sein.

In der layer-python Beispielanwendung gibt es zwei Beispiele:

  • Das erste Beispiel beinhaltet das Verpacken der requestsBibliothek in eine Lambda-Schicht. Das layer/ Verzeichnis enthält die Skripte zum Generieren der Ebene. Das function/ Verzeichnis enthält eine Beispielfunktion, mit deren Hilfe getestet werden kann, ob der Layer funktioniert. Der Großteil dieses Tutorials erklärt, wie dieser Layer erstellt und verpackt wird.

  • Das zweite Beispiel beinhaltet das Verpacken der numpyBibliothek in eine Lambda-Schicht. Das layer-numpy/ Verzeichnis enthält die Skripte zum Generieren der Ebene. Das function-numpy/ Verzeichnis enthält eine Beispielfunktion, mit deren Hilfe getestet werden kann, ob der Layer funktioniert. Ein Beispiel für das Erstellen und Verpacken dieses Layers finden Sie unterMit manylinux Radverteilungen arbeiten.

Python-Layer-Kompatibilität mit Amazon Linux

Der erste Schritt beim Erstellen einer Ebene besteht darin, den gesamten Ebeneninhalt in einem ZIP-Dateiarchiv zu bündeln. Da Lambda-Funktionen unter Amazon Linux ausgeführt werden, muss Ihr Ebeneninhalt in einer Linux-Umgebung kompiliert und erstellt werden können.

In Python sind die meisten Pakete zusätzlich zur Quelldistribution als Räder (.whlDateien) verfügbar. Jedes Rad ist eine Art von gebauter Distribution, die eine bestimmte Kombination von Python-Versionen, Betriebssystemen und Maschinenbefehlssätzen unterstützt.

Räder sind nützlich, um sicherzustellen, dass Ihr Layer mit Amazon Linux kompatibel ist. Wenn Sie Ihre Abhängigkeiten herunterladen, laden Sie nach Möglichkeit das Universal Wheel herunter. (Standardmäßig pip wird das Universalrad installiert, sofern eines verfügbar ist.) Das Universalrad enthält any als Plattform-Tag, was darauf hinweist, dass es mit allen Plattformen, einschließlich Amazon Linux, kompatibel ist.

Im folgenden Beispiel packen Sie die requests Bibliothek in eine Lambda-Schicht. Die requests Bibliothek ist ein Beispiel für ein Paket, das als Universalrad verfügbar ist.

Nicht alle Python-Pakete werden als Universalräder vertrieben. numpyHat beispielsweise mehrere Radverteilungen, von denen jede eine andere Gruppe von Plattformen unterstützt. Laden Sie für solche Pakete die manylinux Distribution herunter, um die Kompatibilität mit Amazon Linux sicherzustellen. Eine ausführliche Anleitung zum Verpacken solcher Ebenen finden Sie unterMit manylinux Radverteilungen arbeiten.

In seltenen Fällen ist ein Python-Paket möglicherweise nicht als Rad verfügbar. Wenn nur die Quelldistribution (sdist) existiert, empfehlen wir, Ihre Abhängigkeiten in einer Docker-Umgebung zu installieren und zu verpacken, die auf dem Amazon Linux 2023-Basiscontainer-Image basiert. Wir empfehlen diesen Ansatz auch, wenn Sie Ihre eigenen benutzerdefinierten Bibliotheken einbeziehen möchten, die in anderen Sprachen wie C/C++ geschrieben sind. Dieser Ansatz ahmt die Lambda-Ausführungsumgebung in Docker nach und stellt sicher, dass Ihre Nicht-Python-Paketabhängigkeiten mit Amazon Linux kompatibel sind.

Layer-Pfade für Python-Laufzeiten

Wenn Sie einer Funktion eine Ebene hinzufügen, lädt Lambda den Ebeneninhalt in das Verzeichnis /opt der Ausführungsumgebung. Für jede Lambda-Laufzeit enthält die Variable PATH bereits spezifische Ordnerpfade innerhalb des Verzeichnisses /opt. Um sicherzustellen, dass die PATH Variable Ihren Layer-Inhalt aufnimmt, sollte Ihre Layer-.zip-Datei ihre Abhängigkeiten in den folgenden Ordnerpfaden haben:

  • python

  • python/lib/python3.x/site-packages

Die resultierende Layer-ZIP-Datei, die Sie in diesem Tutorial erstellen, hat beispielsweise die folgende Verzeichnisstruktur:

layer_content.zip └ python └ lib └ python3.11 └ site-packages └ requests └ <other_dependencies> (i.e. dependencies of the requests package) └ ...

Die requestsBibliothek befindet sich korrekt im python/lib/python3.11/site-packages Verzeichnis. Dadurch wird sichergestellt, dass Lambda die Bibliothek bei Funktionsaufrufen finden kann.

Verpacken des Layer-Inhalts

In diesem Beispiel packen Sie die requests Python-Bibliothek in eine Layer-.zip-Datei. Führen Sie die folgenden Schritte aus, um den Layer-Inhalt zu installieren und zu verpacken.

So installieren und verpacken Sie Ihre Layer-Inhalte
  1. Klonen Sie das aws-lambda-developer-guide GitHub Repo, das den Beispielcode enthält, den Sie im sample-apps/layer-python Verzeichnis benötigen.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Navigieren Sie zum layer Verzeichnis der layer-python Beispiel-App. Dieses Verzeichnis enthält die Skripts, die Sie verwenden, um den Layer ordnungsgemäß zu erstellen und zu verpacken.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer
  3. Untersuchen Sie die requirements.txtDatei. Diese Datei definiert die Abhängigkeiten, die Sie in die Ebene aufnehmen möchten, nämlich die requests Bibliothek. Sie können diese Datei so aktualisieren, dass sie alle Abhängigkeiten enthält, die Sie in Ihre eigene Ebene aufnehmen möchten.

    Beispiel requirements.txt
    requests==2.31.0
  4. Stellen Sie sicher, dass Sie berechtigt sind, beide Skripts auszuführen.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Führen Sie das 1-install.shSkript mit dem folgenden Befehl aus:

    ./1-install.sh

    Dieses Skript verwendetvenv, um eine virtuelle Python-Umgebung mit dem Namen zu erstellencreate_layer. Anschließend werden alle erforderlichen Abhängigkeiten im create_layer/lib/python3.11/site-packages Verzeichnis installiert.

    Beispiel 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt
  6. Führen Sie das 2-package.shSkript mit dem folgenden Befehl aus:

    ./2-package.sh

    Dieses Skript kopiert den Inhalt aus dem create_layer/lib Verzeichnis in ein neues Verzeichnis mit dem Namenpython. Anschließend komprimiert es den Inhalt des python Verzeichnisses in eine Datei mit dem Namenlayer_content.zip. Dies ist die ZIP-Datei für Ihren Layer. Sie können die Datei entpacken und überprüfen, ob sie die richtige Dateistruktur enthält, wie im Layer-Pfade für Python-Laufzeiten Abschnitt gezeigt.

    Beispiel 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Die Ebene erstellen

In diesem Abschnitt nehmen Sie die layer_content.zip Datei, die Sie im vorherigen Abschnitt generiert haben, und laden sie als Lambda-Schicht hoch. Sie können eine Ebene mit der AWS Management Console oder der Lambda-API über die AWS Command Line Interface (AWS CLI) hochladen. Wenn Sie Ihre Layer-.zip-Datei hochladen, geben Sie python3.11 im folgenden PublishLayerVersion AWS CLI Befehl die kompatible Laufzeit und die kompatible arm64 Architektur an.

aws lambda publish-layer-version --layer-name python-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "arm64"

Notieren Sie sich aus der Antwort denLayerVersionArn, der wie arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1 aussieht. Sie benötigen diesen Amazon-Ressourcennamen (ARN) im nächsten Schritt dieses Tutorials, wenn Sie den Layer zu Ihrer Funktion hinzufügen.

Hinzufügen der Ebene zu Ihrer Funktion

In diesem Abschnitt stellen Sie eine Lambda-Beispielfunktion bereit, die die requests Bibliothek in ihrem Funktionscode verwendet, und fügen dann den Layer hinzu. Um die Funktion bereitzustellen, benötigen Sie eineDefinieren von Lambda-Funktionsberechtigungen mit einer Ausführungsrolle. Wenn Sie noch keine Ausführungsrolle haben, folgen Sie den Schritten im Abschnitt „Zusammenklappbar“. Fahren Sie andernfalls mit dem nächsten Abschnitt fort, um die Funktion bereitzustellen.

So erstellen Sie eine Ausführungsrolle
  1. Öffnen Sie die Seite Roles (Rollen) in der IAM-Konsole.

  2. Wählen Sie Rolle erstellen aus.

  3. Erstellen Sie eine Rolle mit den folgenden Eigenschaften.

    • Trusted entity (Vertrauenswürdige Entität)Lambda.

    • BerechtigungenAWSLambdaBasicExecutionRole.

    • Role name (Name der Rollelambda-role.

    Die AWSLambdaBasicExecutionRoleRichtlinie verfügt über die Berechtigungen, die die Funktion benötigt, um Protokolle in Logs zu CloudWatch schreiben.

So stellen Sie die Lambda-Funktion bereit
  1. Navigieren Sie zum function/ Verzeichnis . Wenn Sie sich derzeit in dem layer/ Verzeichnis befinden, führen Sie den folgenden Befehl aus:

    cd ../function
  2. Überprüfen Sie den Funktionscode. Die Funktion importiert die requests Bibliothek, stellt eine einfache HTTP-GET-Anfrage und gibt dann den Statuscode und den Hauptteil zurück.

    import requests def lambda_handler(event, context): print(f"Version of requests library: {requests.__version__}") request = requests.get('https://api.github.com/') return { 'statusCode': request.status_code, 'body': request.text }
  3. Erstellen Sie mit dem folgenden Befehl ein Bereitstellungspaket für eine ZIP-Datei:

    zip my_deployment_package.zip lambda_function.py
  4. Stellen Sie die Funktion bereit. Ersetzen Sie im folgenden AWS CLI Befehl den --role Parameter durch den ARN Ihrer Ausführungsrolle:

    aws lambda create-function --function-name python_function_with_layer \ --runtime python3.11 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip

An dieser Stelle können Sie optional versuchen, Ihre Funktion aufzurufen, bevor Sie den Layer anhängen. Wenn Sie dies versuchen, sollten Sie einen Importfehler erhalten, da Ihre Funktion nicht auf das requests Paket verweisen kann. Verwenden Sie den folgenden AWS CLI Befehl, um Ihre Funktion aufzurufen:

aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

Die Ausgabe sollte in etwa wie folgt aussehen:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Um den spezifischen Fehler anzuzeigen, öffnen Sie die response.json Ausgabedatei. Sie sollten eine ImportModuleError mit der folgenden Fehlermeldung sehen:

"errorMessage": "Unable to import module 'lambda_function': No module named 'requests'"

Als Nächstes fügen Sie die Ebene Ihrer Funktion hinzu. Ersetzen Sie im folgenden AWS CLI Befehl den --layers Parameter durch den ARN der Layer-Version, den Sie zuvor notiert haben:

aws lambda update-function-configuration --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"

Versuchen Sie abschließend, Ihre Funktion mit dem folgenden AWS CLI Befehl aufzurufen:

aws lambda invoke --function-name python_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

Die Ausgabe sollte in etwa wie folgt aussehen:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

Die response.json Ausgabedatei enthält Details zur Antwort.

Sie können jetzt die Ressourcen, die Sie für dieses Tutorial erstellt haben, löschen, es sei denn, Sie möchten sie behalten. Durch das Löschen von AWS Ressourcen, die Sie nicht mehr verwenden, vermeiden Sie unnötige Kosten für Ihre AWS-Konto.

Um die Lambda-Ebene zu löschen
  1. Öffnen Sie die Seite Ebenen der Lambda-Konsole.

  2. Wählen Sie die Ebene aus, die Sie erstellt haben.

  3. Wählen Sie „Löschen“ und anschließend erneut „Löschen“.

So löschen Sie die Lambda-Funktion:
  1. Öffnen Sie die Seite Funktionen der Lambda-Konsole.

  2. Wählen Sie die Funktion aus, die Sie erstellt haben.

  3. Wählen Sie Aktionen, Löschen aus.

  4. Geben Sie delete in das Texteingabefeld ein und wählen Sie Delete (Löschen) aus.

Mit manylinux Radverteilungen arbeiten

Manchmal hat ein Paket, das Sie als Abhängigkeit einschließen möchten, kein universelles Rad (insbesondere nicht any als Plattform-Tag). Laden Sie in diesem Fall manylinux stattdessen das Rad herunter, das unterstützt. Dadurch wird sichergestellt, dass Ihre Layer-Bibliotheken mit Amazon Linux kompatibel sind.

numpyist ein Paket, das kein Universalrad hat. Wenn Sie das numpy Paket in Ihren Layer aufnehmen möchten, können Sie die folgenden Beispielschritte ausführen, um Ihren Layer ordnungsgemäß zu installieren und zu verpacken.

So installieren und verpacken Sie Ihren Layer-Inhalt
  1. Klonen Sie das aws-lambda-developer-guide GitHub Repo, das den Beispielcode enthält, den Sie im sample-apps/layer-python Verzeichnis benötigen.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. Navigieren Sie zum layer-numpy Verzeichnis der layer-python Beispiel-App. Dieses Verzeichnis enthält die Skripts, die Sie verwenden, um den Layer ordnungsgemäß zu erstellen und zu verpacken.

    cd aws-lambda-developer-guide/sample-apps/layer-python/layer-numpy
  3. Untersuchen Sie die requirements.txtDatei. Diese Datei definiert die Abhängigkeiten, die Sie in Ihren Layer aufnehmen möchten, nämlich die numpy Bibliothek. Hier geben Sie die URL der manylinux Radverteilung an, die mit Python 3.11, Amazon Linux und dem x86_64 Befehlssatz kompatibel ist:

    Beispiel requirements.txt
    https://files.pythonhosted.org/packages/3a/d0/edc009c27b406c4f9cbc79274d6e46d634d139075492ad055e3d68445925/numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  4. Stellen Sie sicher, dass Sie berechtigt sind, beide Skripts auszuführen.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. Führen Sie das 1-install.shSkript mit dem folgenden Befehl aus:

    ./1-install.sh

    Dieses Skript verwendetvenv, um eine virtuelle Python-Umgebung mit dem Namen zu erstellencreate_layer. Anschließend werden alle erforderlichen Abhängigkeiten im create_layer/lib/python3.11/site-packages Verzeichnis installiert. Der pip Befehl ist in diesem Fall anders, da Sie das --platform Tag als angeben müssenmanylinux2014_x86_64. Dies weist darauf pip hin, dass Sie das richtige manylinux Rad installieren müssen, auch wenn Ihr lokaler Computer macOS oder Windows verwendet.

    Beispiel 1-install.sh
    python3.11 -m venv create_layer source create_layer/bin/activate pip install -r requirements.txt --platform=manylinux2014_x86_64 --only-binary=:all: --target ./create_layer/lib/python3.11/site-packages
  6. Führen Sie das 2-package.shSkript mit dem folgenden Befehl aus:

    ./2-package.sh

    Dieses Skript kopiert den Inhalt aus dem create_layer/lib Verzeichnis in ein neues Verzeichnis mit dem Namenpython. Anschließend komprimiert es den Inhalt des python Verzeichnisses in eine Datei mit dem Namenlayer_content.zip. Dies ist die ZIP-Datei für Ihren Layer. Sie können die Datei entpacken und überprüfen, ob sie die richtige Dateistruktur enthält, wie im Layer-Pfade für Python-Laufzeiten Abschnitt gezeigt.

    Beispiel 2-package.sh
    mkdir python cp -r create_layer/lib python/ zip -r layer_content.zip python

Verwenden Sie den folgenden PublishLayerVersion AWS CLI Befehl, um diese Ebene auf Lambda hochzuladen:

aws lambda publish-layer-version --layer-name python-numpy-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes python3.11 \ --compatible-architectures "x86_64"

Notieren Sie sich aus der Antwort denLayerVersionArn, der wie arn:aws:lambda:us-east-1:123456789012:layer:python-numpy-layer:1 aussieht. Um zu überprüfen, ob Ihr Layer wie erwartet funktioniert, stellen Sie die Lambda-Funktion im function-numpy Verzeichnis bereit.

So stellen Sie die Lambda-Funktion bereit
  1. Navigieren Sie zum function-numpy/ Verzeichnis . Wenn Sie sich derzeit in dem layer-numpy/ Verzeichnis befinden, führen Sie den folgenden Befehl aus:

    cd ../function-numpy
  2. Überprüfen Sie den Funktionscode. Die Funktion importiert die numpy Bibliothek, erstellt ein einfaches numpy Array und gibt dann einen Dummy-Statuscode und einen Hauptteil zurück.

    import json import numpy as np def lambda_handler(event, context): x = np.arange(15, dtype=np.int64).reshape(3, 5) print(x) return { 'statusCode': 200, 'body': json.dumps('Hello from Lambda!') }
  3. Erstellen Sie mit dem folgenden Befehl ein Bereitstellungspaket für eine ZIP-Datei:

    zip my_deployment_package.zip lambda_function.py
  4. Stellen Sie die Funktion bereit. Ersetzen Sie im folgenden AWS CLI Befehl den --role Parameter durch den ARN Ihrer Ausführungsrolle:

    aws lambda create-function --function-name python_function_with_numpy \ --runtime python3.11 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip

Optional können Sie versuchen, Ihre Funktion aufzurufen, bevor Sie den Layer anhängen. Wenn Sie dies versuchen, sollten Sie einen Importfehler erhalten, da Ihre Funktion nicht auf das numpy Paket verweisen kann. Verwenden Sie den folgenden AWS CLI Befehl, um Ihre Funktion aufzurufen:

aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

Die Ausgabe sollte in etwa wie folgt aussehen:

{ "StatusCode": 200, "FunctionError": "Unhandled", "ExecutedVersion": "$LATEST" }

Um den spezifischen Fehler anzuzeigen, öffnen Sie die response.json Ausgabedatei. Sie sollten eine ImportModuleError mit der folgenden Fehlermeldung sehen:

"errorMessage": "Unable to import module 'lambda_function': No module named 'numpy'"

Als Nächstes fügen Sie die Ebene Ihrer Funktion hinzu. Ersetzen Sie im folgenden AWS CLI Befehl den --layers Parameter durch den ARN Ihrer Layer-Version:

aws lambda update-function-configuration --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:python-requests-layer:1"

Versuchen Sie abschließend, Ihre Funktion mit dem folgenden AWS CLI Befehl aufzurufen:

aws lambda invoke --function-name python_function_with_numpy \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

Die Ausgabe sollte in etwa wie folgt aussehen:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

Sie können anhand der Funktionsprotokolle überprüfen, ob der Code das numpy Array standardmäßig ausgibt.