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

Utilizzate il AWS Serverless Application Model sam local invoke sottocomando Command Line Interface (AWS SAMCLI) per avviare una chiamata una tantum di una funzione localmente. AWS Lambda

Per utilizzarlosam local invoke, AWS SAMCLI installate il completando quanto segue:

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

Richiama una funzione Lambda localmente

Quando si eseguesam local invoke, si AWS SAMCLI presuppone che la directory di lavoro corrente sia la directory principale del progetto. AWS SAMCLICercheranno innanzitutto un template.[yaml|yml] file all'interno di una .aws-sam sottocartella. Se non viene trovato, AWS SAMCLI 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. AWS SAMCLICostruisce la tua funzione in un contenitore locale utilizzandoDocker. Quindi richiama la tua funzione e restituisce la risposta della tua 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 AWS SAMCLI a cui fare riferimento, utilizzate l'--templateopzione. AWS SAMCLICaricherà 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 progetto Terraform

Usa l'--hook-nameopzione per testare localmente le funzioni Lambda dei tuoi Terraform progetti. Per ulteriori informazioni, consulta Utilizzo di AWS SAMCLI with 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 eventi API Gateway HTTP 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 nella serie Serverless Land Sessions with SAM on YouTube.