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
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
-
Öffnen Sie die Rollenseite
in der IAM Konsole. -
Wählen Sie Rolle erstellen.
-
Erstellen Sie eine Rolle mit den folgenden Eigenschaften.
-
Trusted entity (Vertrauenswürdige Entität) – Lambda.
-
Berechtigungen — AWSLambdaBasicExecutionRole.
-
Role name (Name der Rolle –
lambda-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.
-
Erstellen Sie ein Verzeichnis für das Projekt und wechseln Sie dann zu diesem Verzeichnis.
mkdir runtime-tutorial cd runtime-tutorial
-
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.
-
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
-
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
-
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
-
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" }
-
Ü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.
-
Erstellen Sie eine ZIP-Datei, die die
bootstrap
-Datei enthält.zip runtime.zip bootstrap
-
Erstellen Sie eine Ebene mit dem publish-layer-version
Befehl. 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.
-
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:1Dadurch wird die Laufzeit zur Funktion im
/opt
-Verzeichnis hinzugefügt. Um sicherzustellen, dass Lambda die Laufzeit in der Ebene verwendet, müssen Sie dieboostrap
-Datei aus dem Bereitstellungspaket der Funktion entfernen, wie in den nächsten beiden Schritten gezeigt. -
Erstellen Sie eine ZIP-Datei, die den Funktionscode enthält.
zip function-only.zip function.sh
-
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
-
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" }
-
Überprüfen Sie die Antwort.
cat response.txt
Das Ergebnis sollte ungefähr wie folgt aussehen:
Echoing request: '{"text":"Hello"}'
Aktualisieren der Laufzeit
-
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 -
Erstellen Sie eine ZIP-Datei mit der neuen Version der
bootstrap
-Datei.zip runtime.zip bootstrap
-
Erstellt eine neue Version der
bash-runtime
-Ebene.aws lambda publish-layer-version --layer-name bash-runtime --zip-file fileb://runtime.zip
-
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-permissionprincipal
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