Tutorial: Erstellen einer benutzerdefinierten Laufzeit - 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.

Tutorial: Erstellen einer benutzerdefinierten Laufzeit

In diesem Tutorial erstellen Sie eine Lambda-Funktion mit einer benutzerdefinierten Laufzeit. Sie beginnen, indem Sie die Laufzeit in das Bereitstellungspaket der Funktion einfügen. Anschließend migrieren Sie sie zu einer Ebene, die Sie unabhängig von der Funktion verwalten. Schließlich geben Sie die Laufzeitebene frei, indem Sie ihre ressourcenbasierte Berechtigungsrichtlinie aktualisieren.

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass Sie über Kenntnisse zu den grundlegenden Lambda-Operationen und der Lambda-Konsole verfügen. Sofern noch nicht geschehen, befolgen Sie die Anweisungen unter Erstellen einer Lambda-Funktion mit der Konsole, um Ihre erste Lambda-Funktion zu erstellen.

Um die folgenden Schritte durchzuführen, benötigen Sie die AWS Command Line Interface (AWS CLI) Version 2. Befehle und die erwartete Ausgabe werden in separaten Blöcken aufgeführt:

aws --version

Die Ausgabe sollte folgendermaßen aussehen:

aws-cli/2.13.27 Python/3.11.6 Linux/4.14.328-248.540.amzn2.x86_64 exe/x86_64.amzn.2

Bei langen Befehlen wird ein Escape-Zeichen (\) wird verwendet, um einen Befehl über mehrere Zeilen zu teilen.

Verwenden Sie auf Linux und macOS Ihren bevorzugten Shell- und Paket-Manager.

Anmerkung

In Windows werden einige CLI Bash-Befehle, die Sie häufig mit Lambda verwenden (z. B.zip), von den integrierten Terminals des Betriebssystems nicht unterstützt. Um eine in Windows integrierte Version von Ubuntu und Bash zu erhalten, installieren Sie das Windows-Subsystem für Linux. Die CLI Beispielbefehle in diesem Handbuch verwenden die Linux-Formatierung. Befehle, die JSON Inline-Dokumente enthalten, müssen neu formatiert werden, wenn Sie Windows verwenden. CLI

Sie benötigen eine IAM Rolle, um eine Lambda-Funktion zu erstellen. Die Rolle benötigt die Erlaubnis, Protokolle an Logs zu CloudWatch senden und auf die AWS Dienste zuzugreifen, die Ihre Funktion verwendet. Wenn Sie nicht über eine Rolle für die Funktionserstellung verfügen, erstellen Sie jetzt eine.

So erstellen Sie eine Ausführungsrolle
  1. Öffnen Sie die Rollenseite in der IAM Konsole.

  2. Wählen Sie Rolle erstellen.

  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.

Erstellen einer -Funktion

Erstellen Sie eine Lambda-Funktion mit einer benutzerdefinierten Laufzeit. Dieses Beispiel enthält zwei Dateien: eine bootstrap-Laufzeitdatei und einen Funktions-Handler. Beide sind in Bash implementiert.

  1. Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.

    mkdir runtime-tutorial cd runtime-tutorial
  2. Erstellen Sie eine neue Datei mit dem Namen bootstrap. Dies ist die benutzerdefinierte Laufzeit.

    Beispiel bootstrap
    #!/bin/sh set -euo pipefail # Initialization - load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done

    Die Laufzeit lädt ein Funktionsskript aus dem Bereitstellungspaket. Sie verwendet zwei Variablen, um das Skript zu finden. LAMBDA_TASK_ROOT gibt an, wohin das Paket extrahiert wurde, und _HANDLER enthält den Namen des Skripts.

    Nachdem die Runtime das Funktionsskript geladen hat, verwendet sie die Laufzeit, API um ein Aufrufereignis von Lambda abzurufen, übergibt das Ereignis an den Handler und sendet die Antwort zurück an Lambda. Um die Anforderungs-ID abzurufen, speichert die Runtime die Header der API Antwort in einer temporären Datei und liest den Lambda-Runtime-Aws-Request-Id Header aus der Datei.

    Anmerkung

    Laufzeit besitzen zusätzliche Verantwortlichkeiten, darunter Fehlerbehandlung und Bereitstellung von Kontextinformationen für den Handler. Details hierzu finden Sie unter Voraussetzungen.

  3. Erstellen Sie ein Skript für die Funktion. Das folgende Beispielskript definiert eine Handler-Funktion, die Ereignisdaten annimmt, protokolliert sie in stderr und gibt sie zurück.

    Beispiel function.sh
    function handler () { EVENT_DATA=$1 echo "$EVENT_DATA" 1>&2; RESPONSE="Echoing request: '$EVENT_DATA'" echo $RESPONSE }

    Das runtime-tutorial-Verzeichnis sollte jetzt wie folgt aussehen:

    runtime-tutorial ├ bootstrap └ function.sh
  4. Konvertieren Sie die Dateien zu ausführbaren Dateien und fügen Sie sie einem ZIP-Dateiarchiv hinzu. Dies ist das Bereitstellungspaket.

    chmod 755 function.sh bootstrap zip function.zip function.sh bootstrap
  5. Erstellen Sie eine Funktion mit dem Namen bash-runtime. Geben Sie für --role die ARN Ihrer Lambda-Ausführungsrolle ein.

    aws lambda create-function --function-name bash-runtime \ --zip-file fileb://function.zip --handler function.handler --runtime provided.al2023 \ --role arn:aws:iam::123456789012:role/lambda-role
  6. Die Funktion aufrufen.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out

    Die cli-binary-format Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface -Benutzerhandbuch für Version 2.

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  7. Überprüfen Sie die Antwort.

    cat response.txt

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    Echoing request: '{"text":"Hello"}'

Erstellen einer Ebene

Um Laufzeitcode und Funktionscode voneinander zu trennen, erstellen Sie eine Ebene, die nur die Laufzeit enthält. Mit Ebenen können Sie die Abhängigkeiten Ihrer Funktion unabhängig entwickeln. Sie können darüber hinaus die Speichernutzung reduzieren, wenn Sie dieselbe Ebene für mehrere Funktionen verwenden. Weitere Informationen finden Sie unter Verwaltung von Lambda-Abhängigkeiten mit Ebenen.

  1. Erstellen Sie eine ZIP-Datei, die die bootstrap-Datei enthält.

    zip runtime.zip bootstrap
  2. Erstellen Sie eine Ebene mit dem publish-layer-versionBefehl.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip

    Hierdurch wird die erste Version der Ebene erstellt.

Aktualisieren der Funktion

Um die Laufzeitebene in der Funktion zu verwenden, konfigurieren Sie die Funktion für die Verwendung der Ebene und entfernen den Laufzeitcode aus der Funktion.

  1. Aktualisieren Sie die Konfiguration der Funktion, um die Ebene einzubeziehen.

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:1

    Dadurch wird die Laufzeit zur Funktion im /opt-Verzeichnis hinzugefügt. Um sicherzustellen, dass Lambda die Laufzeit in der Ebene verwendet, müssen Sie die boostrap-Datei aus dem Bereitstellungspaket der Funktion entfernen, wie in den nächsten beiden Schritten gezeigt.

  2. Erstellen Sie eine ZIP-Datei, die den Funktionscode enthält.

    zip function-only.zip function.sh
  3. Aktualisieren Sie den Funktionscode so, dass er nur das Handler-Skript enthält.

    aws lambda update-function-code --function-name bash-runtime --zip-file fileb://function-only.zip
  4. Rufen Sie die Funktion auf, um zu überprüfen, ob sie mit der Laufzeitebene funktioniert.

    aws lambda invoke --function-name bash-runtime --payload '{"text":"Hello"}' response.txt --cli-binary-format raw-in-base64-out

    Die cli-binary-format Option ist erforderlich, wenn Sie AWS CLI Version 2 verwenden. Um dies zur Standardeinstellung zu machen, führen Sie aws configure set cli-binary-format raw-in-base64-out aus. Weitere Informationen finden Sie unter Von AWS CLI unterstützte globale Befehlszeilenoptionen im AWS Command Line Interface -Benutzerhandbuch für Version 2.

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }
  5. Überprüfen Sie die Antwort.

    cat response.txt

    Das Ergebnis sollte ungefähr wie folgt aussehen:

    Echoing request: '{"text":"Hello"}'

Aktualisieren der Laufzeit

  1. Um Informationen zur Ausführungsumgebung zu protokollieren, aktualisieren Sie das Laufzeitskript, sodass es Umgebungsvariablen ausgibt.

    Beispiel bootstrap
    #!/bin/sh set -euo pipefail # Configure runtime to output environment variables echo "## Environment variables:" env # Load function handler source $LAMBDA_TASK_ROOT/"$(echo $_HANDLER | cut -d. -f1).sh" # Processing while true do HEADERS="$(mktemp)" # Get an event. The HTTP request will block until one is received EVENT_DATA=$(curl -sS -LD "$HEADERS" "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next") # Extract request ID by scraping response headers received above REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2) # Run the handler function from the script RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA") # Send the response curl "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE" done
  2. Erstellen Sie eine ZIP-Datei mit der neuen Version der bootstrap-Datei.

    zip runtime.zip bootstrap
  3. Erstellt eine neue Version der bash-runtime-Ebene.

    aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
  4. Konfigurieren Sie die Funktion für die Verwendung der neuen Version der Ebene.

    aws lambda update-function-configuration --function-name bash-runtime \ --layers arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2

Freigeben der Ebene

Um einen Layer mit einem anderen zu teilen AWS-Konto, fügen Sie der ressourcenbasierten Richtlinie des Layers eine kontoübergreifende Berechtigungserklärung hinzu. Führen Sie den add-layer-version-permissionBefehl aus und geben Sie die Konto-ID als. principal In jedem Kontoauszug können Sie einem einzelnen Konto, allen Konten oder einer Organisation in Berechtigungen erteilen AWS Organizations.

Im folgenden Beispiel wird dem Konto 111122223333 Zugriff auf Version 2 der bash-runtime-Ebene gewährt.

aws lambda add-layer-version-permission \ --layer-name bash-runtime \ --version-number 2 \ --statement-id xaccount \ --action lambda:GetLayerVersion \ --principal 111122223333 \ --output text

Die Ausgabe sollte folgendermaßen oder ähnlich aussehen:

{"Sid":"xaccount","Effect":"Allow","Principal":{"AWS":"arn:aws:iam::111122223333:root"},"Action":"lambda:GetLayerVersion","Resource":"arn:aws:lambda:us-east-1:123456789012:layer:bash-runtime:2"}

Berechtigungen gelten nur für eine Version mit einer Ebene. Wiederholen Sie den Vorgang bei jeder Erstellung einer neuen Ebenenversion.

Bereinigen

Löschen Sie alle Versionen der Ebene.

aws lambda delete-layer-version --layer-name bash-runtime --version-number 1 aws lambda delete-layer-version --layer-name bash-runtime --version-number 2

Da die Funktion einen Verweis auf Version 2 der Ebene enthält, ist diese nach wie vor in Lambda vorhanden. Die Funktion funktioniert weiter. Es können jedoch keine weiteren Funktionen für die Verwendung der gelöschten Version konfiguriert werden. Wenn Sie die Liste der Ebenen in der Funktion ändern, müssen Sie eine neue Version angeben oder die gelöschte Ebene auslassen.

Löschen Sie die Funktion mit dem Befehl delete-function.

aws lambda delete-function --function-name bash-runtime