Introduzione ai test con sam local invoke - AWS Serverless Application Model

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Introduzione ai test con sam local invoke

Usa l'interfaccia AWS Serverless Application Model a riga di comando (AWS SAM CLI) sam local invoke sottocomando per avviare una chiamata una tantum di una funzione localmente. AWS Lambda

Per utilizzarlosam local invoke, installa AWS SAM CLI completando quanto segue:

Prima dell'usosam local invoke, si consiglia una conoscenza di base di quanto segue:

Richiama una funzione Lambda localmente

Quando corrisam local invoke, AWS SAM CLI presuppone che la directory di lavoro corrente sia la directory principale del progetto. La AWS SAM CLI cercherà innanzitutto un template.[yaml|yml] file all'interno di una .aws-sam sottocartella. Se non viene trovato, il AWS SAM CLI cercherà un template.[yaml|yml] file all'interno della directory di lavoro corrente.

Per richiamare una funzione Lambda localmente
  1. Dalla directory principale del progetto, esegui quanto segue:

    $ sam local invoke <options>
  2. Se l'applicazione contiene più di una funzione, fornite l'ID logico della funzione. Di seguito è riportato un esempio:

    $ sam local invoke HelloWorldFunction
  3. La AWS SAM CLI crea la tua funzione in un contenitore locale usando Docker. Quindi richiama la funzione e restituisce la risposta della funzione.

    Di seguito è riportato un esempio:

    $ 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\"}"}%

Gestione dei log

Quando si utilizzasam local invoke, l'output del runtime della funzione Lambda (ad esempio, i log) viene emesso su e il risultato della funzione Lambda viene emesso su. stderr stdout

Di seguito è riportato un esempio di una funzione Lambda di base:

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

È possibile salvare queste uscite standard. Di seguito è riportato un esempio:

$ 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

È possibile utilizzare questi output standard per automatizzare ulteriormente i processi di sviluppo locale.

Opzioni

Passa eventi personalizzati per richiamare la funzione Lambda

Per passare un evento alla funzione Lambda, utilizzate l'--eventopzione. Di seguito è riportato un esempio:

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

È possibile creare eventi con il sam local generate-event sottocomando. Per ulteriori informazioni, consulta Introduzione ai test con sam local generate-event.

Passa le variabili di ambiente quando richiami la funzione Lambda

Se la tua funzione Lambda utilizza variabili di ambiente, puoi passarle durante i test locali con l'--env-varsopzione. Questo è un ottimo modo per testare una funzione Lambda localmente con i servizi dell'applicazione che sono già distribuiti nel cloud. Di seguito è riportato un esempio:

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

Specificate un modello o una funzione

Per specificare un modello per AWS SAM CLI per fare riferimento, utilizzate l'--templateopzione. La AWS SAM CLI caricherà solo quel AWS SAM modello e le risorse a cui punta.

Per richiamare una funzione di un'applicazione o di uno stack annidato, fornisci l'ID logico dell'applicazione o dello stack insieme all'ID logico della funzione. Di seguito è riportato un esempio:

$ sam local invoke StackLogicalId/FunctionLogicalId

Prova una funzione Lambda dal tuo Terraform project

Usa l'--hook-nameopzione per testare localmente le funzioni Lambda dal tuo Terraform progetti. Per ulteriori informazioni, consulta Usando il AWS SAM CLI con Terraform per il debug e il test locali.

Di seguito è riportato un esempio:

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

Best practice

Se la tua applicazione ha una .aws-sam directory in esecuzionesam build, assicurati di eseguirla sam build ogni volta che aggiorni il codice della funzione. Quindi, sam local invoke esegui per testare localmente il codice funzionale aggiornato.

I test locali sono un'ottima soluzione per lo sviluppo e il test rapidi prima della distribuzione nel cloud. Tuttavia, i test locali non convalidano tutto, come le autorizzazioni tra le risorse nel cloud. Per quanto possibile, testa le tue applicazioni nel cloud. Ti consigliamo di sam syncutilizzarlo per velocizzare i flussi di lavoro di test sul cloud.

Esempi

Genera un evento di esempio Amazon API Gateway e utilizzalo per richiamare una funzione Lambda localmente

Innanzitutto, generiamo un payload di HTTP API eventi API Gateway e lo salviamo events nella nostra cartella.

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

Successivamente, modifichiamo la nostra funzione Lambda per restituire un valore di parametro dall'evento.

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

Successivamente, invochiamo localmente la nostra funzione Lambda e forniamo il nostro evento personalizzato.

$ 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\"}"}%

Passa le variabili di ambiente quando richiami una funzione Lambda localmente

Questa applicazione dispone di una funzione Lambda che utilizza una variabile di ambiente per il nome di una tabella Amazon DynamoDB. Di seguito è riportato un esempio della funzione definita nel modello: 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 ...

Vogliamo testare localmente la nostra funzione Lambda facendola interagire con la nostra tabella DynamoDB nel cloud. Per fare ciò, creiamo il nostro file delle variabili di ambiente e lo salviamo nella directory principale del nostro progetto come. locals.json Il valore fornito qui per SAMPLE_TABLE fa riferimento alla nostra tabella DynamoDB nel cloud.

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

Successivamente, eseguiamo sam local invoke e passiamo le nostre variabili di ambiente con l'--env-varsopzione.

$ 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":"{}"}

Ulteriori informazioni

Per un elenco di tutte le sam local invoke opzioni, consultasam local invoke.

Per una dimostrazione dell'utilizzosam local, vedi AWS SAM per lo sviluppo locale. Test Cloud AWS delle risorse provenienti da ambienti di sviluppo locali nelle Serverless Land Sessions con SAM serie su YouTube.