Introdução aos testes com sam local invoke - AWS Serverless Application Model

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Introdução aos testes com sam local invoke

Use o subcomando Command Line Interface AWS Serverless Application Model (AWS SAMCLI) sam local invoke para iniciar localmente uma invocação única de uma função AWS Lambda.

Para usar o sam local invoke, instale o AWS SAM CLI fazendo o seguinte:

Antes de usar sam local invoke, recomendamos uma compreensão básica do seguinte:

Invocar uma função do Lambda localmente

Quando você executa sam local invoke, AWS SAM CLI pressupõe que seu diretório de trabalho atual seja o diretório raiz do seu projeto. O AWS SAM CLI, primeiro procurará um arquivo template.[yaml|yml] dentro de uma subpasta .aws-sam. Se não for encontrado, o AWS SAM CLI procurará um arquivo template.[yaml|yml] em seu diretório de trabalho atual.

Invocar uma função do Lambda localmente
  1. No diretório raiz do seu projeto, execute o seguinte:

    $ sam local invoke <options>
  2. Se seu aplicativo contiver mais de uma função, forneça o ID lógico da função. Veja um exemplo a seguir:

    $ sam local invoke HelloWorldFunction
  3. O AWS SAM CLI constrói sua função em um contêiner local Docker. Em seguida, ele invoca sua função e gera a resposta da sua função.

    Veja um exemplo a seguir:

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

Gerenciar logs do

Ao usar sam local invoke, a saída de tempo de execução da função do Lambda (por exemplo, registros) é enviada para stderr e o resultado da função do Lambda é enviado para stdout.

Veja a seguir um exemplo de uma função do Lambda básica:

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

Você pode salvar essas saídas padrão. Veja um exemplo a seguir:

$ 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

Você pode usar essas saídas padrão para automatizar ainda mais seus processos de desenvolvimento local.

Opções

Passe eventos personalizados para invocar a função do Lambda

Para passar um evento para a função do Lambda, use a opção --event. Veja um exemplo a seguir:

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

Você pode criar eventos com o subcomando sam local generate-event. Para saber mais, consulte Introdução aos testes com sam local generate-event.

Passe variáveis de ambiente ao invocar sua função do Lambda

Se sua função do Lambda usa variáveis de ambiente, você pode passá-las durante o teste local com a opção --env-vars. Essa é uma ótima maneira de testar uma função do Lambda localmente com serviços da aplicação que já estão implantados na nuvem. Veja um exemplo a seguir:

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

Especificar um modelo ou função

Para especificar um modelo para o AWS SAM CLI para referência, use a opção --template. Os AWS SAM CLI carregarão apenas esse modelo AWS SAM e os recursos para os quais ele aponta.

Para invocar uma função de um aplicativo ou pilha aninhada, forneça o ID lógico do aplicativo ou da pilha junto com o ID lógico da função. Veja um exemplo a seguir:

$ sam local invoke StackLogicalId/FunctionLogicalId

Testar uma função do Lambda no seu projeto Terraform

Use a opção --hook-name de testar localmente as funções do Lambda em seus projetos Terraform. Para saber mais, consulte Usando o AWS SAM CLI with Terraform para depuração e teste locais.

Veja um exemplo a seguir:

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

Práticas recomendadas

Se seu aplicativo tiver um diretório .aws-sam executando sam build, certifique-se de executar o sam build sempre que atualizar o código da função. Em seguida, execute o sam local invoke para testar localmente seu código de função atualizado.

O teste local é uma ótima solução para desenvolvimento e teste rápidos antes da implantação na nuvem. No entanto, os testes locais não validam tudo, como permissões entre seus recursos na nuvem. Tanto quanto possível, teste seus aplicativos na nuvem. Recomendamos usar o sam sync para acelerar seus fluxos de trabalho de testes na nuvem.

Exemplos

Gere um evento de amostra do Amazon API Gateway e use-o para invocar uma função do Lambda localmente

Primeiro, geramos uma carga útil de evento de API HTTP do API Gateway e a salvamos em nossa pasta events.

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

Em seguida, modificamos nossa função do Lambda para retornar um valor de parâmetro do evento.

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

Em seguida, invocamos localmente nossa função do Lambda e fornecemos nosso 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\"}"}%

Passe variáveis de ambiente ao invocar uma função do Lambda localmente

Esse aplicativo tem uma função do Lambda que usa uma variável de ambiente para o nome de uma tabela do Amazon DynamoDB. Este é um exemplo da função definida no modelo 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 ...

Queremos testar localmente nossa função do Lambda enquanto ela interage com nossa tabela do DynamoDB na nuvem. Para fazer isso, criamos nosso arquivo de variáveis de ambiente e o salvamos no diretório raiz do nosso projeto como locals.json. O valor fornecido aqui SAMPLE_TABLE faz referência à nossa tabela do DynamoDB na nuvem.

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

Em seguida, executamos sam local invoke e passamos nossas variáveis de ambiente com a opção --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":"{}"}

Saiba mais

Para obter uma lista de todas as opções sam local invoke, consulte sam local invoke.

Para uma demonstração do uso sam local, consulte AWS SAM para desenvolvimento local. Testando recursos Nuvem AWS de ambientes de desenvolvimento local na série Serverless Land Sessions com SAM on YouTube.