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 den AWS Serverless Application Model sam local invoke Unterbefehl Command Line Interface (AWS SAMCLI), um einen einmaligen lokalen Aufruf einer AWS Lambda Funktion zu initiieren.

Um das zu verwendensam local invoke, installieren Sie das, AWS SAMCLI 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

Bei der Ausführung AWS SAMCLI wird davon ausgegangensam local invoke, dass Ihr aktuelles Arbeitsverzeichnis das Stammverzeichnis Ihres Projekts ist. Das AWS SAMCLI sucht zuerst nach einer template.[yaml|yml] Datei in einem .aws-sam Unterordner. Wenn nicht gefunden, sucht der AWS SAMCLI 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. Das AWS SAMCLI erstellt Ihre Funktion in einem lokalen Container mitDocker. 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 werden. Im Folgenden wird ein Beispiel gezeigt:

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

Geben Sie eine Vorlage oder Funktion an

Verwenden Sie die --template Option, AWS SAMCLI um eine Vorlage anzugeben, auf die verwiesen werden soll. Es AWS SAMCLI werden nur diese AWS SAM Vorlage und die Ressourcen, auf die sie verweist, geladen.

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 aus Ihrem Projekt Terraform

Verwenden Sie die --hook-name Option, um Lambda-Funktionen aus Ihren Terraform Projekten lokal zu testen. Weitere Informationen hierzu finden Sie unter Verwenden von AWS SAMCLI with Terraform für lokales Debuggen und Testen.

Im Folgenden wird ein Beispiel gezeigt:

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

Bewährte Methoden

Wenn in Ihrer Anwendung ein .aws-sam Verzeichnis 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 Gateway-Beispielereignis und verwenden Sie es, um lokal eine Lambda-Funktion aufzurufen

Zunächst generieren wir eine API Gateway Gateway-HTTP-API-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 der Serverless Land Sessions with SAM-Serie. YouTube