Auf der re:Invent 2018 hat AWS die Lambda Runtime API und Lambda Layers angekündigt, zwei neue AWS Lambda-Funktionen, die es Entwicklern ermöglichen, benutzerdefinierte Laufzeiten zu erstellen und gemeinsamen Code zwischen Funktionen zu teilen und zu verwalten. Mit der Lambda Runtime API können Sie jede beliebige Laufzeit ausführen. Sie können sogar Bash als Laufzeit verwenden, um Ihre AWS API Gateway-Funktionen zu betreiben! Lambda-Layer sind eine neue Art von Artefakten, die beliebigen Code und Daten enthalten können und dazu dienen, gemeinsame Abhängigkeiten für Ihre Lambda-Funktionen bereitzustellen. Layers können Bootstrap-Laufzeiten und Laufzeitabhängigkeiten bereitstellen. In diesem Blog sehen wir uns an, wie Sie Bash verwenden, um ein API Gateway Lambda zu betreiben.
Neue Laufzeiteinstellung
Der Ressourcentyp 'AWS::Lambda::Function' hat einen neuen Wert für 'Runtime', der 'provided' ist. Das Feld 'Handler' muss auf einen Dateinamen und eine Funktion innerhalb der Datei verweisen, die ausgeführt werden soll.
CustomLambda:
Type: AWS::Lambda::Function
Properties:
Handler: function.handler
Runtime: provided
Role: !GetAtt 'LambdaBasicExecutionRole.Arn'
MemorySize: 128
Timeout: 30
Code:
S3Bucket: !Ref S3Bucket
S3Key: !Ref S3Key
S3ObjectVersion: !Ref S3Version
Bootstrap
Wenn AWS serverlose Berechnungen plant, wird eine ausführbare Datei mit dem Namen bootstrap ausgeführt. Wie Bootstrap implementiert wird, ist frei wählbar. Es könnte eine statische Binärdatei sein, die mit Golang oder Rust erstellt wurde. Es kann auch ein ausführbares Bash-Skript sein. Der Zweck von bootstrap besteht darin, eine 'Funktion' zu verwalten, die von bootstrap aufgerufen wird. Wie Sie die Funktion aufrufen möchten, bleibt Ihnen überlassen. Die Funktion könnte Teil von 'Bootstrap' sein, d.h. Sie könnten eine einzelne Anwendung in Go erstellen, oder Sie könnten einen generischen Handler erstellen, der Funktionen aufruft, die in der CloudFormation-Konfiguration, d.h. im Feld 'Handler', angegeben wurden.
#!/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
EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)
# Execute the handler function from the script
RESPONSE=$($(echo "$_HANDLER" | cut -d. -f2) "$EVENT_DATA")
# Send the response
curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response" -d "$RESPONSE"
done
Funktion
Die Funktion ist ein einfaches Bash-Skript, das 'Hello World' an API Gateway zurückgibt:
function handler () {
EVENT_DATA=$1
echo "$EVENT_DATA" 1>&2;
RESPONSE="{"statusCode": 200, "body": "Hello World"}"
echo $RESPONSE
}
Beispiel
Wir haben ein Beispielprojekt vorbereitet, damit Sie die Arbeit mit benutzerdefinierten Laufzeiten ausprobieren können. Zum Ausführen des Beispiels geben Sie make delete.
Fazit
Die benutzerdefinierte Laufzeit von AWS Lambda ermöglicht es Ihnen, Ihren eigenen Bootstrap-Prozess zu definieren. Dadurch ist es möglich, eine hochspezialisierte Anwendung bereitzustellen, wenn Lambda aufgerufen wird. Wir haben unsere eigene Bash-basierte Bootstrap-Anwendung erstellt. Wir haben ein Lambda mit CloudFormation konfiguriert, das eine bereitgestellte Laufzeit definiert, und wir haben einen Bash-basierten Handler erstellt, der API Gateway Proxy-Ereignisse verarbeitet. Wie kann man nun ein Lambda in ein Lambda einfügen?
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact




