Introducción a las pruebas con sam local invoke - AWS Serverless Application Model

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Introducción a las pruebas con sam local invoke

Use la AWS Serverless Application Model Interfaz de línea de comandos (AWS SAM CLI) sam local invoke subcomando para iniciar una invocación única de un AWS Lambda funcionan de forma local.

Para usarlosam local invoke, instale el AWS SAM CLI completando lo siguiente:

Antes de usar sam local invoke, se recomienda tener conocimientos básicos de lo siguiente:

Invocar una función de Lambda localmente

Cuando corressam local invoke, el AWS SAM CLI asume que el directorio de trabajo actual es el directorio raíz del proyecto. La AWS SAM CLI buscará primero un template.[yaml|yml] archivo dentro de una .aws-sam subcarpeta. Si no lo encuentra, el AWS SAM CLI buscará un template.[yaml|yml] archivo en su directorio de trabajo actual.

Para invocar una función de Lambda de forma local
  1. Desde el directorio raíz del proyecto, ejecute lo siguiente:

    $ sam local invoke <options>
  2. Si la aplicación contiene más de una función, proporcione el identificador lógico de la función. A continuación, se muestra un ejemplo:

    $ sam local invoke HelloWorldFunction
  3. La AWS SAM CLI crea tu función en un contenedor local usando Docker. Luego invoca su función y genera la respuesta de su función.

    A continuación, se muestra un ejemplo:

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

Administración de registros de

Cuando se usa sam local invoke, la salida del tiempo de ejecución de la función de Lambda (por ejemplo, los registros) se envía a stderr y el resultado de la función de Lambda se envía a stdout.

A continuación, se muestra un ejemplo de una función de Lambda básica:

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

Puede guardar estas salidas estándar. A continuación, se muestra un ejemplo:

$ 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

Puede utilizar estos resultados estándar para automatizar aún más sus procesos de desarrollo local.

Opciones

Transferencia de eventos personalizados para invocar la función de Lambda

Para pasar un evento a la función de Lambda, utilice la opción --event. A continuación, se muestra un ejemplo:

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

Puede crear eventos con el subcomando sam local generate-event. Para obtener más información, consulte Introducción a las pruebas con sam local generate-event.

Pase variables de entorno al invocar la función de Lambda

Si la función de Lambda usa variables de entorno, puede pasarlas durante las pruebas locales con la opción --env-vars. Esta es una excelente forma de probar una función Lambda localmente con servicios de su aplicación que ya están desplegados en la nube. A continuación, se muestra un ejemplo:

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

Especifique una plantilla o función

Para especificar una plantilla para AWS SAM CLI para hacer referencia, utilice la --template opción. La AWS SAM CLI cargará solo eso AWS SAM plantilla y los recursos a los que apunta.

Para invocar una función de una aplicación o pila anidada, proporcione el identificador lógico de la aplicación o pila junto con el identificador lógico de la función. A continuación, se muestra un ejemplo:

$ sam local invoke StackLogicalId/FunctionLogicalId

Pruebe una función Lambda desde su Terraform project

Utilice la --hook-name opción para probar localmente las funciones Lambda desde su Terraform proyectos. Para obtener más información, consulte Uso de AWS SAM CLI with Terraform para la depuración y las pruebas locales.

A continuación, se muestra un ejemplo:

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

Prácticas recomendadas

Si la aplicación tiene un directorio .aws-sam desde el que se ejecuta sam build, asegúrese de ejecutar sam build cada vez que actualice el código de la función. A continuación, ejecute sam local invoke para probar localmente el código de función actualizado.

Las pruebas locales son una excelente solución para desarrollar y probar rápidamente antes de implementarlas en la nube. Sin embargo, las pruebas locales no lo validan todo, como los permisos entre los recursos de la nube. En la medida de lo posible, pruebe sus aplicaciones en la nube. Le recomendamos que utilice sam sync para acelerar los flujos de trabajo de pruebas en la nube.

Ejemplos

Genere un evento de muestra de Amazon API Gateway y utilícelo para invocar una función Lambda localmente

Primero, generamos una carga útil de HTTP API eventos de API Gateway y la guardamos en nuestra events carpeta.

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

A continuación, modificamos la función de Lambda para que devuelva un valor de parámetro del evento.

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

A continuación, invocamos localmente la función de Lambda y proporcionamos un evento personalizado.

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

Pasar variables de entorno al invocar una función de Lambda localmente

Esta aplicación tiene una función de Lambda que utiliza una variable de entorno como nombre de tabla de Amazon DynamoDB. A continuación se muestra un ejemplo de la función definida en AWS SAM plantilla:

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 ...

Queremos probar localmente la función de Lambda mientras interactúa con la tabla de DynamoDB en la nube. Para ello, creamos un archivo de variables de entorno y lo guardamos en el directorio raíz del proyecto como locals.json. El valor se proporciona aquí para las referencias del SAMPLE_TABLE de la tabla de DynamoDB en la nube.

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

A continuación, ejecutamos sam local invoke y transferimos la variables de entorno con la opción --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":"{}"}

Más información

Para obtener una lista de todas las opciones sam local invoke, consulte sam local invoke.

Para ver una demostración de su usosam local, consulte AWS SAM para el desarrollo local. Pruebas Nube de AWS recursos de los entornos de desarrollo local en las Serverless Land Sessions con SAM una serie sobre YouTube.