

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
<a name="using-sam-cli-local-invoke"></a>

Use o AWS Serverless Application Model `sam local invoke` subcomando Command Line Interface (AWS SAMCLI) para iniciar localmente uma invocação única de uma função. AWS Lambda 
+ Para obter uma introdução ao AWS SAMCLI, consulte [O que é o AWS SAMCLI?](what-is-sam-overview.md#what-is-sam-cli)
+ Para obter uma lista de opções de comando `sam local invoke`, consulte [sam local invoke](sam-cli-command-reference-sam-local-invoke.md).
+ Para obter um exemplo de uso do `sam local invoke` durante um fluxo de trabalho de desenvolvimento típico, consulte [Etapa 7: (opcional) Teste seu aplicativo localmente](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-test).

**nota**  
Não é recomendável usar os recursos de invocação local do SAM CLI em código não confiável. Para ter um isolamento completo do seu ambiente local, execute o código diretamente no serviço Lambda.

**nota**  
`sam local invoke`suporta funções duráveis com recursos automáticos de verificação e repetição. Ao invocar funções duráveis localmente, o estado de execução é gerenciado automaticamente.

## Pré-requisitos
<a name="using-sam-cli-local-invoke-prerequisites"></a>

Para usar o `sam local invoke`, instale o AWS SAM CLI fazendo o seguinte:
+ [AWS SAM pré-requisitos](prerequisites.md).
+ [Instale o AWS SAM CLI](install-sam-cli.md).

Antes de usar `sam local invoke`, recomendamos uma compreensão básica do seguinte:
+ [Configurando o AWS SAM CLI](using-sam-cli-configure.md).
+ [Crie seu aplicativo em AWS SAM](using-sam-cli-init.md).
+ [Introdução à construção com AWS SAM](using-sam-cli-build.md).
+ [Introdução à implantação com AWS SAM](using-sam-cli-deploy.md).

## Invocar uma função do Lambda localmente
<a name="using-sam-cli-local-invoke-use"></a>

Quando você executa `sam local invoke`, AWS SAMCLI 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 SAMCLI 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>
   ```

1. Se seu aplicativo contiver mais de uma função, forneça o ID lógico da função. Este é um exemplo:

   ```
   $ sam local invoke HelloWorldFunction
   ```

1. O AWS SAMCLI 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.

   Este é um exemplo:

   ```
   $ 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
<a name="using-sam-cli-local-invoke-logs"></a>

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. Este é um exemplo:

```
$ 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
<a name="using-sam-cli-local-invoke-options"></a>

### Passe eventos personalizados para invocar a função do Lambda
<a name="using-sam-cli-local-invoke-options-events"></a>

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

```
$ 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](using-sam-cli-local-generate-event.md).

### Passe variáveis de ambiente ao invocar sua função do Lambda
<a name="using-sam-cli-local-invoke-options-env"></a>

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. Este é um exemplo:

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

### Especificar um modelo ou função
<a name="using-sam-cli-local-invoke-options-specify"></a>

Para especificar um modelo para o AWS SAMCLI para referência, use a opção `--template`. Eles AWS SAMCLI carregarão apenas esse AWS SAM modelo 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. Este é um exemplo:

```
$ sam local invoke StackLogicalId/FunctionLogicalId
```

### Testar uma função do Lambda no seu projeto Terraform
<a name="using-sam-cli-local-invoke-options-terraform"></a>

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 SAMCLI with Terraform para depuração e teste locais](using-samcli-terraform.md).

Este é um exemplo:

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

## Práticas recomendadas
<a name="using-sam-cli-local-invoke-best"></a>

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`](using-sam-cli-sync.md) para acelerar seus fluxos de trabalho de testes na nuvem.

## Exemplos
<a name="using-sam-cli-local-invoke-examples"></a>

### Gere um evento de amostra do Amazon API Gateway e use-o para invocar uma função do Lambda localmente
<a name="using-sam-cli-local-invoke-examples-api"></a>

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
<a name="using-sam-cli-local-invoke-examples-env"></a>

Esse aplicativo tem uma função do Lambda que usa uma variável de ambiente para o nome de uma tabela do Amazon DynamoDB. Veja a seguir um exemplo da função definida no AWS SAM modelo:

```
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
<a name="using-sam-cli-local-invoke-learn"></a>

Para obter uma lista de todas as opções `sam local invoke`, consulte [sam local invoke](sam-cli-command-reference-sam-local-invoke.md).

Para uma demonstração do uso `sam local`, consulte [AWS SAM para desenvolvimento local. Testando Nuvem AWS recursos de ambientes de desenvolvimento local](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24) na *série Serverless Land Sessions with SAM on*. YouTube