Verwenden von Lambda mit der AWS CLI - AWS Lambda

Verwenden von Lambda mit der AWS CLI

Sie können die AWS Command Line Interface verwenden, um Funktionen und andere AWS Lambda-Ressourcen zu verwalten. Die AWS CLI verwendet die AWS SDK for Python (Boto) für die Interaktion mit der Lambda-API. Sie können damit mehr über die API erfahren und dieses Wissen für die Entwicklung von Anwendungen, die Lambda mit dem AWS-SDK verwenden, nutzen.

In diesem Tutorial werden Sie Lambda-Funktionen mit der AWS CLI verwalten und aufrufen. Weitere Informationen finden Sie unter Was ist AWS CLI? im AWS Command Line Interface-Benutzerhandbuch.

Voraussetzungen

In diesem Tutorial wird davon ausgegangen, dass Sie über Kenntnisse zu den grundlegenden Lambda-Operationen und der Lambda-Konsole verfügen. Wenn Sie es noch nicht getan haben, folgen Sie den Anweisungen in Erstellen einer Lambda-Funktion mit der Konsole.

Um die folgenden Schritte auszuführen, benötigen Sie ein Befehlszeilen-Terminal oder eine Shell für die Ausführung der Befehle. Befehle und die erwartete Ausgabe werden in separaten Blöcken aufgeführt:

aws --version

Die Ausgabe sollte folgendermaßen aussehen:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

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

Unter Windows werden einige Bash-CLI-Befehle, die üblicherweise mit Lambda verwendet werden (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.

Dieses Tutorial verwendet die AWS Command Line Interface (AWS CLI), um Dienst-API-Operationen aufzurufen. Informationen zum Installieren von AWS CLI finden Sie unter Installieren von AWS CLI im AWS Command Line Interface-Benutzerhandbuch.

Erstellen der Ausführungsrolle

Erstellen Sie die Ausführungsrolle die Ihrer Funktion die Berechtigung für den Zugriff auf AWS-Ressourcen erteilt. Verwenden Sie den Befehl AWS CLI, um eine Ausführungsrolle mit der create-role zu erstellen.

Im folgenden Beispiel geben Sie die Vertrauensrichtlinie inline an. Die Anforderungen für Escape-Anführungszeichen in der JSON-Zeichenfolge variieren je nach Shell.

aws iam create-role --role-name lambda-ex --assume-role-policy-document '{"Version": "2012-10-17","Statement": [{ "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole"}]}'

Sie können die Vertrauensrichtlinie für die Rolle auch mithilfe einer JSON-Datei definieren. Im folgenden Beispiel ist trust-policy.json eine Datei im aktuellen Verzeichnis. Diese Vertrauensrichtlinie ermöglicht es Lambda, die Berechtigungen der Rolle zu verwenden, indem es dem Service-Prinzipal lambda.amazonaws.com die Erlaubnis erteilt, die Aktion AWS Security Token Service (AWS STS) AssumeRole aufzurufen.

Beispiel trust-policy.json
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
aws iam create-role --role-name lambda-ex --assume-role-policy-document file://trust-policy.json

Die Ausgabe sollte folgendermaßen aussehen:

{ "Role": { "Path": "/", "RoleName": "lambda-ex", "RoleId": "AROAQFOXMPL6TZ6ITKWND", "Arn": "arn:aws:iam::123456789012:role/lambda-ex", "CreateDate": "2020-01-17T23:19:12Z", "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }

Um der Rolle Berechtigungen hinzuzufügen, verwenden Sie den attach-policy-to-role-Befehl. Beginnen Sie mit dem Hinzufügen der AWSLambdaBasicExecutionRole verwalteten Richtlinie.

aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole

Die Richtlinie AWSLambdaBasicExecutionRole verfügt über die Berechtigungen, die die Funktion zum Schreiben von Protokollen in CloudWatch Logs benötigt.

Erstellen der Funktion

Das folgende Beispiel protokolliert die Werte der Umgebungsvariablen und des Ereignisobjekts.

Beispiel index.js
exports.handler = async function(event, context) { console.log("ENVIRONMENT VARIABLES\n" + JSON.stringify(process.env, null, 2)) console.log("EVENT\n" + JSON.stringify(event, null, 2)) return context.logStreamName }
So erstellen Sie die Funktion
  1. Kopieren Sie den Beispiel-Code in eine Datei mit dem Namen index.js.

  2. Erstellen Sie ein Bereitstellungspaket.

    zip function.zip index.js
  3. Erstellen Sie eine Lambda-Funktion mit dem Befehl create-function. Ersetzen Sie den markierten Text im Rollen-ARN durch Ihre Konto-ID.

    aws lambda create-function --function-name my-function \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs16.x \ --role arn:aws:iam::123456789012:role/lambda-ex

    Die Ausgabe sollte folgendermaßen aussehen:

    { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }

Um Protokolle für einen Aufruf über die Befehlszeile abzurufen, verwenden Sie die Option --log-type. Die Antwort enthält das Feld LogResult, das bis zu 4 KB base64-verschlüsselte Protokolle aus dem Aufruf enthält.

aws lambda invoke --function-name my-function out --log-type Tail

Die Ausgabe sollte folgendermaßen aussehen:

{ "StatusCode": 200, "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...", "ExecutedVersion": "$LATEST" }

Mit dem Dienstprogramm base64 können Sie die Protokolle dekodieren.

aws lambda invoke --function-name my-function out --log-type Tail \ --query 'LogResult' --output text | base64 -d

Die Ausgabe sollte folgendermaßen aussehen:

START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST "AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib", END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Duration: 79.67 ms Billed Duration: 80 ms Memory Size: 128 MB Max Memory Used: 73 MB

Das base64-Serviceprogramm ist nur in Linux, macOS und Ubuntu auf Windows verfügbar. Im Fall von macOS lautet der Befehl base64 -D.

Um vollständige Protokollereignisse über die Befehlszeile zu erhalten, können Sie den Namen des Protokoll-Streams in die Ausgabe Ihrer Funktion einschließen, wie im voranstehenden Beispiel veranschaulicht. Das folgende Beispielskript ruft eine Funktion mit dem Namen my-function auf und lädt die letzten fünf Protokollereignisse herunter.

Beispiel get-logs.sh-Skript

Dieses Beispiel erfordert, dass my-function eine Protokoll-Stream-ID zurückgibt.

#!/bin/bash aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out sed -i'' -e 's/"//g' out sleep 15 aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name $(cat out) --limit 5

Das Skript verwendet sed zum Entfernen von Anführungszeichen aus der Ausgabedatei und wechselt 15 Sekunden lang in den Ruhezustand, um Zeit einzuräumen, damit Protokolle verfügbar werden können. Die Ausgabe enthält die Antwort von Lambda und die get-log-eventsAusgabe des Befehls.

./get-logs.sh

Die Ausgabe sollte folgendermaßen aussehen:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" } { "events": [ { "timestamp": 1559763003171, "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n", "ingestionTime": 1559763003309 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003173, "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r \"key\": \"value\"\r}\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n", "ingestionTime": 1559763018353 }, { "timestamp": 1559763003218, "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n", "ingestionTime": 1559763018353 } ], "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795", "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080" }

Aktualisieren der Funktion

Nachdem Sie eine Funktion erstellt haben, können Sie zusätzliche Funktionen für die Funktion konfigurieren, z. B. Auslöser, Netzwerkzugriff und Dateisystemzugriff. Sie können auch Ressourcen anpassen, die mit der Funktion verknüpft sind, wie Arbeitsspeicher und Gleichzeitigkeit. Diese Konfigurationen gelten für Funktionen, die als ZIP-Dateiarchive definiert sind und für Funktionen, die als Container-Images definiert sind.

Verwenden des update-function-configuration-Befehls zum Konfigurieren von Funktionen. Im folgenden Beispiel wird der Funktionsspeicher auf 256 MB gesetzt.

Beispiel Befehl „Update Function Configuration (Funktionskonfiguration aktualisieren)“
aws lambda update-function-configuration \ --function-name my-function \ --memory-size 256

Auflisten der Lambda-Funktionen in Ihrem Konto

Führen Sie den folgenden AWS CLI-Befehl list-functions aus, um eine Liste von Funktionen abzurufen, die Sie erstellt haben.

aws lambda list-functions --max-items 10

Die Ausgabe sollte folgendermaßen aussehen:

{ "Functions": [ { "FunctionName": "cli", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "Handler": "index.handler", ... }, { "FunctionName": "random-error", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:random-error", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::123456789012:role/lambda-role", "Handler": "index.handler", ... }, ... ], "NextToken": "eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=" }

Als Reaktion gibt Lambda eine Liste von bis zu 10 Funktionen zurück. Wenn weitere Funktionen vorhanden sind, die Sie abrufen können, stellt NextToken eine Markierung bereit, die Sie in der nächsten list-functions-Anforderung verwenden können. Der folgende list-functions AWS CLI-Befehl zeigt den Parameter --starting-token.

aws lambda list-functions --max-items 10 --starting-token eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAxMH0=

Abrufen einer Lambda-Funktion

Der Lambda-CLI-Befehl get-function gibt Lambda-Funktionsmetadaten sowie eine vorsignierte URL zurück, die Sie zum Herunterladen des Bereitstellungspakets der Funktion nutzen können.

aws lambda get-function --function-name my-function

Die Ausgabe sollte folgendermaßen aussehen:

{ "Configuration": { "FunctionName": "my-function", "FunctionArn": "arn:aws:lambda:us-east-2:123456789012:function:my-function", "Runtime": "nodejs16.x", "Role": "arn:aws:iam::123456789012:role/lambda-ex", "CodeSha256": "FpFMvUhayLkOoVBpNuNiIVML/tuGv2iJQ7t0yWVTU8c=", "Version": "$LATEST", "TracingConfig": { "Mode": "PassThrough" }, "RevisionId": "88ebe1e1-bfdf-4dc3-84de-3017268fa1ff", ... }, "Code": { "RepositoryType": "S3", "Location": "https://awslambda-us-east-2-tasks.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-function-4203078a-b7c9-4f35-..." } }

Weitere Informationen finden Sie unter GetFunction.

Bereinigen

Führen Sie den folgenden delete-function-Befehl aus, um die my-function-Funktion zu löschen.

aws lambda delete-function --function-name my-function

Löschen Sie die IAM-Rolle, die Sie in der IAM-Konsole erstellt haben. Weitere Informationen zum Löschen von Rollen finden Sie unter Löschen von Rollen oder Instance-Profilen im IAM-Benutzerhandbuch.