Einführung in das Testen mit sam local invoke - AWS Serverless Application Model

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.

Einführung in das Testen mit sam local invoke

Verwenden Sie die AWS Serverless Application Model Befehlszeilenschnittstelle (AWS SAM CLIsam local invokeUnterbefehl, um einen einmaligen lokalen Aufruf einer AWS Lambda Funktion zu initiieren.

Um es zu verwendensam local invoke, installieren Sie das AWS SAM CLI indem Sie die folgenden Schritte ausführen:

Vor der Verwendung empfehlen wirsam local invoke, sich mit folgenden Grundkenntnissen vertraut zu machen:

Lokal eine Lambda-Funktion aufrufen

Wenn du rennst, sam local invoke AWS SAM CLI geht davon aus, dass Ihr aktuelles Arbeitsverzeichnis das Stammverzeichnis Ihres Projekts ist. Das AWS SAM CLI sucht zuerst nach einer template.[yaml|yml] Datei in einem .aws-sam Unterordner. Wenn nicht gefunden, AWS SAM CLI sucht nach einer template.[yaml|yml] Datei in Ihrem aktuellen Arbeitsverzeichnis.

Um eine Lambda-Funktion lokal aufzurufen
  1. Führen Sie im Stammverzeichnis Ihres Projekts Folgendes aus:

    $ sam local invoke <options>
  2. Wenn Ihre Anwendung mehr als eine Funktion enthält, geben Sie die logische ID der Funktion an. Im Folgenden wird ein Beispiel gezeigt:

    $ sam local invoke HelloWorldFunction
  3. Die AWS SAM CLI baut Ihre Funktion in einem lokalen Container auf mit Docker. Es ruft dann Ihre Funktion auf und gibt die Antwort Ihrer Funktion aus.

    Im Folgenden wird ein Beispiel gezeigt:

    $ sam local invoke Invoking app.lambda_handler (python3.9) Local image is out of date and will be updated to the latest runtime. To skip this, pass in the parameter --skip-pull-image Building image.................................................................................................................... Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Version: $LATEST END RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df REPORT RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Init Duration: 1.09 ms Duration: 608.42 ms Billed Duration: 609 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%

Verwalten von -Protokollen

Bei der Verwendung sam local invoke wird die Laufzeitausgabe der Lambda-Funktion (z. B. Protokolle) und das Ergebnis der Lambda-Funktion an ausgegeben. stderr stdout

Das Folgende ist ein Beispiel für eine grundlegende Lambda-Funktion:

def handler(event, context): print("some log") # this goes to stderr return "hello world" # this goes to stdout

Sie können diese Standardausgaben speichern. Im Folgenden wird ein Beispiel gezeigt:

$ sam local invoke 1> stdout.log ... $ cat stdout.log "hello world" $ sam local invoke 2> stderr.log ... $ cat stderr.log Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Version: $LATEST some log END RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 REPORT RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Init Duration: 0.91 ms Duration: 589.19 ms Billed Duration: 590 ms Memory Size: 128 MB Max Memory Used: 128 MB

Sie können diese Standardausgaben verwenden, um Ihre lokalen Entwicklungsprozesse weiter zu automatisieren.

Optionen

Übergeben Sie benutzerdefinierte Ereignisse, um die Lambda-Funktion aufzurufen

Verwenden Sie die --event Option, um ein Ereignis an die Lambda-Funktion zu übergeben. Im Folgenden wird ein Beispiel gezeigt:

$ sam local invoke --event events/s3.json S3JsonLoggerFunction

Sie können Ereignisse mit dem sam local generate-event Unterbefehl erstellen. Weitere Informationen hierzu finden Sie unter Einführung in das Testen mit sam local generate-event.

Übergeben Sie Umgebungsvariablen, wenn Sie Ihre Lambda-Funktion aufrufen

Wenn Ihre Lambda-Funktion Umgebungsvariablen verwendet, können Sie diese bei lokalen Tests mit der --env-vars Option übergeben. Dies ist eine hervorragende Möglichkeit, eine Lambda-Funktion lokal mit Diensten in Ihrer Anwendung zu testen, die bereits in der Cloud bereitgestellt sind. Im Folgenden wird ein Beispiel gezeigt:

$ sam local invoke --env-vars locals.json

Geben Sie eine Vorlage oder Funktion an

Um eine Vorlage für das anzugeben AWS SAM CLI um zu referenzieren, verwenden Sie die --template Option. Die AWS SAM CLI lädt nur diese AWS SAM Vorlage und die Ressourcen, auf die sie verweist.

Um eine Funktion einer verschachtelten Anwendung oder eines geschachtelten Stacks aufzurufen, geben Sie die logische ID der Anwendung oder des Stacks zusammen mit der logischen ID der Funktion an. Im Folgenden wird ein Beispiel gezeigt:

$ sam local invoke StackLogicalId/FunctionLogicalId

Testen Sie eine Lambda-Funktion von Ihrem Terraform project

Verwenden Sie die --hook-name Option, um Lambda-Funktionen lokal von Ihrem aus zu testen Terraform projekte. Weitere Informationen hierzu finden Sie unter Mit dem AWS SAM CLI mit Terraform zum lokalen Debuggen und Testen.

Im Folgenden wird ein Beispiel gezeigt:

$ sam local invoke --hook-name terraform --beta-features

Bewährte Methoden

Wenn Ihre Anwendung ein .aws-sam Verzeichnis hat, das nicht ausgeführt wirdsam build, stellen Sie sicher, dass es sam build jedes Mal ausgeführt wird, wenn Sie Ihren Funktionscode aktualisieren. Führen Sie dann sam local invoke den Befehl aus, um Ihren aktualisierten Funktionscode lokal zu testen.

Lokales Testen ist eine hervorragende Lösung für schnelles Entwickeln und Testen vor der Bereitstellung in der Cloud. Bei lokalen Tests wird jedoch nicht alles überprüft, z. B. die Berechtigungen zwischen Ihren Ressourcen in der Cloud. Testen Sie Ihre Anwendungen so oft wie möglich in der Cloud. Wir empfehlen sam sync die Verwendung, um Ihre Cloud-Test-Workflows zu beschleunigen.

Beispiele

Generieren Sie ein Amazon API Gateway-Beispielereignis und verwenden Sie es, um lokal eine Lambda-Funktion aufzurufen

Zuerst generieren wir eine API HTTP API Gateway-Event-Payload und speichern sie in unserem events Ordner.

$ sam local generate-event apigateway http-api-proxy > events/apigateway_event.json

Als Nächstes ändern wir unsere Lambda-Funktion, um einen Parameterwert aus dem Ereignis zurückzugeben.

def lambda_handler(event, context): print("HelloWorldFunction invoked") return { "statusCode": 200, "body": json.dumps({ "message": event['queryStringParameters']['parameter2'], }), }

Als Nächstes rufen wir lokal unsere Lambda-Funktion auf und stellen unser benutzerdefiniertes Ereignis bereit.

$ sam local invoke --event events/apigateway_event.json Invoking app.lambda_handler (python3.9) Local image is up-to-date Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64. Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode": 200, "body": "{\"message\": \"value\"}"}%

Übergeben Sie Umgebungsvariablen, wenn Sie eine Lambda-Funktion lokal aufrufen

Diese Anwendung hat eine Lambda-Funktion, die eine Umgebungsvariable für einen Amazon DynamoDB-Tabellennamen verwendet. Das Folgende ist ein Beispiel für die in der Vorlage definierte Funktion: AWS SAM

AWSTemplateFormatVersion: 2010-09-09 Transform: AWS::Serverless-2016-10-31 ... Resources: getAllItemsFunction: Type: AWS::Serverless::Function Properties: Handler: src/get-all-items.getAllItemsHandler Description: get all items Policies: - DynamoDBReadPolicy: TableName: !Ref SampleTable Environment: Variables: SAMPLE_TABLE: !Ref SampleTable ...

Wir möchten unsere Lambda-Funktion lokal testen und gleichzeitig mit unserer DynamoDB-Tabelle in der Cloud interagieren lassen. Dazu erstellen wir unsere Umgebungsvariablendatei und speichern sie im Stammverzeichnis unseres Projekts unter. locals.json Der hier angegebene Wert für SAMPLE_TABLE verweist auf unsere DynamoDB-Tabelle in der Cloud.

{ "getAllItemsFunction": { "SAMPLE_TABLE": "dev-demo-SampleTable-1U991234LD5UM98" } }

Als Nächstes führen wir unsere Umgebungsvariablen mit der Option aus sam local invoke und übergeben sie. --env-vars

$ sam local invoke getAllItemsFunction --env-vars locals.json Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST some log END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Init Duration: 1.63 ms Duration: 564.07 ms Billed Duration: 565 ms Memory Size: 128 MB Max Memory Used: 128 MB {"statusCode":200,"body":"{}"}

Weitere Informationen

Eine Liste aller sam local invoke Optionen finden Sie untersam local invoke.

Eine Demo der Verwendung sam local finden Sie unter AWS SAM Lokale Entwicklung. Testen von AWS Cloud Ressourcen aus lokalen Entwicklungsumgebungen in den Serverless Land Sessions mit der SAM Serie über YouTube.