

# Compreender os métodos de invocação de funções do Lambda
<a name="lambda-invocation"></a>

Após implantar sua função do Lambda, você poderá invocá-la de várias maneiras:
+ O [console do Lambda](testing-functions.md): use o console do Lambda para criar rapidamente um evento de teste para invocar sua função.
+ O [AWS SDK](https://aws.amazon.com/developer/tools/): use o AWS SDK para invocar programaticamente sua função.
+ A API [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html): use a API Invoke do Lambda para invocar diretamente sua função.
+ A [AWS Command Line Interface (AWS CLI)](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html): use o comando `aws lambda invoke` da AWS CLI para invocar diretamente sua função diretamente da linha de comando.
+ Um [endpoint HTTP(S) de URL da função](urls-configuration.md): use URLs de função para criar um endpoint HTTP(S) dedicado que você pode usar para invocar a função.

Todos esses métodos são formas *diretas* de invocar sua função. No Lambda, um caso de uso comum é invocar sua função com base em um evento que ocorre em outro lugar da sua aplicação. Alguns serviços podem invocar uma função do Lambda a cada novo evento. Isso é chamado de [acionador](lambda-services.md). Para serviços baseados em fluxos e filas, o Lambda invoca a função com lotes de registros. Isso é chamado de [mapeamento de origem de eventos](invocation-eventsourcemapping.md).

Quando você invocar uma função, poderá optar por invocá-la de forma síncrona ou assíncrona. Com a [invocação síncrona](invocation-sync.md), você aguarda a função processar o evento e retornar uma resposta. Com a invocação [assíncrona](invocation-async.md), o Lambda coloca o evento na fila para processamento e retorna uma resposta imediatamente. O [parâmetro de solicitação `InvocationType` na API Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#API_Invoke_RequestParameters) determina como o Lambda invocará sua função. Um valor de `RequestResponse` indica invocação síncrona e um valor de `Event` indica invocação assíncrona.

Para invocar sua função pelo IPv6, use os [endpoints de pilha dupla](https://docs.aws.amazon.com/general/latest/gr/rande.html#dual-stack-endpoints) públicos do Lambda. Os endpoints de pilha dupla são compatíveis com IPv4 e IPv6. Os endpoints de pilha dupla do Lambda usam a seguinte sintaxe:

```
protocol://lambda.us-east-1.api.aws
```

Também é possível usar as [URLs de função do Lambda](urls-configuration.md) para invocar funções por IPv6. Os endpoints de URLs de função têm o seguinte formato:

```
https://url-id.lambda-url.us-east-1.on.aws
```

Se a invocação da função resultar em um erro, para invocações síncronas, visualize a mensagem de erro na resposta e repita a invocação manualmente. Para invocações assíncronas, o Lambda processa novas tentativas automaticamente e pode enviar registros de invocação para um [destino](invocation-async-retain-records.md#invocation-async-destinations).

# Invocar uma função do Lambda de modo assíncrono
<a name="invocation-sync"></a>

Quando você invoca uma função de forma síncrona, o Lambda executa a função e aguarda uma resposta. Quando a função é concluída, o Lambda retorna a resposta do código da função com dados adicionais, como a versão da função que foi invocada. Para invocar uma função de forma síncrona com o AWS CLI, use o comando `invoke`.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload '{ "key": "value" }' response.json
```

A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.

A seguinte saída deverá ser mostrada:

```
{
    "ExecutedVersion": "$LATEST",
    "StatusCode": 200
}
```

O diagrama a seguir mostra clientes invocando uma função do Lambda do de forma síncrona. O Lambda envia os eventos diretamente para a função e envia a resposta da função de volta para o invocador.

![\[\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/images/invocation-sync.png)


O `payload` é uma string que contém um evento no formato JSON. O nome do arquivo em que o AWS CLI grava a resposta da função é `response.json`. Se a função retornar um objeto ou um erro, o corpo da resposta será o objeto ou o erro no formato JSON. Se a função for encerrada sem erros, o corpo da resposta será `null`.

**nota**  
O Lambda não espera a conclusão das extensões externas para enviar a resposta. As extensões externas são executadas como processos independentes no ambiente de execução e continuam em execução após a conclusão da invocação da função. Para ter mais informações, consulte [Ampliar funções do Lambda usando extensões do Lambda](lambda-extensions.md).

A saída do comando, que é exibida no terminal, inclui informações de cabeçalhos na resposta do Lambda. Isso inclui a versão que processou o evento (útil quando você usa [aliases](configuration-aliases.md)) e o código de status retornado pelo Lambda. Se o Lambda foi capaz de executar a função, o código de status é 200, mesmo que a função tenha retornado um erro.

**nota**  
Para funções com um longo tempo limite, o cliente pode ser desconectado durante a invocação síncrona enquanto aguarda por uma resposta. Configure seu cliente HTTP, SDK, firewall, proxy ou sistema operacional para permitir conexões longas com tempo limite ou configurações de ativação.

Se o Lambda não for capaz de executar a função, o erro será exibido na saída.

```
aws lambda invoke --function-name my-function \
    --cli-binary-format raw-in-base64-out \
    --payload value response.json
```

A seguinte saída deverá ser mostrada:

```
An error occurred (InvalidRequestContentException) when calling the Invoke operation: Could not parse request body into json: Unrecognized token 'value': was expecting ('true', 'false' or 'null')
 at [Source: (byte[])"value"; line: 1, column: 11]
```

O AWS CLI é uma ferramenta de código aberto que permite interagir com os serviços do AWS usando comandos no shell da linha de comando. Para concluir as etapas desta seção, você deve ter a [versão 2 da AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Você pode usar a [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) para recuperar logs de uma invocação usando a opção de comando `--log-type`. A resposta contém um campo `LogResult` com até 4 KB de logs codificados em base64 obtidos da invocação.

**Example recuperar um ID de log**  
O exemplo a seguir mostra como recuperar um *ID de log* do campo `LogResult` para uma função chamada `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
A seguinte saída deverá ser mostrada:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decodificar os logs**  
No mesmo prompt de comando, use o utilitário `base64` para decodificar os logs. O exemplo a seguir mostra como recuperar logs codificados em base64 de `my-function`.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.  
A seguinte saída deverá ser mostrada:  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
O utilitário `base64` está disponível no Linux, macOS e [Ubuntu no Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10). Os usuários do macOS precisam usar `base64 -D`.

Para obter mais informações sobre a API `Invoke`, incluindo uma lista completa de parâmetros, cabeçalhos e erros, consulte [Invoke](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html).

Quando invocar uma função diretamente, você poderá verificar a resposta quanto a erros e tentar novamente. A AWS CLI e o AWS SDK também realizam automaticamente novas tentativas em erros de serviço, controle de utilização e tempo limite do cliente. Para ter mais informações, consulte [Compreender o comportamento de novas tentativas no Lambda](invocation-retries.md).

# Invocar uma função do Lambda de modo assíncrono
<a name="invocation-async"></a>

Vários Serviços da AWS, como o Amazon Simple Storage Service (Amazon S3) e o Amazon Simple Notiﬁcation Service (Amazon SNS), invocam funções de forma assíncrona para processar eventos. Você também pode invocar uma função do Lambda de modo assíncrono usando a AWS Command Line Interface (AWS CLI) ou um dos AWS SDKs. Ao invocar uma função de forma assíncrona, não aguarde uma resposta do código da função. Você entrega o evento para o Lambda e ele cuida do resto. Você pode configurar como o Lambda processa os erros e pode enviar registros de invocação para um recurso downstream, como o Amazon Simple Queue Service (Amazon SQS) ou o Amazon EventBridge (EventBridge), para encadear componentes da aplicação.

O diagrama a seguir mostra clientes invocando uma função do Lambda de forma assíncrona. O Lambda coloca os eventos em fila antes de enviá-los para a função.

![\[\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/images/features-async.png)


Para invocação de forma assíncrona, o Lambda coloca o evento em uma fila e retorna uma resposta bem-sucedida sem informações adicionais. Um processo separado lê os eventos na fila e os envia para sua função.

 Para invocar uma função do Lambda de forma assíncrona usando a AWS Command Line Interface (AWS CLI) ou um dos AWS SDKs, defina o parâmetro [InvocationType](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html#lambda-Invoke-request-InvocationType) como `Event`. O exemplo a seguir mostra um comando AWS CLI para invocar uma função.

```
aws lambda invoke \
  --function-name my-function  \
  --invocation-type Event \
  --cli-binary-format raw-in-base64-out \
  --payload '{ "key": "value" }' response.json
```

A seguinte saída deverá ser mostrada:

```
{
    "StatusCode": 202
}
```

A opção **cli-binary-format** será necessária se você estiver usando a AWS CLI versão 2. Para que essa seja a configuração padrão, execute `aws configure set cli-binary-format raw-in-base64-out`. Para obter mais informações, consulte [A AWS CLI comporta opções de linha de comando globais](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) no *Guia do usuário da AWS Command Line Interface versão 2*.

O arquivo de saída (`response.json`) não contém informações, mas continuará sendo criado quando esse comando for executado. Se o Lambda não conseguir adicionar o evento a uma fila, a mensagem de erro será exibida na saída do comando.

# Como o Lambda lida com erros e novas tentativas com invocação assíncrona
<a name="invocation-async-error-handling"></a>

O Lambda gerencia a fila de eventos assíncronos da função e realiza novas tentativas em caso de erro. Se a função retornar um erro, o Lambda, por padrão, tentará executá-la mais duas vezes, com um intervalo de um minuto entre a primeira e a segunda tentativa, e um intervalo de dois minutos entre a segunda e a terceira tentativa. Os erros de função incluem erros retornados pelo código e pelo runtime da função, como o tempo ser atingido.

Se a função não tiver simultaneidade suficiente disponível para processar todos os eventos, as solicitações adicionais serão limitadas. Para erros de controle de utilização (429) e de sistema (série 500), o Lambda retorna o evento para a fila e, por padrão, tenta executar a função novamente por até 6 horas. O intervalo de repetição aumenta exponencialmente de 1 segundo após a primeira tentativa para no máximo 5 minutos. Se a fila contém muitas entradas, o Lambda aumenta o intervalo de repetição e reduz a taxa em que lê eventos da fila.

Mesmo que a função não retorne um erro, é possível que ela receba o mesmo evento do Lambda várias vezes, porque a própria fila se tornará consistente. Se a função não conseguir acompanhar os eventos recebidos, é possível que eventos sejam excluídos da fila sem serem enviados para a função. Certifique-se de que seu código de função lide corretamente com eventos duplicados, e de que você tenhas simultaneidade suficiente disponível para lidar com todas as invocações.

Quando a fila é muito longa, novos eventos podem expirar antes de o Lambda ter a chance de enviá-los para sua função. Quando há falha em todas as tentativas de processamento de um evento ou ele expira, o Lambda o descarta. É possível [configurar o tratamento de erros](invocation-async-configuring.md) para uma função a fim de reduzir o número de tentativas que o Lambda executa ou descartar eventos não processados mais rapidamente. Para capturar eventos descartados, [configure uma fila de mensagens não entregues](invocation-async-retain-records.md#invocation-dlq) para a função. Para capturar registros de invocações com falha (como erros de tempo limite ou runtime), [crie um destino para caso de falha](invocation-async-retain-records.md#invocation-async-destinations). 

# Configurar o tratamento de erros para invocação assíncrona do Lambda
<a name="invocation-async-configuring"></a>

Use as configurações a seguir para definir como o Lambda lida com erros e novas tentativas para invocações de funções assíncronas:
+ [MaximumEventAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumEventAgeInSeconds): o tempo máximo usado pelo Lambda, em segundos, para que o Lambda mantenha um evento na fila de eventos assíncronos antes de descartá-lo.
+ [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionEventInvokeConfig.html#lambda-PutFunctionEventInvokeConfig-request-MaximumRetryAttempts): o número máximo de vezes que o Lambda tenta novamente quando a função retorna um erro.

Use o console do Lambda ou a AWS CLI para definir as configurações de tratamento de erros em uma função, uma versão ou um alias.

------
#### [ Console ]

**Como configurar o tratamento de erros**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha uma função.

1. Escolha **Configuration (Configuração)** e, em seguida, **Asynchronous invocation (Invocação assíncrona)**.

1. Em **Asynchronous invocation (Invocação assíncrona)**, escolha **Edit (Editar)**.

1. Configure as definições a seguir.
   + **Maximum age of event** (Idade máxima do evento): a quantidade máxima de tempo que o Lambda retém um evento na fila de eventos assíncronos, até 6 horas.
   + **Retry attempts** (Tentativas de repetição): o número de vezes que o Lambda tenta novamente quando a função retorna um erro, entre 0 e 2.

1. Escolha **Salvar**.

------
#### [ AWS CLI ]

[Para configurar a invocação assíncrona com o AWS CLI, use o comando put-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/put-function-event-invoke-config.html). O exemplo a seguir configura uma função com uma idade máxima de evento de 1 hora e nenhuma repetição.

```
aws lambda put-function-event-invoke-config \ 
  --function-name error \
  --maximum-event-age-in-seconds 3600 \
  --maximum-retry-attempts 0
```

O comando `put-function-event-invoke-config` substitui qualquer configuração existente na função, versão ou alias. Para configurar uma opção sem redefinir outras, use [update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html). O exemplo a seguir configura o Lambda para enviar um registro a uma fila padrão do SQS denominada `destination` quando um evento não puder ser processado.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

A seguinte saída deverá ser mostrada:

```
{
    "LastModified": 1573686021.479,
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "MaximumRetryAttempts": 0,
    "MaximumEventAgeInSeconds": 3600,
    "DestinationConfig": {
        "OnSuccess": {},
        "OnFailure": {}
    }
}
```

Quando um evento de invocação exceder a idade máxima ou falhar em todas as tentativas de repetição, o Lambda o descartará. Para reter uma cópia de eventos descartados, configure um [destino](invocation-async-retain-records.md#invocation-async-destinations) de evento com falha.

# Capturar registros de invocações assíncronas do Lambda
<a name="invocation-async-retain-records"></a>

O Lambda pode enviar os registros de invocações assíncronas a um dos Serviços da AWS a seguir.
+ **Amazon SQS**: uma fila do SQS padrão
+ **Amazon SNS**: um tópico do SNS padrão
+ **Amazon S3**: um bucket do Amazon S3 (somente em caso de falha)
+ **AWS Lambda**: uma função do Lambda
+ **Amazon EventBridge**: um barramento de eventos do EventBridge

O registro de invocação contém detalhes sobre a solicitação e a resposta no formato JSON. É possível configurar destinos separados para eventos que são processados com êxito e eventos em que há falha no processamento de todas as tentativas. Como alternativa, é possível configurar uma fila padrão do Amazon SQS ou um tópico padrão do Amazon SNS como uma fila de mensagens não entregues para os eventos descartados. Para filas de mensagens mortas, o Lambda envia somente o conteúdo do evento, sem detalhes sobre a resposta.

Se o Lambda não conseguir enviar um registro para um destino que você configurou, ele enviará uma métrica `DestinationDeliveryFailures` para o Amazon CloudWatch. Isso poderá acontecer se sua configuração incluir um tipo de destino incompatível, como uma fila do Amazon SQS FIFO ou um tópico do Amazon SNS FIFO. Os erros de entrega também podem ocorrer devido a erros de permissão e limites de tamanho. Para obter mais informações sobre as métricas de invocação do Lambda, consulte [Métricas de invocação](monitoring-metrics-types.md#invocation-metrics).

**nota**  
Para evitar que uma função seja acionada, você pode definir a simultaneidade reservada da função como zero. Quando você define a simultaneidade reservada como zero para uma função invocada de forma assíncrona, o Lambda começa a enviar novos eventos para a [fila de mensagens não entregues](#invocation-dlq) configurada ou para o [destino do evento](#invocation-async-destinations) em caso de falha, sem novas tentativas. Para processar eventos que foram enviados enquanto a simultaneidade reservada estava definida como zero, você precisa consumir os eventos da fila de mensagens não entregues ou do destino do evento em caso de falha.

## Adicionar um destino
<a name="invocation-async-destinations"></a>

Para reter registros de invocações assíncronas, adicione um destino à função. É possível optar por enviar invocações com êxito ou com falha para um destino. Cada função pode ter vários destinos para que você possa configurar destinos separados para eventos com êxito e com falha. Cada registro enviado ao destino é um documento JSON com detalhes sobre a invocação. Da mesma forma que as configurações de tratamento de erros, é possível configurar destinos em uma função, em uma versão de função ou em um alias.

**dica**  
Também é possível reter registros de invocações com falha para os tipos de mapeamento da origem do evento a seguir: [Amazon Kinesis](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console), [Amazon DynamoDB](services-dynamodb-errors.md) e [Apache Kafka (Amazon MSK e Apache Kafka autogerenciado)](kafka-on-failure.md#kafka-onfailure-destination).<a name="destinations-permissions"></a>

A tabela a seguir lista os destinos aceitos para registros de invocação assíncrona. Para que o Lambda envie registros com êxito ao destino escolhido, certifique-se de que o [perfil de execução](lambda-intro-execution-role.md) da função também contenha as permissões relevantes. A tabela também descreve como cada tipo de destino recebe o registro de invocação JSON.


| Tipos de destino | Permissão obrigatória | Formato JSON específico para o destino | 
| --- | --- | --- | 
|  Fila do Amazon SQS  |  [sqs:SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html)  |  O Lambda passa o registro de invocação como `Message` para o destino.  | 
|  Tópico do Amazon SNS  |  [sns:Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)  |  O Lambda passa o registro de invocação como `Message` para o destino.  | 
|  Bucket do Amazon S3 (somente em caso de falha)  |  [s3:PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) [s3:ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/invocation-async-retain-records.html)  | 
|  Função do Lambda  |  [lambda:InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)  |  O Lambda passa o registro de invocação como a carga útil para a função.  | 
|  EventBridge  |  [events:PutEvents](https://docs.aws.amazon.com/eventbridge/latest/APIReference/API_PutEvents.html)  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/invocation-async-retain-records.html)  | 

**nota**  
Para destinos do Amazon S3, se você habilitou a criptografia no bucket usando uma chave do KMS, sua função também precisará da permissão [kms:GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html).

**Importante**  
Ao usar o Amazon SNS como destino, esteja ciente de que o Amazon SNS tem um limite máximo de tamanho de mensagem de 256 KB. Se sua carga útil de invocação assíncrona se aproximar de 1 MB, o registro de invocação (que inclui a carga útil original mais metadados adicionais) pode exceder o limite do Amazon SNS e causar falhas na entrega. Considere usar destinos do Amazon SQS ou do Amazon S3 para cargas úteis maiores.

As etapas a seguir descrevem como configurar um destino para uma função usando o console do Lambda e a AWS CLI.

------
#### [ Console ]

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha uma função.

1. Em **Function overview (Visão geral da função)**, escolha **Add destination (Adicionar destino)**.

1. Em **Source (Origem)**, escolha **Asynchronous invocation (Invocação assíncrona)**.

1. Em **Condition (Condição)**, escolha uma das seguintes opções:
   + **On failure** (Em caso de falha): envie um registro quando o evento falhar em todas as tentativas de processamento ou exceder a idade máxima.
   + **On success** (Em caso de êxito): envie um registro quando a função processa com êxito uma invocação assíncrona.

1. Em **Destination type (Tipo de destino)**, escolha o tipo de recurso que recebe o registro da invocação.

1. Em **Destination (Destino)**, escolha um recurso.

1. Escolha **Salvar**.

------
#### [ AWS CLI ]

Para configurar um destino usando a AWS CLI, execute o comando [update-function-event-invoke-config](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-event-invoke-config.html). O exemplo a seguir configura o Lambda para enviar um registro a uma fila padrão do SQS denominada `destination` quando um evento não puder ser processado.

```
aws lambda update-function-event-invoke-config \
  --function-name my-function \
  --destination-config '{"OnFailure":{"Destination": "arn:aws:sqs:us-east-1:123456789012:destination"}}'
```

------

### Práticas recomendadas de segurança para destinos do Amazon S3
<a name="s3-destination-security"></a>

Excluir um bucket do S3 configurado como destino sem remover o destino da configuração da sua função pode criar um risco de segurança. Se outro usuário souber o nome do seu bucket de destino, ele poderá recriar o bucket na Conta da AWS dele. Registros de invocações com falha serão enviados para o bucket do usuário, potencialmente expondo dados da sua função.

**Atenção**  
Para garantir que os registros de invocação da sua função não possam ser enviados para um bucket do S3 em outra Conta da AWS, adicione uma condição ao perfil de execução da função que limite as permissões `s3:PutObject` aos buckets na sua conta. 

O exemplo a seguir mostra uma política do IAM que limita as permissões `s3:PutObject` da função aos bucket da conta. Essa política também dá ao Lambda a permissão `s3:ListBucket` necessária para usar um bucket do S3 como destino.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Para adicionar uma política de permissões ao perfil de execução da função usando o Console de gerenciamento da AWS ou a AWS CLI, consulte as instruções nos seguintes procedimentos:

------
#### [ Console ]

**Para adicionar uma política de permissões ao perfil de execução de uma função (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Selecione a função do Lambda cujo perfil de execução você queira modificar.

1. Na guia **Configuração**, escolha **Permissões**.

1. Na guia **Perfil de execução**, selecione o **Nome do perfil** da função para abrir a página do console do IAM do perfil.

1. Adicione uma política de permissões ao perfil da seguinte maneira:

   1. No painel **Políticas de permissões**, escolha **Adicionar permissões** e **Criar política em linha**.

   1. No **Editor de políticas**, selecione **JSON**.

   1. Cole a política que você deseja adicionar no editor (substituindo o JSON existente) e escolha **Próximo**.

   1. No campo **Detalhes da política**, insira o **Nome da política**.

   1. Escolha **Criar política**.

------
#### [ AWS CLI ]

**Para adicionar uma política de permissões ao perfil de execução de uma função (CLI)**

1. Crie um documento de política de JSON com as permissões necessárias e salve-o em um diretório local.

1. Use o comando da CLI `put-role-policy` do IAM para adicionar permissões ao perfil de execução da função. Execute o comando a seguir no diretório em que você salvou o documento de política de JSON e substitua o nome do perfil, o nome da política e o documento da política pelos seus próprios valores.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Exemplo de registro de invocação
<a name="destination-example-record"></a>

Quando uma invocação corresponde à condição, o Lambda envia [um documento JSON](#destinations-permissions) com detalhes sobre a invocação para o destino. O exemplo a seguir mostra um registro de invocação para um evento que teve três falhas de tentativa de processamento devido a um erro de função.

**Example**  

```
{
    "version": "1.0",
    "timestamp": "2019-11-14T18:16:05.568Z",
    "requestContext": {
        "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
        "condition": "RetriesExhausted",
        "approximateInvokeCount": 3
    },
    "requestPayload": {
        "ORDER_IDS": [
            "9e07af03-ce31-4ff3-xmpl-36dce652cb4f",
            "637de236-e7b2-464e-xmpl-baf57f86bb53",
            "a81ddca6-2c35-45c7-xmpl-c3a03a31ed15"
        ]
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "responsePayload": {
        "errorMessage": "RequestId: e4b46cbf-b738-xmpl-8880-a18cdf61200e Process exited before completing request"
    }
}
```

O registro de invocação contém detalhes sobre o evento, a resposta e o motivo pelo qual o registro foi enviado.

### Rastreamento de solicitações até destinos
<a name="destinations-tracing"></a>

É possível usar o AWS X-Ray para exibir uma visualização conectada de cada solicitação à medida que ela é adicionada à fila, processada por uma função do Lambda e passada para o serviço de destino. Quando você ativa o rastreamento com X-Ray para uma função ou um serviço que invoca uma função, o Lambda adiciona um cabeçalho X-Ray à solicitação e passa o cabeçalho para o serviço de destino. Os rastreamentos dos serviços de upstream são vinculados automaticamente aos rastreamentos de funções do Lambda e serviços de downstream, o que cria uma visão completa de toda a aplicação. Para obter mais informações sobre rastreamento, consulte [Visualizar as invocações da função do Lambda usando o AWS X-Ray](services-xray.md).

## Adicionar uma fila de mensagens não entregues
<a name="invocation-dlq"></a>

Como alternativa a um [destino em caso de falha](#invocation-async-destinations), é possível configurar a função com uma fila de mensagens mortas para salvar eventos descartados para processamento adicional. Uma fila de mensagens mortas age da mesma forma que um destino em caso de falha na medida em que é usado quando há falha em todas as tentativas de processamento de um evento ou ele expira sem ser processado. Porém, você só pode adicionar ou remover uma fila de mensagens não entregues no nível da função. As versões da função usam as mesmas configurações de fila de mensagens não entregues (\$1LATEST). Destinos em caso de falha também oferecem suporte a destinos adicionais e incluem detalhes sobre a resposta da função no registro de invocação.

Para reprocessar eventos em uma fila de mensagens não entregues, você poderá defini-la como uma [origem de eventos](invocation-eventsourcemapping.md) para a função do Lambda. Também é possível recuperar os eventos manualmente.

É possível escolher uma fila padrão do Amazon SQS ou um tópico padrão do Amazon SNS para a sua fila de mensagens não entregues. As filas FIFO e os tópicos do Amazon SNS FIFO são incompatíveis.
+ [Fila do Amazon SQS](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-create-queue.html): uma fila suspende os eventos falhos até serem recuperados. Escolha uma fila padrão do Amazon SQS caso espere que uma única entidade, como uma função do Lambda ou um alarme do CloudWatch, processe o evento que falhou. Para obter mais informações, consulte [Usar o Lambda com o Amazon SQS](with-sqs.md).
+ [Tópico do Amazon SNS](https://docs.aws.amazon.com/sns/latest/gsg/CreateTopic.html): um tópico retransmite os eventos com falha para um ou mais destinos. Escolha um tópico padrão do Amazon SNS caso espere que várias entidades atuem em um evento com falha. Por exemplo, você pode configurar um tópico para enviar eventos a um endereço de email, uma função do Lambda e/ou um endpoint HTTP. Para obter mais informações, consulte [Invocar funções do Lambda com notificações do Amazon SNS](with-sns.md).

Sua função precisa de permissões adicionais para enviar eventos a uma fila ou um tópico. Adicione uma política com as [permissões necessárias](#destinations-permissions) ao [perfil de execução](lambda-intro-execution-role.md) da sua função. Se a fila ou o tópico de destino for criptografado com uma chave do AWS KMS gerenciada pelo cliente, certifique-se de que tanto a função de execução da sua função quanto a [política baseada em recursos](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) da chave contenham as permissões relevantes.

Depois de criar o destino e atualizar a função de execução de sua função, adicione a fila de mensagens mortas à função. É possível configurar várias funções para enviarem eventos ao mesmo destino.

------
#### [ Console ]

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha uma função.

1. Escolha **Configuration (Configuração)** e, em seguida, **Asynchronous invocation (Invocação assíncrona)**.

1. Em **Asynchronous invocation (Invocação assíncrona)**, escolha **Edit (Editar)**.

1. Defina o **serviço de fila de mensagens não entregues** como **Amazon SQS** ou **Amazon SNS**.

1. Escolha a fila ou o tópico de destino.

1. Escolha **Salvar**.

------
#### [ AWS CLI ]

Para configurar uma fila de mensagens não entregues com a AWS CLI, use o comando [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html).

```
aws lambda update-function-configuration \
  --function-name my-function \
  --dead-letter-config TargetArn=arn:aws:sns:us-east-1:123456789012:my-topic
```

------

O Lambda envia o evento para a fila de mensagens mortas no mesmo estado, mais informações adicionais nos atributos. É possível usar essas informações para identificar o erro retornado pela função, ou correlacionar o evento com logs ou um rastreamento do AWS X-Ray.

**Atributos de mensagens da fila de mensagens mortas**
+ **RequestID** (String): o ID de invocação da solicitação. Os IDs de solicitação aparecem nos logs de função. O X-Ray SDK também pode ser usado para registrar o ID de solicitação em um atributo no rastreamento. Em seguida, os rastreamentos podem ser procurados por ID de solicitação no console do X-Ray.
+ **ErrorCode** (Número): o código de status HTTP.
+ **ErrorMessage** (String): o primeiro 1 KB da mensagem de erro.

Se o Lambda não puder enviar uma mensagem para a fila de mensagens mortas, ele excluirá o evento e emitirá a métrica [DeadLetterErrors](monitoring-metrics-types.md). Isso pode acontecer por causa de falta de permissões, ou se o tamanho total da mensagem exceder o limite da fila ou do tópico de destino. Por exemplo, digamos que uma notificação do Amazon SNS com um tamanho de quase 1 MB acione uma função que resulte em erro. Nesse caso, os dados do evento incluídos pelo Amazon SNS, combinados aos atributos adicionados pelo Lambda, podem fazer com que a mensagem exceda o tamanho máximo permitido na fila de mensagens não entregues.

Se você está usando o Amazon SQS como uma fonte de eventos, configure uma fila de mensagens mortas na própria fila do Amazon SQS e não na função do Lambda. Para obter mais informações, consulte [Usar o Lambda com o Amazon SQS](with-sqs.md).

# Invocação de funções do Lambda duráveis
<a name="durable-invocation"></a>

As funções do Lambda duráveis podem ser invocadas usando os mesmos métodos das funções do Lambda padrão, mas com considerações importantes para execuções de longa duração. Esta seção aborda padrões de invocação, gerenciamento de execuções e práticas recomendadas para funções duráveis.

## Limites de invocação síncrona
<a name="synchronous-invocation-limits"></a>

As invocações síncronas de funções do Lambda duráveis são limitadas a 15 minutos, o mesmo que as funções do Lambda padrão. Se a sua função durável precisar ser executada por mais de 15 minutos, ela deverá ser invocada de forma assíncrona.

**Quando usar a invocação síncrona:** use para funções duráveis que sejam concluídas em 15 minutos e quando você precisar de resultados imediatos, como fluxos de trabalho de aprovação rápida ou tarefas curtas de processamento de dados.

## Invocação assíncrona para fluxos de trabalho de longa duração
<a name="asynchronous-invocation"></a>

Para funções duráveis que possam ser executadas por mais de 15 minutos, use a invocação assíncrona. Isso permite que a função continue em execução enquanto seu cliente recebe uma confirmação imediata.

------
#### [ TypeScript ]

```
import { LambdaClient, InvokeCommand } from "@aws-sdk/client-lambda";

const client = new LambdaClient({});

// Asynchronous invocation
const command = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "Event", // Asynchronous
  Payload: JSON.stringify({ orderId: "12345" })
});

await client.send(command);
```

------
#### [ Python ]

```
import boto3
import json

client = boto3.client('lambda')

# Asynchronous invocation
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='Event',  # Asynchronous
    Payload=json.dumps({'order_id': '12345'})
)
```

------

## APIs de gerenciamento de execução
<a name="execution-management-apis"></a>

O Lambda fornece APIs para gerenciar e monitorar execuções de funções duráveis, incluindo listar execuções, obter status de execução e interromper o andamento de execuções.

------
#### [ TypeScript ]

```
// Get execution status
const statusCommand = new InvokeCommand({
  FunctionName: "my-durable-function",
  InvocationType: "RequestResponse",
  Payload: JSON.stringify({ 
    action: "getStatus", 
    executionId: "exec-123" 
  })
});

const result = await client.send(statusCommand);
```

------
#### [ Python ]

```
# Get execution status
response = client.invoke(
    FunctionName='my-durable-function',
    InvocationType='RequestResponse',
    Payload=json.dumps({
        'action': 'get_status',
        'execution_id': 'exec-123'
    })
)
```

------

# Como o Lambda processa registros de origens de eventos baseadas em fluxos e filas
<a name="invocation-eventsourcemapping"></a>

Um *mapeamento de origem de evento* é um recurso no Lambda que lê itens de serviços baseados em fluxo ou fila e invoca uma função com lotes de registros. Em um mapeamento da origem do evento, recursos chamados *agentes de sondagem de eventos* sondam ativamente novas mensagens e invocam funções. Por padrão, o Lambda escala automaticamente os agentes de sondagem de eventos, mas para determinados tipos de origem de eventos, você pode usar o [modo provisionado](#invocation-eventsourcemapping-provisioned-mode) para controlar o número mínimo e máximo de agentes de sondagem de eventos dedicados ao mapeamento da origem do evento.

Os serviços a seguir usam mapeamentos de origem de eventos para invocar funções do Lambda:
+ [Amazon DocumentDB (compatível com MongoDB) (Amazon DocumentDB)](with-documentdb.md)
+ [Amazon DynamoDB](with-ddb.md)
+ [Amazon Kinesis](with-kinesis.md)
+ [Amazon MQ](with-mq.md)
+ [Amazon Managed Streaming for Apache Kafka (Amazon MSK)](with-msk.md)
+ [Apache Kafka autogerenciado](with-kafka.md)
+ [Amazon Simple Queue Service (Amazon SQS)](with-sqs.md)

**Atenção**  
Os mapeamentos da origem do evento do Lambda processam cada evento ao menos uma vez, podendo haver o processamento duplicado de registros. Para evitar possíveis problemas relacionados a eventos duplicados, é altamente recomendável tornar o código da função idempotente. Para saber mais, consulte [Como tornar minha função do Lambda idempotente](https://repost.aws/knowledge-center/lambda-function-idempotent) no Centro de Conhecimentos da AWS.

## Como os mapeamentos de origem de eventos diferem dos acionadores diretos
<a name="eventsourcemapping-trigger-difference"></a>

Alguns Serviços da AWS podem invocar diretamente as funções do Lambda usando *gatilhos*. Esses serviços enviam eventos para o Lambda, e a função é invocada imediatamente quando o evento especificado ocorre. Os acionadores são adequados para eventos discretos e processamento em tempo real. Quando você [cria um acionador usando o console do Lambda](lambda-services.md#lambda-invocation-trigger), o console interage com o serviço da AWS correspondente para configurar a notificação de eventos nesse serviço. Na verdade, o acionador é armazenado e gerenciado pelo serviço que gera os eventos, não pelo Lambda. Aqui estão alguns exemplos de serviços que usam acionadores para invocar funções do Lambda:
+ **Amazon Simple Storage Service (Amazon S3)**: invoca uma função quando um objeto é criado, excluído ou modificado em um bucket. Para obter mais informações, consulte [Tutorial: Usar um acionador do Amazon S3 para invocar uma função do Lambda](with-s3-example.md).
+ **Amazon Simple Notification Service (Amazon SNS)**: invoca uma função quando uma mensagem é publicada em um tópico do SNS. Para obter mais informações, consulte [Tutorial: usar o AWS Lambda com o Amazon Simple Notification Service](with-sns-example.md).
+ **Amazon API Gateway:** invoca uma função quando uma solicitação de API é feita para um endpoint específico. Para obter mais informações, consulte [Invocar uma função do Lambda usando um endpoint do Amazon API Gateway](services-apigateway.md).

Os mapeamentos de origem de eventos são recursos do Lambda criados e gerenciados dentro do serviço do Lambda. Os mapeamentos de origem de eventos são projetados para processar dados de streaming de alto volume ou mensagens de filas. O processamento de registros de um fluxo ou fila em lotes é mais eficiente do que processar registros individualmente. 

## Comportamento de lotes
<a name="invocation-eventsourcemapping-batching"></a>

Por padrão, um mapeamento de fonte de evento registra em lotes em uma única carga útil que o Lambda envia para sua função. Para ajustar o comportamento de lotes, configure uma janela de lotes ([MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)) e um tamanho de lote ([BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BatchSize)). A janela de lote é o tempo máximo para reunir registros em uma única carga útil. O tamanho de lote é o número máximo de registros em um único lote. O Lambda invoca a função quando um destes três critérios é atendido:
+ **A janela de lotes atinge o valor máximo.** O comportamento padrão da janela de lote varia conforme a fonte de evento específica.
  + **Para fontes de eventos do Kinesis, do DynamoDB e do Amazon SQS:** a janela de lote padrão é 0 segundo. Isso significa que o Lambda invoca a função assim que os registros estão disponíveis. Para definir uma janela de lotes, configure `MaximumBatchingWindowInSeconds`. É possível configurar esse parâmetro para qualquer valor de 0 a 300 segundos em incrementos de 1 segundo. Se você configurar uma janela de lote, a próxima janela começará assim que a invocação de função anterior for concluída.
  + **Para origens do evento do Amazon MSK, Apache Kafka autogerenciado, Amazon MQ e Amazon DocumentDB:** a janela em lotes padrão é de 500 ms. É possível configurar `MaximumBatchingWindowInSeconds` para qualquer valor de 0 a 300 segundos em incrementos de segundos. No modo provisionado para mapeamentos da origem do evento do Kafka, quando você configura uma janela em lote, a próxima janela começará assim que o lote anterior for concluído. No modo não provisionado para mapeamento da origem do evento do Kafka, quando você configura uma janela em lote, a próxima janela começa assim que a invocação da função anterior é concluída. Para minimizar a latência ao usar mapeamentos da origem do evento do Kafka no modo provisionado, defina `MaximumBatchingWindowInSeconds` como 0. Essa configuração garante que o Lambda comece a processar o próximo lote imediatamente após concluir a invocação da função atual. Para obter informações adicionais sobre processamento de baixa latência, consulte [Apache Kafka de baixa latência](with-kafka-low-latency.md).
  + **Para origens do evento do Amazon MQ e Amazon DocumentDB:** a janela em lotes padrão é de 500 ms. É possível configurar `MaximumBatchingWindowInSeconds` para qualquer valor de 0 a 300 segundos em incrementos de segundos. A janela de lotes começa assim que o primeiro registro chega.
**nota**  
Como só é possível alterar `MaximumBatchingWindowInSeconds` em incrementos de segundos, você não pode reverter para a janela de lotes padrão de 500 ms após alterá-la. Para restaurar a janela de lotes padrão, é necessário criar um novo mapeamento de fonte de evento.
+ **O tamanho do lote é atendido.** O tamanho mínimo do lote é 1. O tamanho do lote padrão e máximo dependem da fonte de eventos. Para obter detalhes sobre esses valores, consulte a especificação de [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize) para a operação da API `CreateEventSourceMapping`.
+ **O tamanho da carga útil atinge [6 MB](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html).** Não é possível modificar esse limite.

O diagrama a seguir ilustra essas três condições. Suponha que uma janela de lotes comece em `t = 7` segundos. No primeiro caso, a janela de lotes atinge seu máximo de 40 segundos em `t = 47` segundos após acumular cinco registros. No segundo caso, como o tamanho do lote chega a dez antes que a janela de lotes expire, a janela de lotes é encerrada mais cedo. No terceiro caso, como o tamanho máximo da carga útil é atingido antes que a janela de lotes expire, a janela de lotes é encerrada mais cedo.

![\[\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/images/batching-window.png)


Recomendamos testar com diferentes tamanhos de lote e de registro para que a frequência de sondagem de cada origem de eventos seja ajustada à rapidez com que a função pode concluir sua tarefa. O parâmetro `BatchSize` [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) controla o número máximo de registros que podem ser enviados para sua função a cada invocação. Um tamanho de lote maior geralmente absorve de maneira mais eficiente a sobrecarga da invocação em um conjunto maior de registros aumentando o throughput.

O Lambda não espera a conclusão de nenhuma [extensão](lambda-extensions.md)configurada para enviar o próximo lote para processamento. Em outras palavras, suas extensões podem continuar sendo executadas enquanto o Lambda processa o próximo lote de registros. Isso pode causar problemas de controle de utilização se você violar quaisquer configurações ou limites de [simultaneidade](lambda-concurrency.md) de sua conta. Para detectar se esse é um problema em potencial, monitore suas funções e verifique se você está vendo [métricas de simultaneidade](monitoring-concurrency.md#general-concurrency-metrics) mais altas do que o esperado para o seu mapeamento da origem do evento. Devido ao curto intervalo entre as invocações, o Lambda pode relatar brevemente um uso de simultaneidade maior do que o número de fragmentos. Isso pode ser verdadeiro até mesmo para funções do Lambda sem extensões.

Por padrão, se a função retornar um erro, o mapeamento da origem do evento será reprocessado até que a função seja bem-sucedida ou que os itens no lote expirem. Para garantir o processamento na ordem, o mapeamento da fonte de eventos pausa o processamento do fragmento afetado até o erro ser resolvido. Em origens de fluxo (DynamoDB e Kinesis), é possível configurar o número máximo de vezes que o Lambda tentará novamente quando sua função retornar um erro. Erros de serviço ou controles de utilização nos quais o lote não atinge a função não contam para as tentativas de repetição. Também é possível configurar o mapeamento da origem do evento para enviar um registro de invocação a um [destino](invocation-async-retain-records.md#invocation-async-destinations) quando descartar um lote de eventos.

## Modo provisionado
<a name="invocation-eventsourcemapping-provisioned-mode"></a>

Os mapeamentos da origem do evento do Lambda usam agentes de sondagem de eventos para sondar sua origem de eventos em busca de novas mensagens. Por padrão, o Lambda gerencia o ajuste de escala automático desses agentes de sondagem, baseado no volume de mensagens. Quando o tráfego de mensagens aumenta, o Lambda aumenta automaticamente o número de agentes de sondagem de eventos para lidar com a carga e o reduz quando o tráfego diminui.

No modo provisionado, é possível ajustar o throughput do mapeamento da origem do evento definindo limites mínimos e máximos para os recursos de sondagem dedicados que permanecem prontos para lidar com os padrões de tráfego esperados. Esses recursos fazem ajuste de escala automático 3 vezes mais rápido para lidar com picos repentinos no tráfego de eventos e fornecem maior capacidade 16 vezes maior para processar milhões de eventos. Isso ajuda você a criar workloads orientadas por eventos altamente responsivas com requisitos de performance rigorosos.

No Lambda, um agente de sondagem de eventos é uma unidade computacional com recursos de throughput que variam de acordo com o tipo da origem do evento. Para o Amazon MSK e o Apache Kafka autogerenciado, cada agente de sondagem de eventos pode lidar com até 5 MB/seg de throughput, ou até 5 invocações simultâneas. Por exemplo, se sua origem de eventos produzir uma carga útil média de 1 MB e a duração média de sua função for de 1 segundo, um único agente de sondagem de eventos do Kafka poderá oferecer suporte a um throughput de 5 MB/seg e 5 invocações do Lambda simultâneas (supondo que não haja transformação da carga útil). Para o Amazon SQS, cada agente de sondagem de eventos pode lidar com até 1 MB/s de throughput, ou até 10 invocações simultâneas. O uso do modo provisionado incorre em custos adicionais com base no uso do agente de sondagem de eventos. Para obter detalhes de preço, consulte [Definição de preço do AWS Lambda](https://aws.amazon.com/lambda/pricing/).

O modo provisionado está disponível apenas para origens de eventos do Amazon MSK, Apache Kafka autogerenciado e Amazon SQS. Enquanto as configurações de simultaneidade oferecem controle sobre a escalabilidade da função, o modo provisionado oferece controle sobre o throughput do mapeamento da origem do evento. Para garantir a performance máxima, talvez seja necessário ajustar as duas configurações de maneira independente.

O modo provisionado é ideal para aplicações em tempo real que exijam latência consistente no processamento de eventos, como empresas de serviços financeiros que processem feeds de dados de mercado, plataformas de comércio eletrônico que forneçam recomendações personalizadas em tempo real e empresas de jogos que gerenciem interações com jogadores ao vivo.

Cada agente de sondagem de eventos oferece suporte a diferentes capacidades de throughput:
+ Para o Amazon MSK e o Apache Kafka autogerenciado, até 5 MB/seg de throughput, ou até 5 invocações simultâneas.
+ Para o Amazon SQS: até 1 MB/s de throughput ou até 10 invocações simultâneas, ou até 10 chamadas de API de sondagem do Amazon SQS por segundo.

Para mapeamentos da origem do evento do Amazon SQS, é possível definir o número mínimo de sondagens entre 2 e 200, com um padrão de 2, e o número máximo entre 2 e 2.000, com um padrão de 200. O Lambda escala o número de agentes de sondagem de eventos entre o seu mínimo e o máximo configurados, adicionando rapidamente até 1.000 simultaneidades por minuto para fornecer processamento consistente e de baixa latência aos seus eventos.

Para mapeamentos da origem do evento do Kafka, é possível definir o número mínimo de agentes de sondagem entre 1 e 200, com um padrão de 1, e o número máximo entre 1 e 2.000, com um padrão de 200. O Lambda escala o número de enquetes de eventos entre o mínimo e o máximo configurados com base na lista de pendências de eventos em seu tópico para fornecer processamento de baixa latência de seus eventos.

Observe que, para origens de eventos do Amazon SQS, a configuração máxima de simultaneidade não pode ser usada com o modo provisionado. Ao usar o modo provisionado, você controla a simultaneidade máxima por meio da configuração do número máximo de agentes de sondagem de eventos.

Para obter detalhes sobre como configurar o modo provisionado, consulte as seguintes seções:
+ [Configuração do modo provisionado para mapeamentos de origens de eventos do Amazon MSK](kafka-scaling-modes.md)
+ [Configuração do modo provisionado para mapeamentos de origens de eventos do Apache Kafka autogerenciado](kafka-scaling-modes.md#kafka-provisioned-mode)
+ [Uso do modo provisionado com mapeamentos da origem do evento do Amazon SQS](with-sqs.md#sqs-provisioned-mode)

Para minimizar a latência no modo provisionado, defina `MaximumBatchingWindowInSeconds` como 0. Essa configuração garante que o Lambda comece a processar o próximo lote imediatamente após concluir a invocação da função atual. Para obter informações adicionais sobre processamento de baixa latência, consulte [Apache Kafka de baixa latência](with-kafka-low-latency.md).

Depois de configurar o modo provisionado, você pode observar o uso de pesquisadores de eventos para sua workload monitorando a métrica `ProvisionedPollers`. Para obter mais informações, consulte [Métricas de mapeamento da origem do evento](monitoring-metrics-types.md#event-source-mapping-metrics).

## API do mapeamento da fonte de eventos
<a name="event-source-mapping-api"></a>

Para gerenciar uma origem de eventos com a [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html) ou um [SDK da AWS](https://aws.amazon.com/getting-started/tools-sdks/), use as operações de API a seguir:
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

# Uso de tags em mapeamentos da origem do evento
<a name="tags-esm"></a>

É possível marcar mapeamentos da origem do evento para organizar e gerenciar os recursos. Tags são pares de chave-valor de formato livre associados aos recursos compatíveis com todos os Serviços da AWS. Para obter mais informações sobre casos de uso de tags, consulte [Common tagging strategies](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#tag-strategies) no *Guia do editor de tags e recursos de marcação da AWS*. 

Os mapeamentos da origem do evento estão associados a funções, que podem ter suas próprias tags. Os mapeamentos da origem do evento não herdam automaticamente as tags das funções. É possível usar a API do AWS Lambda para visualizar e atualizar tags. Também é possível visualizar e atualizar tags enquanto gerencia um mapeamento da origem do evento específico no console do Lambda, incluindo aqueles que usem o modo provisionado do Amazon SQS.

## Permissões necessárias para trabalhar com tags
<a name="esm-tags-required-permissions"></a>

Para permitir que uma identidade do AWS Identity and Access Management (IAM) (usuário, grupo ou perfil) leia ou defina tags em um recurso, conceda a ela as permissões correspondentes:
+ **lambda:ListTags**: quando um recurso tiver tags, conceda essa permissão a qualquer usuário que precise chamar `ListTags` nele. Para funções marcadas, essa permissão também será necessária para `GetFunction`.
+ **lambda:TagResource**: conceda essa permissão a qualquer pessoa que precise chamar `TagResource` ou executar uma tag na criação.

Opcionalmente, considere conceder também a permissão **lambda:UntagResource** para permitir chamadas `UntagResource` ao recurso.

Para obter mais informações, consulte [Políticas do IAM baseadas em identidade para o Lambda](access-control-identity-based.md).

## Uso de tags usando o console do Lambda
<a name="tags-esm-console"></a>

É possível usar o console do Lambda para criar mapeamentos da origem do evento que tenham tags, adicionar tags a mapeamentos da origem do evento existentes e filtrar mapeamentos da origem do evento por tag, incluindo aqueles configurados no modo provisionado do Amazon SQS

Quando você adiciona um gatilho para streaming compatível e serviços baseados em fila usando o console do Lambda, o Lambda cria automaticamente um mapeamento da origem do evento. Para obter mais informações sobre essas origens de evento, consulte [Como o Lambda processa registros de origens de eventos baseadas em fluxos e filas](invocation-eventsourcemapping.md). Para criar um mapeamento da origem do evento no console, você precisará dos seguintes pré-requisitos:
+ Uma função do .
+ Uma origem do evento de um serviço afetado.

É possível adicionar as tags como parte da mesma interface de usuário usada para criar ou atualizar gatilhos.

**Para adicionar uma tag ao criar um mapeamento da origem do evento**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da sua função.

1. Em **Visão geral da função**, escolha **Adicionar gatilho**.

1. Em **Configuração do gatilho**, na lista suspensa, escolha o nome do serviço de onde vem a origem do evento.

1. Forneça a configuração principal para a origem do evento. Para obter mais informações sobre como configurar a origem do evento, consulte a seção do serviço relacionado em [Invocando o Lambda com eventos de outros serviços da AWS](lambda-services.md).

1. Em **Configuração do mapeamento da origem do evento**, escolha **Configurações adicionais**.

1. Em **Tags**, escolha **Adicionar nova tag**.

1. No campo **Chave**, insira sua chave de tag. Para obter informações sobre restrições de marcação, consulte [Tag naming limits and requirements](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices) no *Guia do editor de tags e recursos de marcação da AWS*.

1. Escolha **Adicionar**.

**Para adicionar tags a um mapeamento da origem do evento existente**

1. Abra [Mapeamentos da origem do evento](https://console.aws.amazon.com/lambda/home#/event-source-mappings) no console do Lambda.

1. Na lista de recursos, escolha o **UUID** para o mapeamento da origem do evento correspondente à **função** e ao **ARN da origem do evento**.

1. Na lista de guias abaixo do **painel Configuração geral**, escolha **Tags**.

1. Selecione **Gerenciar tags**.

1. Selecione **Adicionar nova tag**.

1. No campo **Chave**, insira sua chave de tag. Para obter informações sobre restrições de marcação, consulte [Tag naming limits and requirements](https://docs.aws.amazon.com//tag-editor/latest/userguide/best-practices-and-strats.html#id_tags_naming_best_practices) no *Guia do editor de tags e recursos de marcação da AWS*.

1. Escolha **Salvar**.

**Para filtrar mapeamentos da origem do evento por tag**

1. Abra [Mapeamentos da origem do evento](https://console.aws.amazon.com/lambda/home#/event-source-mappings) no console do Lambda.

1. Escolha a caixa Pesquisar.

1. Na lista suspensa, selecione a chave de tag abaixo do subtítulo **Tags**.

1. Selecione **Usar: “tag-name”** para ver todos os mapeamentos da origem do evento marcados com essa chave, ou escolha um **operador** para filtrar ainda mais por valor.

1. Selecione o valor da tag para filtrar por uma combinação de chave e valor da tag.

A barra de pesquisa também é compatível com a pesquisa de chaves de tag. Insira o nome de uma chave para encontrá-la na lista.

## Uso de tags com a AWS CLI
<a name="tags-esm-cli"></a>

É possível adicionar e remover tags em recursos existentes do Lambda, incluindo mapeamentos da origem do evento, com a API do Lambda. Também é possível adicionar tags ao criar um mapeamento da origem do evento, o que permite manter um recurso marcado durante todo o ciclo de vida.

### Atualização de tags usando as APIs de tag do Lambda
<a name="tags-esm-api-config"></a>

É possível adicionar e remover tags dos recursos compatíveis do Lambda por meio das operações da API [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html) e [UntagResource](https://docs.aws.amazon.com/lambda/latest/api/API_UntagResource.html).

Também é possível chamar essas operações usando a AWS CLI. Para adicionar tags a um recurso existente, use o comando `tag-resource`. Este exemplo adiciona duas tags, uma com a chave *Department* e outra com a chave *CostCenter*.

```
aws lambda tag-resource \
--resource arn:aws:lambda:us-east-2:123456789012:resource-type:my-resource \
--tags Department=Marketing,CostCenter=1234ABCD
```

Para remover tags, use o comando `untag-resource`. Este exemplo remove a tag com a chave *Department*.

```
aws lambda untag-resource --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier \
--tag-keys Department
```

### Adição de tags ao criar um mapeamento da origem do evento
<a name="tags-esm-on-create"></a>

Para criar um novo mapeamento da origem do evento do Lambda com tags, use a operação da API [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html). Especifique o parâmetro `Tags`. É possível chamar essa operação com o comando `create-event-source-mapping` da AWS CLI e a opção `--tags`. Para obter mais informações sobre o comando da CLI, consulte [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) na *referência de comandos da AWS CLI*.

Antes de usar o parâmetro `Tags` com `CreateEventSourceMapping`, certifique-se de que seu perfil tenha permissão para marcar recursos junto com as permissões usuais necessárias para essa operação. Para obter mais informações sobre permissões para marcação, consulte [Permissões necessárias para trabalhar com tags](#esm-tags-required-permissions).

### Visualização de tags usando as APIs de tag do Lambda
<a name="tags-esm-api-view"></a>

Para visualizar as tags que são aplicadas à um recurso específico do Lambda, use a operação da API `ListTags`. Para obter mais informações, consulte [ListTags](https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html).

É possível chamar essa operação com o comando `list-tags` da AWS CLI fornecendo um ARN (nome do recurso da Amazon).

```
aws lambda list-tags --resource arn:aws:lambda:us-east-1:123456789012:resource-type:resource-identifier
```

### Filtragem de recursos por tag
<a name="tags-esm-filtering"></a>

É possível usar a operação de API [GetResources](https://docs.aws.amazon.com/resourcegroupstagging/latest/APIReference/API_GetResources.html) do AWS Resource Groups Tagging API para filtrar seus recursos por etiquetas. A operação `GetResources` aceita até 10 filtros, cada um contendo uma chave de etiquetas e até 10 valores de etiquetas. Você fornece a `GetResources` um `ResourceType` para filtrar por tipos de recursos específicos.

É possível chamar essa operação usando o comando `get-resources` da AWS CLI. Para ver exemplos de uso de `get-resources`, consulte [get-resources](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/resourcegroupstaggingapi/get-resources.html#examples) na *referência de comandos da AWS CLI*. 

# Controlar quais eventos o Lambda envia para a função
<a name="invocation-eventfiltering"></a>

É possível usar filtragem de eventos para controlar quais registros de um stream ou fila que o Lambda enviará para a função. Por exemplo, é possível adicionar um filtro para que sua função processe somente mensagens do Amazon SQS contendo determinados parâmetros de dados. A filtragem de eventos funciona com certos mapeamentos de origens de eventos. É possível adicionar filtros aos mapeamentos da origem de eventos para os seguintes Serviços da AWS:
+ Amazon DynamoDB
+ Amazon Kinesis Data Streams
+ Amazon MQ
+ Amazon Managed Streaming for Apache Kafka (Amazon MSK)
+ Apache Kafka autogerenciado
+ Amazon Simple Queue Service (Amazon SQS)

Para obter informações específicas sobre filtragem com origens de eventos específicas, consulte [Uso de filtros com diferentes Serviços da AWS](#filtering-by-service). O Lambda não oferece suporte à filtragem de eventos para o Amazon DocumentDB.

Por padrão, é possível definir até cinco filtros diferentes para um único mapeamento da origem do evento. Seus filtros estão logicamente relacionados por OR. Se um registro da sua origem de eventos satisfizer um ou mais dos seus filtros, o Lambda incluirá o registro no próximo evento enviado à sua função. Se nenhum dos seus filtros for satisfeito, o Lambda descartará o registro.

**nota**  
Se você precisar definir mais de cinco filtros para uma origem de eventos, poderá solicitar um aumento de cota para até 10 filtros por origem de eventos. Se tentar adicionar mais filtros do que a sua cota atual permite, o Lambda retornará um erro quando você tentar criar a origem de eventos.

**Topics**
+ [

## Entender os conceitos básicos da filtragem de eventos
](#filtering-basics)
+ [

## Tratamento de registros que não atendem aos critérios de filtragem
](#filtering-criteria-not-met)
+ [

## Sintaxe das regras de filtros
](#filtering-syntax)
+ [

## Anexar critérios de filtro a um mapeamento de fonte de eventos (console)
](#filtering-console)
+ [

## Anexar critérios de filtros a um mapeamento de fonte de eventos (AWS CLI)
](#filtering-cli)
+ [

## Anexar critérios de filtros a um mapeamento de fonte de eventos (AWS SAM)
](#filtering-sam)
+ [

## Criptografia de critérios de filtro
](#filter-criteria-encryption)
+ [

## Uso de filtros com diferentes Serviços da AWS
](#filtering-by-service)

## Entender os conceitos básicos da filtragem de eventos
<a name="filtering-basics"></a>

Um objeto de critérios de filtro (`FilterCriteria`) é uma estrutura que consiste em uma lista de filtros (`Filters`). Cada filtro é uma estrutura que define um padrão de filtragem de eventos (`Pattern`). Um padrão é uma representação em string de uma regra de filtro JSON. A estrutura de um objeto `FilterCriteria` é descrita a seguir.

```
{
   "Filters": [
        {
            "Pattern": "{ \"Metadata1\": [ rule1 ], \"data\": { \"Data1\": [ rule2 ] }}"
        }
    ]
}
```

Para maior clareza, aqui está o valor de `Pattern` do filtro expandido em JSON simples.

```
{
    "Metadata1": [ rule1 ],
    "data": {
        "Data1": [ rule2 ]
    }
}
```

Seu padrão de filtro pode incluir propriedades de metadados, propriedades de dados ou ambas. Os parâmetros de metadados disponíveis e o formato dos parâmetros de dados variam de acordo com o AWS service (Serviço da AWS) que está atuando como origem do evento. Por exemplo, suponha que seu mapeamento da origem do evento receba o registro a seguir de uma fila do Amazon SQS:

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\\n \"City\": \"Seattle\",\\n \"State\": \"WA\",\\n \"Temperature\": \"46\"\\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
    },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
    "awsRegion": "us-east-2"
}
```
+ As **propriedades dos metadados** são os campos que contêm informações sobre o evento que criou o registro. No exemplo de registro do Amazon SQS, as propriedades dos metadados incluem campos como `messageID`, `eventSourceArn`, e `awsRegion`.
+ As **propriedades dos dados** são os campos do registro que contêm os dados do seu stream ou fila. No exemplo de evento do Amazon SQS, a chave para o campo de dados é `body`, e as propriedades dos dados são os campos `City`, `State` e `Temperature`.

Diferentes tipos de origens de eventos usam diferentes valores-chave para seus campos de dados. Para filtrar as propriedades de dados, certifique-se de usar a chave correta no padrão do seu filtro. Para obter uma lista de chaves de filtragem de dados e ver exemplos de padrões de filtro para cada um dos AWS service (Serviço da AWS) com suporte, consulte[Uso de filtros com diferentes Serviços da AWS](#filtering-by-service).

A filtragem de eventos pode lidar com a filtragem JSON de vários níveis. Por exemplo, considere o fragmento a seguir de um registro de um stream do DynamoDB:

```
"dynamodb": {
    "Keys": {
        "ID": {
            "S": "ABCD"
        }
        "Number": {
            "N": "1234"
    },
    ...
}
```

Suponha que você queira processar somente os registros em que o valor da chave de classificação `Number` seja 4567. Nesse caso, seu objeto `FilterCriteria` deve ser semelhante a:

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\": { \"Keys\": { \"Number\": { \"N\": [ "4567" ] } } } }"
        }
    ]
}
```

Para maior clareza, aqui está o valor de `Pattern` do filtro expandido em JSON simples. 

```
{
    "dynamodb": {
        "Keys": {
            "Number": {
                "N": [ "4567" ]
                }
            }
        }
}
```

## Tratamento de registros que não atendem aos critérios de filtragem
<a name="filtering-criteria-not-met"></a>

Como o Lambda trata os registros que não atendem aos seus critérios de filtro depende da origem de eventos.
+ Para o **Amazon SQS**, se a mensagem não atender aos critérios de filtro, o Lambda removerá automaticamente a mensagem da fila. Não é necessário excluir manualmente essas mensagens no Amazon SQS.
+ Para o **Kinesis** e o **DynamoDB**, depois que seus critérios de filtro avaliam um registro, o iterador de fluxos avança além desse registro. Se o registro não atender aos critérios de filtro, não será necessário excluir manualmente o registro da fonte de eventos. Após o período de retenção, o Kinesis e o DynamoDB excluem esses registros antigos automaticamente. Se quiser que os registros sejam excluídos antes, consulte [Alterar o período de retenção de dados](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html).
+ Para mensagens do **Amazon MSK**, do **Apache Kafka autogerenciadas** e do **Amazon MQ**, o Lambda descarta as mensagens que não correspondem a todos os campos incluídos no filtro. Para o Amazon MSK e o Apache Kafka autogerenciado, o Lambda confirma os desvios para as mensagens que correspondem ou não após invocar a função com êxito. Para o Amazon MQ, o Lambda confirma as mensagens que correspondem após invocar a função com êxito e confirma as mensagens que não correspondem ao filtrá-las.

## Sintaxe das regras de filtros
<a name="filtering-syntax"></a>

Para as regras de filtros, o Lambda é compatível com as regras do Amazon EventBridge e usa a mesma sintaxe que o EventBridge. Para obter mais informações, consulte [Amazon EventBridge event patterns](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html) no *Amazon EventBridge User Guide*.

A seguir, há um resumo de todas as operações de comparação disponíveis para a filtragem de eventos do Lambda.


| Operador de comparação | Exemplo | Sintaxe da regra | 
| --- | --- | --- | 
|  Nulo  |  UserID é null  |  "UserID": [ null ]  | 
|  Vazio  |  LastName está vazio  |  "LastName": [""]  | 
|  Igual  |  Name é “Alice”  |  "Name": [ "Alice" ]  | 
|  É igual a (ignorar maiúsculas e minúsculas)  |  Name é “Alice”  |  "Name": [ \$1 "equals-ignore-case": "alice" \$1 ]  | 
|  E  |  Location é “Nova York” e o Day é “Monday” (Segunda-feira)  |  "Location": [ "New York" ], "Day": ["Monday"]  | 
|  Ou  |  PaymentType é “Credit” (Crédito) ou “Debit” (Débito)  |  "PaymentType": [ "Credit", "Debit"]  | 
|  Ou (vários campos)  |  Location é “New York” ou Day é “Monday”.  |  "\$1or": [ \$1 "Location": [ "New York" ] \$1, \$1 "Day": [ "Monday" ] \$1 ]   | 
|  Not  |  Weather é qualquer valor, exceto “Raining” (Chovendo)  |  "Weather": [ \$1 "anything-but": [ "Raining" ] \$1 ]  | 
|  Numeric (equals) (Numérico, igual)  |  Price é 100  |  "Price": [ \$1 "numeric": [ "=", 100 ] \$1 ]  | 
|  Numeric (range) (Numérico, intervalo)  |  Price é superior a 10 e menor que ou igual a 20  |  "Price": [ \$1 "numeric": [ ">", 10, "<=", 20 ] \$1 ]  | 
|  Existe  |  ProductName existe  |  "ProductName": [ \$1 "exists": true \$1 ]  | 
|  Não existe  |  ProductName não existe  |  "ProductName": [ \$1 "exists": false \$1 ]  | 
|  Começa com  |  Region é nos EUA  |  "Region": [ \$1"prefix": "us-" \$1 ]  | 
|  Termina com  |  FileName termina com uma extensão .png.  |  "FileName": [ \$1 "suffix": ".png" \$1 ]   | 

**nota**  
Como o EventBridge, para strings, o Lambda usa correspondência exata caractere por caractere sem case-folding nem qualquer normalização de strings. Para números, o Lambda também usa representação de string. Por exemplo, 300, 300.0 e 3.0e2 não são considerados iguais.

Observe que o operador Exists só funciona em nós terminais em seu JSON de origem de eventos. Não corresponde aos nós intermediários. Por exemplo, com o seguinte JSON, o padrão de filtro `{ "person": { "address": [ { "exists": true } ] } }"` não encontraria uma correspondência porque `"address"` é um nó intermediário.

```
{
  "person": {
    "name": "John Doe",
    "age": 30,
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "country": "USA"
    }
  }
}
```

## Anexar critérios de filtro a um mapeamento de fonte de eventos (console)
<a name="filtering-console"></a>

Siga estas etapas para criar um novo mapeamento de fonte de eventos com critérios de filtro usando o console do Lambda.

**Para criar um novo mapeamento de fonte de eventos com critérios de filtro (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome de uma função para a qual criar um mapeamento de fonte de evento.

1. Em **Visão geral da função**, escolha **Adicionar gatilho**.

1. Em **Trigger configuration** (Configuração do acionador), escolha um tipo de acionador com suporte a filtragem de eventos. Para obter uma lista dos serviços com suporte, consulte a lista no início desta página.

1. Expanda **Additional settings** (Configurações adicionais).

1. Em **Filter criteria**, (Critérios de filtros), escolha **Add**, (Adicionar) e insira os filtros. Por exemplo, é possível inserir o seguinte.

   ```
   { "Metadata" : [ 1, 2 ] }
   ```

   Isso instrui o Lambda a processar somente os registros em que o campo `Metadata` é igual a 1 ou 2. É possível continuar selecionando **Adicionar** para incluir mais filtros até o máximo permitido.

1. Ao concluir a inclusão de filtros, escolha **Salvar**.

Ao inserir critérios de filtros usando o console, insira somente o padrão do filtro, pois não é necessário fornecer a chave `Pattern` ou as aspas escape. Na etapa 6 das instruções anteriores, `{ "Metadata" : [ 1, 2 ] }` corresponde aos `FilterCriteria` a seguir.

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

Após criar o mapeamento da fonte de eventos no console, você pode ver os `FilterCriteria` formatados nos detalhes do acionador. Para obter mais exemplos de criação de filtros de eventos usando o console, consulte [Uso de filtros com diferentes Serviços da AWS](#filtering-by-service).

## Anexar critérios de filtros a um mapeamento de fonte de eventos (AWS CLI)
<a name="filtering-cli"></a>

Suponha que você queira que um mapeamento de fonte de eventos tenha os seguintes `FilterCriteria`:

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

Para criar um novo mapeamento da origem do evento com esses critérios de filtro usando a AWS Command Line Interface (AWS CLI), execute o comando a seguir.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

Esse comando [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html) cria um novo mapeamento da origem do evento do Amazon SQS para a função `my-function` com os `FilterCriteria` especificados.

Para adicionar esses critérios de filtro a um mapeamento da origem do evento existente, execute o comando a seguir.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"Metadata\" : [ 1, 2 ]}"}]}'
```

Para atualizar um mapeamento de fonte de eventos, você precisa do UUID. É possível obter o UUID com uma chamada [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html). O Lambda também retorna o UUID na resposta da CLI a [create-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-event-source-mapping.html).

Para remover os critérios de filtro de uma origem de eventos, você pode executar o comando [update-event-source-mapping](https://docs.aws.amazon.com/cli/latest/reference/lambda/update-event-source-mapping.html) a seguir com um objeto `FilterCriteria` vazio.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria "{}"
```

Para obter mais exemplos de criação de filtros de eventos usando a AWS CLI, consulte [Uso de filtros com diferentes Serviços da AWS](#filtering-by-service).

## Anexar critérios de filtros a um mapeamento de fonte de eventos (AWS SAM)
<a name="filtering-sam"></a>

 Suponha que você deseje configurar uma origem de eventos no AWS SAM para usar os seguintes critérios de filtro: 

```
{
   "Filters": [
      {
          "Pattern": "{ \"Metadata\" : [ 1, 2 ] }"
      }
   ]
}
```

 Para adicionar esses critérios de filtro ao mapeamento da origem do evento, insira o trecho a seguir no modelo YAML da origem do evento.

```
FilterCriteria: 
  Filters: 
    - Pattern: '{"Metadata": [1, 2]}'
```

 Para obter mais informações sobre como criar e configurar um modelo do AWS SAM para um mapeamento da origem do evento, consulte a seção [EventSource](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-eventsource.html) do Guia do desenvolvedor do AWS SAM. Para obter mais exemplos de criação de filtros de eventos usando modelos do AWS SAM, consulte [Uso de filtros com diferentes Serviços da AWS](#filtering-by-service). 

## Criptografia de critérios de filtro
<a name="filter-criteria-encryption"></a>

Por padrão, o Lambda não criptografa seu objeto de critérios de filtro. Para casos de uso em que você pode incluir informações confidenciais em seu objeto de critérios de filtro, você pode usar sua própria [chave do KMS](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys) para criptografá-las.

Após criptografar seu objeto de critérios de filtro, você poderá visualizar sua versão em texto simples usando uma chamada de API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html). Você deve ter permissões `kms:Decrypt` para poder visualizar com êxito os critérios do filtro em texto simples.

**nota**  
Se seu objeto de critérios de filtro estiver criptografado, o Lambda editará o valor do campo `FilterCriteria` na resposta das chamadas a [ListEventSourceMapings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html). Em vez disso, esse campo é exibido como `null`. Para ver o valor real de `FilterCriteria`, use a API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html).  
Para visualizar o valor descriptografado de `FilterCriteria` no console, certifique-se de que seu perfil do IAM contenha permissões para [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html).

É possível especificar sua própria chave do KMS via console, API/CLI ou CloudFormation.

**Para criptografar critérios de filtro com uma chave do KMS pertencente ao cliente (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha **Add trigger**. Se você já tiver um acionador, escolha a guia **Configuração** e, em seguida, escolha **Acionadores**. Selecione o acionador existente e escolha **Editar**.

1. Marque a caixa de seleção ao lado de **Criptografar com chave do KMS gerenciada pelo cliente**.

1. Em **Escolher uma chave de criptografia do KMS gerenciada pelo cliente**, selecione uma chave habilitada existente ou crie uma nova chave. Dependendo da operação, você precisará de algumas ou de todas as seguintes permissões: `kms:DescribeKey`, `kms:GenerateDataKey` e `kms:Decrypt`. Use a política de chaves do KMS para conceder essas permissões.

Se você usa sua própria chave do KMS, as seguintes operações de API deverão ser permitidas na [política de chaves](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html):
+ `kms:Decrypt`: deve ser concedida à entidade principal do serviço Lambda regional (`lambda.AWS_region.amazonaws.com`). Isso permite que o Lambda descriptografe dados com essa chave do KMS.
  + Para evitar o [problema de confused deputy entre vários serviços](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html), a política de chave usa a chave de condição global [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn). O valor correto da chave `aws:SourceArn` é o ARN do seu recurso de mapeamento da origem do evento, portanto, você poderá adicioná-lo à sua política somente depois de conhecer seu ARN. O Lambda também encaminha as chaves `aws:lambda:FunctionArn` e `aws:lambda:EventSourceArn` e seus respectivos valores no [contexto de criptografia](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context) ao fazer uma solicitação de descriptografia para o KMS. Esses valores devem corresponder às condições especificadas na política de chaves para que a solicitação de descriptografia seja bem-sucedida. Você não precisa incluir EventSourceArn para origens de eventos do Kafka autogerenciadas, pois elas não têm um EventSourceArn.
+ `kms:Decrypt`: também deve ser concedida à entidade principal que pretende usar a chave para visualizar os critérios de filtro de texto simples nas chamadas de API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) ou [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html).
+ `kms:DescribeKey`: fornece os detalhes da chave gerenciada pelo cliente para permitir que a entidade principal use a chave.
+ `kms:GenerateDataKey`: fornece permissões para o Lambda gerar uma chave de dados para criptografar os critérios de filtro em nome da entidade principal especificada ([criptografia de envelope](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#enveloping)).

É possível usar o AWS CloudTrail para rastrear solicitações do AWS KMS feitas pelo Lambda em seu nome. Para exemplos de eventos do CloudTrail, consulte [Monitorar suas chaves de criptografia para o Lambda](security-encryption-at-rest.md#encryption-key-monitoring).

Também recomendamos usar a chave de condição [https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service](https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-via-service) para limitar o uso da chave do KMS somente às solicitações do Lambda. O valor dessa chave é a entidade principal do serviço Lambda (`lambda.AWS_region.amazonaws.com`) regional. Veja a seguir um exemplo de política de chave que concede todas as permissões relevantes:

**Example Política de chave do AWS KMS**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Id": "example-key-policy-1",
    "Statement": [
        {
            "Sid": "Allow Lambda to decrypt using the key",
            "Effect": "Allow",
            "Principal": {
                "Service": "lambda.us-east-1.amazonaws.com"
            },
            "Action": [
                "kms:Decrypt"
            ],
            "Resource": "*",
            "Condition": {
                "ArnEquals" : {
                    "aws:SourceArn": [
                        "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:<esm_uuid>"
                    ]
                },
                "StringEquals": {
                    "kms:EncryptionContext:aws:lambda:FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:test-function",
                    "kms:EncryptionContext:aws:lambda:EventSourceArn": "arn:aws:sqs:us-east-1:123456789012:test-queue"
                }
            }
        },
        {
            "Sid": "Allow actions by an AWS account on the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key to specific roles",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789012:role/ExampleRole"
            },
            "Action": [
                "kms:Decrypt",
                "kms:DescribeKey",
                "kms:GenerateDataKey"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals" : {
                    "kms:ViaService": "lambda.us-east-1.amazonaws.com"
                }
            }
        }
    ]
}
```

Para usar sua própria chave do KMS para criptografar critérios de filtro, você também pode usar o comando da AWS CLI [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) a seguir. Especifique o ARN da chave do KMS com o sinalizador `--kms-key-arn`.

```
aws lambda create-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

Se você tiver um mapeamento da origem do evento existente, use o comando da AWS CLI [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) em vez disso. Especifique o ARN da chave do KMS com o sinalizador `--kms-key-arn`.

```
aws lambda update-event-source-mapping --function-name my-function \
    --maximum-batching-window-in-seconds 60 \
    --event-source-arn arn:aws:sqs:us-east-1:123456789012:my-queue \
    --filter-criteria "{\"filters\": [{\"pattern\": \"{\"a\": [\"1\", \"2\"]}\" }]}" \
    --kms-key-arn arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599
```

Essa operação substitui qualquer chave do KMS especificada anteriormente. Se você especificar o sinalizador `--kms-key-arn` junto com um argumento vazio, o Lambda deixará de usar sua chave do KMS para criptografar critérios de filtro. Em vez disso, o Lambda retorna ao padrão de usar uma chave pertencente à Amazon.

Para especificar sua própria chave do KMS em um modelo do CloudFormation, use a propriedade `KMSKeyArn` do tipo de recurso `AWS::Lambda::EventSourceMapping`. Por exemplo, você pode inserir o trecho a seguir no modelo YAML da origem do evento.

```
MyEventSourceMapping:
  Type: AWS::Lambda::EventSourceMapping
  Properties:
    ...
    FilterCriteria:
      Filters:
        - Pattern: '{"a": [1, 2]}'
    KMSKeyArn: "arn:aws:kms:us-east-1:123456789012:key/055efbb4-xmpl-4336-ba9c-538c7d31f599"
    ...
```

Para poder visualizar seus critérios de filtro criptografados em texto simples em uma chamada de API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) ou [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html), é necessário ter permissões `kms:Decrypt`.

A partir de 6 de agosto de 2024, o campo `FilterCriteria` não aparecerá mais nos logs do AWS CloudTrail das chamadas de API[ CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html), [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) e [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html) se sua função não usar a filtragem de eventos. Se sua função usa filtragem de eventos, o campo `FilterCriteria` aparece como vazio (`{}`). Você ainda poderá visualizar seus critérios de filtro em texto simples na resposta das chamadas de API [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html) se tiver permissões `kms:Decrypt` para a chave do KMS correta.

### Exemplo de entrada de log do CloudTrail para chamadas Create/Update/DeleteEventSourceMapping
<a name="filter-criteria-encryption-cloudtrail"></a>

No exemplo de entrada de log do AWS CloudTrail a seguir para uma chamada CreateEventSourceMapping, `FilterCriteria` aparece como vazio (`{}`) porque a função usa filtragem de eventos. Esse será o caso mesmo que o objeto `FilterCriteria` contenha critérios de filtro válidos que sua função está usando ativamente. Se a função não usar a filtragem de eventos, o CloudTrail não exibirá o campo `FilterCriteria` nas entradas do log.

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROA123456789EXAMPLE:userid1",
        "arn": "arn:aws:sts::123456789012:assumed-role/Example/example-role",
        "accountId": "123456789012",
        "accessKeyId": "ASIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROA987654321EXAMPLE",
                "arn": "arn:aws:iam::123456789012:role/User1",
                "accountId": "123456789012",
                "userName": "User1"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-05-09T20:35:01Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-05-09T21:05:41Z",
    "eventSource": "lambda.amazonaws.com",
    "eventName": "CreateEventSourceMapping20150331",
    "awsRegion": "us-east-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": {
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "functionName": "example-function",
        "enabled": true,
        "batchSize": 10,
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "scalingConfig": {},
        "maximumBatchingWindowInSeconds": 0,
        "sourceAccessConfigurations": []
    },
    "responseElements": {
        "uUID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
        "batchSize": 10,
        "maximumBatchingWindowInSeconds": 0,
        "eventSourceArn": "arn:aws:sqs:us-east-2:123456789012:example-queue",
        "filterCriteria": {},
        "kMSKeyArn": "arn:aws:kms:us-east-2:123456789012:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:example-function",
        "lastModified": "May 9, 2024, 9:05:41 PM",
        "state": "Creating",
        "stateTransitionReason": "USER_INITIATED",
        "functionResponseTypes": [],
        "eventSourceMappingArn": "arn:aws:lambda:us-east-2:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLEbbbbb"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "readOnly": false,
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "123456789012",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

## Uso de filtros com diferentes Serviços da AWS
<a name="filtering-by-service"></a>

Diferentes tipos de origens de eventos usam diferentes valores-chave para seus campos de dados. Para filtrar as propriedades de dados, certifique-se de usar a chave correta no padrão do seu filtro. A tabela a seguir fornece as chaves de filtragem para cada um dos AWS service (Serviço da AWS) com suporte.


| AWS service (Serviço da AWS) | Chave de filtragem | 
| --- | --- | 
| DynamoDB | dynamodb | 
| Kinesis | data | 
| Amazon MQ | data | 
| Amazon MSK | value | 
| Apache Kafka autogerenciado | value | 
| Amazon SQS | body | 

As seções a seguir dão exemplos de padrões de filtro para diferentes tipos de origens de eventos. Eles também fornecem definições de formatos de dados recebidos e formatos de corpo de padrões de filtro para cada serviço com suporte.
+ [Usar a filtragem de eventos com uma origem de eventos do DynamoDB](with-ddb-filtering.md)
+ [Usar a filtragem de eventos com uma origem de eventos do Kinesis](with-kinesis-filtering.md)
+ [Filtrar eventos de uma origem de eventos do Amazon MQ](with-mq-filtering.md)
+ [Filtrar as origens dos eventos do Amazon MSK e do Apache Kafka autogerenciado](kafka-filtering.md)
+ [Usar a filtragem de eventos com uma origem de eventos do Amazon SQS](with-sqs-filtering.md)

# Como testar funções do Lambda no console
<a name="testing-functions"></a>

Você pode testar sua função do Lambda no console invocando sua função com um evento de teste. Um *evento de teste* é uma entrada JSON para sua função. Se a função não necessitar de entrada, o evento poderá ser um documento vazio `({})`.

Quando você executa um teste no console, o Lambda invoca sua função de maneira síncrona com o evento de teste. O runtime da função converte o JSON do evento em um objeto e o transmite ao método do manipulador do código para processamento.

**Criar um evento de teste**  
Antes de testar no console, é necessário criar um evento de teste privado ou compartilhável.

## Como invocar funções com eventos de teste
<a name="invoke-with-event"></a>

**Para testar uma função**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função que deseja testar.

1. Selecione a guia **Test** (Testar).

1. Em **Evento de teste**, escolha **Criar evento** ou **Editar evento salvo** e escolha o evento salvo que deseja usar.

1. Opcionalmente, escolha um **Modelo** para o JSON do evento.

1. Escolha **Testar**.

1. Para analisar os resultados do teste, em **Execution result** (Resultado da execução), expanda **Details** (Detalhes).

Para invocar sua função sem salvar seu evento de teste, escolha **Test** (Testar) antes de salvar. Isso cria um evento de teste não salvo que o Lambda preservará somente durante a sessão.

Para os ambientes de runtimes em Node.js, Python e Ruby, também é possível acessar os eventos de teste existentes, tanto salvos quanto não salvos, na guia **Código**. Use a seção **TEST EVENTS** para criar, editar e executar testes.

## Criar eventos de teste privados
<a name="creating-private-events"></a>

Os eventos privados de teste estão disponíveis apenas para o criador do evento e não exigem permissões adicionais para uso. É possível criar e salvar até 10 eventos privados de teste por função.

**Para criar um evento privado de teste**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função que deseja testar.

1. Selecione a guia **Test** (Testar).

1. Em **Test event** (Evento de teste), faça o seguinte:

   1. Escolha um **Template** (Modelo).

   1. Insira um **Name** (Nome) para o teste.

   1. Na caixa de entrada de texto, insira o evento de teste JSON.

   1. Em **Event sharing settings** (Configurações de compartilhamento de eventos), escolha **Private** (Privado).

1. Escolha **Salvar alterações**.

Para os ambientes de runtimes em Node.js, Python e Ruby, também é possível criar os eventos de teste na guia **Código**. Use a seção **TEST EVENTS** para criar, editar e executar testes.

## Criar eventos de teste compartilháveis
<a name="creating-shareable-events"></a>

Eventos de teste compartilháveis são eventos de teste que você pode compartilhar com outros usuários na mesma conta da AWS. É possível editar eventos compartilháveis de teste de outros usuários e invocar sua função com esses eventos.

O Lambda salva eventos compartilháveis de teste como esquemas em um [registro de esquema do Amazon EventBridge (CloudWatch Events)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-schema-registry.html) com o nome `lambda-testevent-schemas`. Como o Lambda utiliza esse registro para armazenar e chamar eventos compartilháveis de teste que você cria, recomendamos que não edite esse registro nem crie um registro usando o nome `lambda-testevent-schemas`.

Para ver, compartilhar e editar eventos compartilháveis de teste, você deve ter permissões para todas as seguintes [operações de API de registro de esquema do EventBridge (CloudWatch Events)](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/operations.html):
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#CreateRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#CreateSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DeleteSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-version-schemaversion.html#DeleteSchemaVersion)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname.html#DescribeRegistry)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#DescribeSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-discover.html#GetDiscoveredSchema)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname-versions.html#ListSchemaVersions)
+ [https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema](https://docs.aws.amazon.com/eventbridge/latest/schema-reference/v1-registries-name-registryname-schemas-name-schemaname.html#UpdateSchema)

Observe que o salvamento de edições feitas em um evento compartilhável de teste resulta na substituição do respectivo evento.

Se não puder criar, editar ou ver eventos compartilháveis de teste, verifique se sua conta tem as permissões necessárias para essas operações. Se você tiver as permissões necessárias, mas ainda assim não conseguir acessar eventos compartilháveis de teste, verifique se há [políticas baseadas em recursos](access-control-resource-based.md) que possam estar limitando o acesso ao registro do EventBridge (CloudWatch Events).

**Para criar um evento compartilhável de teste**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função que deseja testar.

1. Selecione a guia **Test** (Testar).

1. Em **Test event** (Evento de teste), faça o seguinte:

   1. Escolha um **Template** (Modelo).

   1. Insira um **Name** (Nome) para o teste.

   1. Na caixa de entrada de texto, insira o evento de teste JSON.

   1. Em **Event sharing settings** (Configurações de compartilhamento de eventos), escolha **Shareable** (Compartilhável).

1. Escolha **Salvar alterações**.

**Use eventos de teste compartilháveis com AWS Serverless Application Model.**  
É possível usar o AWS SAM para invocar eventos de teste compartilháveis. Consulte [https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html) no [Guia do desenvolvedor do AWS Serverless Application Model](https://docs.aws.amazon.com//serverless-application-model/latest/developerguide/using-sam-cli-remote-test-event.html)

## Excluir esquemas de eventos compartilháveis de teste
<a name="deleting-test-schemas"></a>

Quando você exclui eventos compartilháveis de teste, o Lambda os remove do registro `lambda-testevent-schemas`. Se você remover o último evento compartilhável de teste do registro, o Lambda excluirá o registro.

Se excluir a função, o Lambda não excluirá nenhum esquema associado de evento compartilhável de teste. Você deve apagar esses recursos manualmente no [console do EventBridge (CloudWatch Events)](https://console.aws.amazon.com/events).

# Estados da função do Lambda
<a name="functions-states"></a>

O Lambda inclui um campo de [Estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) na configuração da função para todas as funções, para indicar quando a função está pronta para ser invocada. O `State` fornece informações sobre o status atual da função, incluindo se você pode invocá-la com êxito. Os estados de função não alteram o comportamento de invocações de função ou como sua função executa o código.

**nota**  
As definições do estado da função diferem um pouco para as funções [SnapStart](snapstart.md). Para obter mais informações, consulte [Lambda SnapStart e estados de função](snapstart-activate.md#snapstart-function-states).

Em muitos casos, uma tabela do DynamoDB é um modo ideal de reter estado entre invocações pois fornece acesso a dados de baixa latência e pode ser escalada com o serviço Lambda. Você também pode armazenar dados no [Amazon EFS for Lambda](https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/) se estiver usando esse serviço, e isso fornece acesso de baixa latência ao armazenamento do sistema de arquivos.

Os estados da função incluem:
+ `Pending` – Depois que o Lambda cria a função, ele define o estado como pendente. Enquanto estiver em estado pendente, o Lambda tenta criar ou configurar recursos para a função, como recursos de VPC ou EFS. O Lambda não invoca uma função durante o estado pendente. As invocações ou outras ações de API que operam na função falharão.
+ `Active` – Sua função transita para o estado ativo depois que o Lambda concluir a configuração e o provisionamento de recursos. As funções só podem ser invocadas com êxito enquanto estiverem ativas.
+ `Failed` – Indica que a configuração de recursos ou o provisionamento encontrou um erro. Quando a criação da função falha, o Lambda define o estado da função como com falha, e você deve excluir e recriar a função.
+ `Inactive` – Uma função torna-se inativa quando está ociosa tempo suficiente para que o Lambda recupere os recursos externos que foram configurados para ela. Quando tenta invocar uma função que está inativa, a invocação falha e o Lambda define a função para o estado pendente até que os recursos da função são recriados. Se o Lambda não conseguir recriar os recursos, a função voltará ao estado inativo. Talvez seja necessário resolver os erros e reimplantar a função para que ela volte ao estado ativo.

Se você estiver utilizando fluxos de trabalho de automação baseados em SDK ou chamando as APIs de serviço do Lambda diretamente, verifique o estado de uma função antes da invocação para conferir se ela está ativa. Você pode fazer isso com a ação da API do Lambda [GetFunction](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunction.html) ou configurando um waiter usando o [AWS SDK for Java 2.0](https://github.com/aws/aws-sdk-java-v2).

```
aws lambda get-function --function-name my-function --query 'Configuration.[State, LastUpdateStatus]'
```

A seguinte saída deverá ser mostrada:

```
[
 "Active",
 "Successful" 
]
```

Ocorre falha nas seguintes operações enquanto a criação da função está pendente:
+ [Invocar](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)

## Estados da função durante atualizações
<a name="functions-states-updating"></a>

O Lambda tem duas operações para atualizar funções:
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html): atualiza o pacote de implantação da função
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html): atualiza a configuração da função

O Lambda usa o atributo [LastUpdateStatus](https://docs.aws.amazon.com/lambda/latest/api/API_FunctionConfiguration.html#lambda-Type-FunctionConfiguration-LastUpdateStatus) para acompanhar o progresso dessas operações de atualização. Enquanto uma atualização estiver em andamento (quando `"LastUpdateStatus": "InProgress"`):
+ O [estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) da função continua sendo `Active`.
+ As invocações continuam a usar o código e a configuração anterior da função até a conclusão da atualização.
+ As seguintes operações falham:
  + [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)
  + [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
  + [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html)
  + [TagResource](https://docs.aws.amazon.com/lambda/latest/api/API_TagResource.html)

Quando uma atualização falha (quando `"LastUpdateStatus": "Failed"`):
+ O [estado](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State) da função continua sendo `Active`.
+ As invocações continuam a usar o código e a configuração anterior da função.

**Example Resposta de GetFunctionConfiguration**  
O exemplo a seguir é o resultado da solicitação [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) em uma função que está sendo atualizada.  

```
{
    "FunctionName": "my-function",
    "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
    "Runtime": "nodejs24.x",
    "VpcConfig": {
        "SubnetIds": [
            "subnet-071f712345678e7c8",
            "subnet-07fd123456788a036",
            "subnet-0804f77612345cacf"
        ],
        "SecurityGroupIds": [
            "sg-085912345678492fb"
        ],
        "VpcId": "vpc-08e1234569e011e83"
    },
    "State": "Active",
    "LastUpdateStatus": "InProgress",
    ...
}
```

# Compreender o comportamento de novas tentativas no Lambda
<a name="invocation-retries"></a>

Ao invocar um função diretamente, você determinará a estratégia para manipular erros relacionados ao código da função. O Lambda não repete automaticamente esses tipos de erros por você. Para tentar novamente, você pode invocar a função manualmente mais uma vez, enviar o evento com falha para uma fila de depuração ou ignorá-lo. O código de sua função pode ter sido executado completa ou parcialmente, ou nem ter sido executado. Se você tentar novamente, certifique-se de que o código de sua função pode lidar com o mesmo evento várias vezes sem duplicar transações nem ter efeitos colaterais indesejados.

Ao invocar um função indiretamente, você deve estar ciente do comportamento de novas tentativas do invocador e dos serviços que podem interagir com a solicitação no processo. Isso inclui as seguintes situações.
+ **Asynchronous Invocation** (Chamada assíncrona): o Lambda faz duas novas tentativas de erros de função. Se a função não tiver capacidade suficiente para lidar com todas as solicitações recebidas, os eventos poderão ter que aguardar na fila durante horas ou dias até serem enviados para a função. Você pode configurar uma fila de mensagens mortas na função para registrar eventos que não foram processadas com êxito. Para ter mais informações, consulte [Adicionar uma fila de mensagens não entregues](invocation-async-retain-records.md#invocation-dlq).
+ **Event source mappings** (Mapeamento da fonte do evento): mapeamentos da fonte do evento que leem das transmissões repetem todo o lote de itens. Os erros repetidos bloqueiam o processamento do estilhaço afetado até o erro ser resolvido ou os itens expirarem. Para detectar estilhaços interrompidos, é possível monitorar a métrica [Iterator Age (Idade do iterador)](monitoring-metrics.md).

  Para mapeamentos da fonte do evento que leem de uma fila, você mesmo determina o intervalo de tempo entre repetições e o destino de eventos falhos. Para fazer isso, configure o tempo limite de visibilidade e a política de redirecionamento na fila de origem. Para obter mais informações, consulte [Como o Lambda processa registros de origens de eventos baseadas em fluxos e filas](invocation-eventsourcemapping.md) e os tópicos específicos do serviço em [Invocando o Lambda com eventos de outros serviços da AWS](lambda-services.md).
+ **Serviços da AWS**: os serviços da AWS podem chamar uma função [de maneira síncrona](invocation-sync.md) ou assíncrona. Para chamada síncrona, o serviço decide se deve tentar novamente. Por exemplo, as operações em lote do Amazon S3 tentam novamente a operação se a função Lambda retornar um código de resposta `TemporaryFailure`. Os serviços que usam proxy em solicitações de um usuário ou cliente de upstream podem ter uma estratégia de repetição ou retransmitir a resposta de erro de volta para o solicitante. Por exemplo, o API Gateway sempre retransmite a resposta de erro de volta para o solicitante. 

  Para a invocação assíncrona, a lógica de repetição de tentativas é a mesma, independentemente da origem da invocação. Por padrão, o Lambda tenta novamente uma invocação assíncrona até duas vezes. Para ter mais informações, consulte [Como o Lambda lida com erros e novas tentativas com invocação assíncrona](invocation-async-error-handling.md).
+ **Other Accounts and Clients** (Outras contas e clientes): ao conceder acesso a outras contas, você pode usar as [políticas baseadas em recursos](access-control-resource-based.md) para restringir os serviços ou recursos que eles podem configurar para chamar sua função. Para evitar que a função fique sobrecarregada, considere colocar uma camada de API na frente da função com o [Amazon API Gateway](services-apigateway.md).

Para ajudar você a lidar com erros em aplicações do Lambda, o Lambda se integra com serviços como o Amazon CloudWatch e o AWS X-Ray. Você pode usar um conjunto de logs, métricas, alarmes e rastreamento do para detectar e identificar rapidamente os problemas no código da função, na API ou em outros recursos compatíveis com sua aplicação. Para ter mais informações, consulte [Monitoramento, depuração e solução de problemas das funções do Lambda](lambda-monitoring.md).

# Usar a detecção de loop recursivo do Lambda para evitar loops infinitos
<a name="invocation-recursion"></a>

Ao configurar uma função do Lambda para gerar a saída para o mesmo serviço ou recurso que invoca a função, é possível criar um loop recursivo infinito. Por exemplo, uma função do Lambda pode gravar uma mensagem em uma fila do Amazon Simple Queue Service (Amazon SQS) que, em seguida, invoca a mesma função. Essa invocação faz com que a função grave outra mensagem na fila, que, por sua vez, invoca a função novamente.

Loops recursivos não intencionais podem resultar em cobranças inesperadas na sua Conta da AWS. Os loops também podem fazer com que o Lambda seja [escalado](lambda-concurrency.md) e use toda a simultaneidade disponível de sua conta. Para ajudar a reduzir o impacto de loops não intencionais, o Lambda detecta determinados tipos de loops recursivos logo após eles ocorrerem. Por padrão, ao detectar um loop recursivo, o Lambda interrompe a invocação da função e notifica você. Se seu design usa padrões recursivos intencionalmente, é possível alterar a configuração padrão de uma função para permitir que ela seja invocada recursivamente. Consulte [Permitir que uma função do Lambda seja executada em um loop recursivo](#invocation-recursion-disable) para obter mais informações.

**Topics**
+ [

## Compreensão da detecção de loop recursivo
](#invocation-recursion-concepts)
+ [

## Serviços da AWS e SDKs compatíveis
](#invocation-recursion-supported)
+ [

## Notificações de loop recursivo
](#invocation-recursion-monitoring)
+ [

## Como responder a notificações de detecção de loop recursivo
](#invocation-recursion-responding)
+ [

## Permitir que uma função do Lambda seja executada em um loop recursivo
](#invocation-recursion-disable)
+ [

## Regiões com suporte para detecção de loops recursivos do Lambda
](#invocation-recursion-regions)

## Compreensão da detecção de loop recursivo
<a name="invocation-recursion-concepts"></a>

A detecção de loop recursivo no Lambda funciona com o rastreamento de eventos. O Lambda é um serviço de computação orientado a eventos que executa seu código de função quando ocorrem determinados eventos. Por exemplo, quando um item é adicionado a uma fila do Amazon SQS ou a um tópico do Amazon Simple Notiﬁcation Service (Amazon SNS). O Lambda transmite eventos para a função como objetos JSON, que contêm informações sobre a alteração no estado do sistema. Quando um evento faz com que a função seja executada, isso é chamado de *invocação*.

Para detectar loops recursivos, o Lambda usa cabeçalhos de rastreamento do [AWS X-Ray](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html). Quando os [Serviços da AWS compatíveis com a detecção de loop recursivo](#invocation-recursion-supportedservices) enviam eventos para o Lambda, esses eventos são anotados automaticamente com metadados. Quando a função do Lambda grava um desses eventos em outro AWS service (Serviço da AWS) compatível usando uma [versão compatível de um AWS SDK](#invocation-recursion-supportedsdks), ela atualiza esses metadados. Os metadados atualizados incluem uma contagem do número de vezes que o evento invocou a função.

**nota**  
Você não precisa habilitar o rastreamento ativo do X-Ray para que esse recurso funcione. Por padrão, a detecção de loop recursivo é ativada para todos os clientes da AWS. Não há cobranças pelo uso do recurso.

Uma *cadeia de solicitações* é uma sequência de invocações do Lambda causada pelo mesmo evento de acionamento. Por exemplo, imagine que uma fila do Amazon SQS invoque sua função do Lambda. Em seguida, a função do Lambda envia o evento processado para a mesma fila do Amazon SQS, que invoca a função novamente. Neste exemplo, cada invocação da função é direcionada para a mesma cadeia de solicitações.

Se a função for cerca de 16 vezes na mesma cadeia de solicitações, o Lambda interromperá automaticamente a próxima invocação da função nessa cadeia de solicitações e notificará você. Se a função estiver configurada com diversos acionadores, as invocações de outros acionadores não serão afetadas.

**nota**  
Mesmo quando a configuração `maxReceiveCount` na política de redirecionamento da fila de origem é maior que 16, a proteção de recursão do Lambda não impede que o Amazon SQS repita a mensagem depois que um loop recursivo é detectado e encerrado. Quando o Lambda detecta um loop recursivo e descarta as invocações subsequentes, ele retorna uma `RecursiveInvocationException` para o mapeamento da origem do evento. Isso incrementa o valor `receiveCount` da mensagem. O Lambda continua refazendo a tentativa da mensagem e continua bloqueando as invocações de funções, até que o Amazon SQS determine que o `maxReceiveCount` foi excedido e envie a mensagem para a fila de mensagens não entregues configurada.

Se você tiver um [destino em caso de falha](invocation-async-retain-records.md#invocation-async-destinations) ou uma [fila de mensagens não entregues](invocation-async-retain-records.md#invocation-dlq) configurados para a função, o Lambda também enviará o evento da invocação interrompida para o destino ou a fila de mensagens não entregues. Ao configurar um destino ou uma fila de mensagens não entregues para a função, certifique-se de não usar um acionador de evento ou mapeamento da origem do evento que já seja usado pela função. Se você enviar eventos para o mesmo recurso que invoca a função, poderá criar outro loop recursivo, e esse loop também será encerrado. Se você optar por não detectar o loop de recursão, esse loop não será encerrado.

## Serviços da AWS e SDKs compatíveis
<a name="invocation-recursion-supported"></a>

O Lambda pode detectar somente loops recursivos que incluem determinados Serviços da AWS compatíveis. Para que os loops recursivos sejam detectados, a função também deve usar um dos AWS SDKs compatíveis.

### Compatível Serviços da AWS
<a name="invocation-recursion-supportedservices"></a>

No momento, o Lambda detecta loops recursivos entre as funções, o Amazon SQS, o Amazon S3 e o Amazon SNS. O Lambda também detecta loops compostos somente por funções do Lambda, que podem invocar umas às outras de forma síncrona ou assíncrona. Os seguintes diagramas apresentam alguns exemplos de loops que o Lambda pode detectar:

![\[Diagramas de loops recursivos entre uma função do Lambda, o Amazon SNS, o Amazon S3 e uma fila do Amazon SQS.\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/images/RunawayWorkloadDetected_v3.png)


Quando outro AWS service (Serviço da AWS), como o Amazon DynamoDB, faz parte do loop, o Lambda não pode, atualmente, detectá-lo e interrompê-lo.

No momento, como o Lambda detecta somente loops recursivos envolvendo o Amazon SQS, o Amazon S3 e o Amazon SNS, ainda é possível que loops envolvendo outros Serviços da AWS possam resultar no uso não intencional das funções do Lambda.

Para evitar cobranças inesperadas em sua Conta da AWS, recomendamos que você configure os [alarmes do Amazon CloudWatch](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html) para alertar sobre padrões de uso incomuns. Por exemplo, é possível configurar o CloudWatch para notificar você sobre picos na simultaneidade ou nas invocações da função do Lambda. Também é possível configurar um [alarme de faturamento](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html) para notificar você quando os gastos em sua conta excederem um limite especificado. Como alternativa, você pode usar o [AWS Cost Anomaly Detection](https://docs.aws.amazon.com/cost-management/latest/userguide/manage-ad.html) para alertas sobre padrões de faturamento incomuns.

### AWS SDKs compatíveis
<a name="invocation-recursion-supportedsdks"></a>

Para que o Lambda detecte loops recursivos, a função deve usar uma das seguintes versões do SDK ou superiores:


| Runtime | Versão mínima exigida do AWS SDK | 
| --- | --- | 
|  Node.js  |  2.1147.0 (SDK versão 2) 3.105.0 (SDK versão 3)  | 
|  Python  |  1.24.46 (boto3) 1.27.46 (botocore)  | 
|  Java 8 e Java 11  |  2,17.135  | 
|  Java 17  |  2.20.81  | 
|  Java 21  |  2.21.24  | 
|  .NET  |  3.7.293.0  | 
|  Ruby  |  3.134.0  | 
|  PHP  |  3.232.0  | 
|  Go  |  V2 SDK 1.57.0  | 

Alguns runtimes do Lambda, como Python e Node.js, incluem uma versão do AWS SDK. Se a versão do SDK inclusa no runtime de sua função for inferior ao mínimo exigido, você poderá adicionar uma versão compatível do SDK ao pacote de implantação da função. Também é possível adicionar uma versão do SDK compatível à função usando uma [camada do Lambda](chapter-layers.md). Para obter uma lista dos SDKs inclusos em cada runtime do Lambda, consulte [Runtimes do Lambda](lambda-runtimes.md).

## Notificações de loop recursivo
<a name="invocation-recursion-monitoring"></a>

Quando o Lambda interrompe um loop recursivo, você recebe notificações por meio do [Health Dashboard](https://aws.amazon.com/premiumsupport/technology/aws-health-dashboard/) e por e-mail. Também é possível usar as métricas do CloudWatch para monitorar o número de invocações recursivas que o Lambda interrompeu.

### Health DashboardNotificações do
<a name="invocation-recursion-phd"></a>

Quando o Lambda interrompe uma invocação recursiva, o Health Dashboard exibe uma notificação na página de **integridade da sua conta**, em [Problemas abertos e recentes](https://health.aws.amazon.com/health/home#/account/dashboard/open-issues). Observe que pode demorar até 3,5 horas após o Lambda interromper uma invocação recursiva para que essa notificação seja exibida. Para obter mais informações sobre como visualizar eventos da conta no Health Dashboard, consulte [Getting started with your AWS Health Dashboard – Your account health](https://docs.aws.amazon.com/health/latest/ug/getting-started-health-dashboard.html) no *Guia do usuário do AWS Health*.

### Alertas de e-mail
<a name="invocation-recursion-email"></a>

Quando o Lambda interrompe uma invocação recursiva da função pela primeira vez, ele envia um alerta por e-mail. O Lambda envia, no máximo, um e-mail a cada 24 horas para cada função em sua Conta da AWS. Após o Lambda enviar uma notificação por e-mail, você não receberá mais e-mails sobre essa função por mais 24 horas, mesmo que o Lambda interrompa outras invocações recursivas da função. Observe que pode demorar até 3,5 horas após o Lambda interromper uma invocação recursiva para que você receba este alerta por e-mail.

O Lambda envia alertas de e-mail de loop recursivo para o contato principal da conta e para o contato alternativo de operações da sua Conta da AWS. Para obter informações sobre como visualizar ou atualizar os endereços de e-mail em sua conta, consulte [Updating contact information](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-update-contact.html) na *Referência geral da AWS*.

### Métricas do Amazon CloudWatch
<a name="invocation-recursion-cloudwatch"></a>

A [métrica do CloudWatch](monitoring-metrics-types.md) `RecursiveInvocationsDropped` registra o número de invocações da função que o Lambda interrompeu porque a função foi invocada aproximadamente mais de 16 vezes em uma única cadeia de solicitações. O Lambda emite essa métrica logo após interromper uma invocação recursiva. Para visualizar essa métrica, siga as instruções em [Exibir métricas no console do CloudWatch](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics.html#monitoring-metrics-console) e escolha a métrica `RecursiveInvocationsDropped`.

## Como responder a notificações de detecção de loop recursivo
<a name="invocation-recursion-responding"></a>

Quando a função é invocada mais de aproximadamente 16 vezes pelo mesmo evento de acionamento, o Lambda interrompe a próxima invocação de função desse evento para interromper o loop recursivo. Para evitar a recorrência de um loop recursivo que o Lambda interrompeu, faça o seguinte: 
+ Reduza a [simultaneidade](lambda-concurrency.md) disponível da função para zero, pois isso limita todas as invocações futuras.
+ Remova ou desabilite o acionador ou o mapeamento da origem do evento que está invocando a função.
+ Identifique e corrija defeitos de código que gravam eventos no recurso da AWS que está invocando a função. Uma origem comum de defeitos ocorre quando você usa variáveis ​​para definir a origem e o destino do evento de uma função. Verifique se você não está usando o mesmo valor para ambas as variáveis.

Além disso, se a origem do evento para a função do Lambda for uma fila do Amazon SQS, considere [configurar uma fila de mensagens não entregues](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html) na fila de origem.

**nota**  
Certifique-se de configurar a fila de mensagens não entregues na fila de origem, e não na função do Lambda. A fila de mensagens não entregues que você configura em uma função é usada para a [fila de invocação assíncrona](invocation-async.md) da função, e não para filas de origem de evento.

Se a origem do evento for um tópico do Amazon SNS, considere adicionar um [destino em caso de falha](invocation-async-retain-records.md#invocation-async-destinations) para a função.

**Reduzir a simultaneidade disponível da função para zero (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da sua função.

1. Escolha **Controlar**.

1. Na caixa de diálogo **Controlar a função**, escolha **Confirmar**.

**Remover um acionador ou mapeamento da origem do evento para a função (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da sua função.

1. Escolha a guia **Configuração** e, em seguida, escolha **Acionadores**.

1. Em **Acionadores**, selecione o acionador ou o mapeamento da origem do evento que deseja excluir e, em seguida, escolha **Excluir**.

1. Na caixa de diálogo **Excluir acionadores**, escolha **Excluir**.

**Desabilitar um mapeamento da origem do evento para a função (AWS CLI)**

1. Para descobrir o UUID para o mapeamento da origem do evento que você deseja desabilitar, execute o comando [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/list-event-source-mappings.html) da AWS Command Line Interface (AWS CLI).

   ```
   aws lambda list-event-source-mappings
   ```

1. Para desabilitar o mapeamento da origem do evento, execute o comando [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) da AWS CLI apresentado a seguir.

   ```
   aws lambda update-event-source-mapping --function-name MyFunction \
   --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 --no-enabled
   ```

## Permitir que uma função do Lambda seja executada em um loop recursivo
<a name="invocation-recursion-disable"></a>

Se seu design usa padrões recursivos intencionalmente, é possível configurar uma função do Lambda para permitir que ela seja invocada recursivamente. Recomendamos evitar usar loops recursivos em seu design. Erros de implementação podem levar a invocações recursivas usando toda a simultaneidade disponível da Conta da AWS e à cobrança inesperada de taxas em sua conta.

**Importante**  
Se você usa loops recursivos, trate-os com cuidado. Implemente proteções de práticas recomendadas para minimizar os riscos de erros de implementação. Para saber mais sobre as práticas recomendadas para uso de padrões recursivos, consulte [Padrões recursivos que causam a disparada de funções do Lambda](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) no Serverless Land.

É possível configurar funções para permitir loops recursivos usando o console do Lambda, a AWS Command Line Interface (AWS CLI) e a API [PutFunctionRecursionConfig](https://docs.aws.amazon.com//lambda/latest/api/API_PutFunctionRecursionConfig.html). Também é possível configurar a detecção de loop recursivo de uma função no AWS SAM e no CloudFormation. 

Por padrão, o Lambda detecta e encerra loops recursivos. A menos que o projeto use intencionalmente um loop recursivo, recomendamos não alterar a configuração padrão das suas funções.

Observe quem quando você configura uma função para permitir loops recursivos, a [métrica do CloudWatch](monitoring-metrics-types.md#invocation-metrics) `RecursiveInvocationsDropped` não é emitida.

------
#### [ Console ]

**Para permitir que uma função seja executada em um loop recursivo (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da sua função para abrir a página de detalhes da função.

1. Escolha a guia **Configuração** e, em seguida, escolha **Detecção de simultaneidade e recursividade**.

1. Ao lado de **Detecção de loop recursivo**, escolha **Editar**.

1. Selecione **Permitir loops recursivos**.

1. Escolha **Salvar**.

------
#### [ AWS CLI ]

A API [PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) pode ser usada para permitir que sua função seja invocada em um loop recursivo. Especifique `Allow` para o parâmetro de loop recursivo. Por exemplo, você pode chamar essa API com o comando `put-function-recursion-config` da AWS CLI:

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Allow
```

------

É possível alterar a configuração da sua função de volta para a configuração padrão para que o Lambda encerre os loops recursivos ao detectá-los. Edite a configuração da sua função usando o console do Lambda ou a AWS CLI.

------
#### [ Console ]

**Para configurar uma função para que os loops recursivos sejam encerrados (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da sua função para abrir a página de detalhes da função.

1. Escolha a guia **Configuração** e, em seguida, escolha **Detecção de simultaneidade e recursividade**.

1. Ao lado de **Detecção de loop recursivo**, escolha **Editar**.

1. Selecione **Encerrar loops recursivos**.

1. Escolha **Salvar**.

------
#### [ AWS CLI ]

A API [PutFunctionRecursionConfig](https://docs.aws.amazon.com/lambda/latest/api/API_PutFunctionRecursionConfig.html) pode ser usada para configurar sua função para que o Lambda encerre loops recursivos ao detectá-los. Especifique `Terminate` para o parâmetro de loop recursivo. Por exemplo, você pode chamar essa API com o comando `put-function-recursion-config` da AWS CLI:

```
aws lambda put-function-recursion-config --function-name yourFunctionName --recursive-loop Terminate
```

------

## Regiões com suporte para detecção de loops recursivos do Lambda
<a name="invocation-recursion-regions"></a>

A detecção de loop recursivo do Lambda é compatível com todas as [regiões comerciais](https://docs.aws.amazon.com/general/latest/gr/glos-chap.html#region), exceto México (Centro) e Ásia-Pacífico (Nova Zelândia).

# Criar e gerenciar URLs de função do Lambda
<a name="urls-configuration"></a>

Um URL de função é um endpoint HTTP(S) dedicado para a função do Lambda. Você pode criar e configurar um URL de função no console do Lambda ou na API do Lambda.

**dica**  
O Lambda oferece duas maneiras de invocar sua função por meio de um endpoint HTTP: URLs de função e Amazon API Gateway. Se não tiver certeza de qual é o melhor método para seu caso de uso, consulte [Seleção de um método para invocar a função do Lambda usando uma solicitação HTTP](furls-http-invoke-decision.md).

Ao criar um URL de função, o Lambda gera automaticamente um endpoint de URL exclusivo para você. Após a criação de um URL de função, o endpoint de URL nunca muda. Os endpoints de URLs de função têm o seguinte formato:

```
https://<url-id>.lambda-url.<region>.on.aws
```

**nota**  
Os URLs da função não são compatíveis com as seguintes Regiões da AWS: Ásia-Pacífico (Hyderabad) (`ap-south-2`), Ásia-Pacífico (Melbourne) (`ap-southeast-4`), Ásia-Pacífico (Malásia) (`ap-southeast-5`), Ásia-Pacífico (Nova Zelândia) (`ap-southeast-6`), Ásia-Pacífico (Tailândia) (`ap-southeast-7`), Ásia-Pacífico (Taipei) (`ap-east-2`), Oeste do Canadá (Calgary) (`ca-west-1`), Europa (Espanha) (`eu-south-2`), Europa (Zurique) (`eu-central-2`), Israel (Tel Aviv) (`il-central-1`), e Oriente Médio (EAU) (`me-central-1`).

Os URLs de função são habilitados para pilha dupla, sendo compatíveis com IPv4 e IPv6. Depois de configurar um URL de função para a sua função, você pode invocar a função por meio de seu endpoint HTTP(S) via um navegador da Web, curl, Postman ou qualquer cliente HTTP.

**nota**  
Você só pode acessar a URL da função pela Internet pública. Embora as funções do Lambda sejam compatíveis com o AWS PrivateLink, as URLs de função não o são.

Os URLs de função do Lambda usam [políticas baseadas em recursos](access-control-resource-based.md) para segurança e controle de acesso. Os URLs de função também são compatíveis com opções de configuração de compartilhamento de recursos de origem cruzada (CORS).

Você pode aplicar URLs de função a qualquer alias de função ou à versão da função não publicada `$LATEST`. Você não pode adicionar um URL de função a nenhuma outra versão da função.

A seção a seguir mostra como criar e gerenciar um URL da função usando o console do Lambda, a AWS CLI e o modelo do CloudFormation.

**Topics**
+ [

## Criar um URL de função (console)
](#create-url-console)
+ [

## Criar um URL de função () (AWS CLI)
](#create-url-cli)
+ [

## Adicionar um URL de função a um modelo do CloudFormation
](#urls-cfn)
+ [

## Compartilhamento de recursos de origem cruzada (CORS)
](#urls-cors)
+ [

## Controlar a utilização de URLs de função
](#urls-throttling)
+ [

## Desativar URLs de função
](#urls-deactivating)
+ [

## Excluir URLs de funções
](#w2aac39c81c53)
+ [

# Controlar o acesso aos URLs de função do Lambda
](urls-auth.md)
+ [

# Invocar URLs de função do Lambda
](urls-invocation.md)
+ [

# Monitorar URLs de função do Lambda
](urls-monitoring.md)
+ [

# Seleção de um método para invocar a função do Lambda usando uma solicitação HTTP
](furls-http-invoke-decision.md)
+ [

# Tutorial: criar um endpoint de webhook usando um URL de função do Lambda
](urls-webhook-tutorial.md)

## Criar um URL de função (console)
<a name="create-url-console"></a>

Siga estas etapas para criar um URL de função usando o console.

### Para criar um URL da função para uma função existente
<a name="create-url-existing-function"></a>

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função para a qual você deseja criar o URL de função.

1. Escolha a guia **Configuration** (Configuração) e depois **Function URL** (URL de função).

1. Escolha **Create function URL** (Criar URL de função).

1. Para **Auth type** (Tipo de autenticação), escolha **AWS\$1IAM** ou **NONE** (NENHUM). Para obter mais informações sobre autenticação de URLs de função, consulte [Controle de acesso](urls-auth.md).

1. (Opcional) Selecione **Configure cross-origin resource sharing (CORS)** [Configurar compartilhamento de recursos de origem cruzada (CORS)] e defina as configurações de CORS para o URL de função. Para obter mais informações sobre CORS, consulte [Compartilhamento de recursos de origem cruzada (CORS)](#urls-cors).

1. Escolha **Salvar**.

Isso cria um URL de função para a versão da função não publicada `$LATEST`. O URL de função aparece na seção **Function overview** (Visão geral de funções) do console.

### Para criar um URL da função para um alias existente
<a name="create-url-existing-alias"></a>

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função com o alias para o qual você deseja criar o URL de função.

1. Escolha a guia **Aliases** e depois escolha o nome do alias para o qual você deseja criar o URL de função.

1. Escolha a guia **Configuration** (Configuração) e depois **Function URL** (URL de função).

1. Escolha **Create function URL** (Criar URL de função).

1. Para **Auth type** (Tipo de autenticação), escolha **AWS\$1IAM** ou **NONE** (NENHUM). Para obter mais informações sobre autenticação de URLs de função, consulte [Controle de acesso](urls-auth.md).

1. (Opcional) Selecione **Configure cross-origin resource sharing (CORS)** [Configurar compartilhamento de recursos de origem cruzada (CORS)] e defina as configurações de CORS para o URL de função. Para obter mais informações sobre CORS, consulte [Compartilhamento de recursos de origem cruzada (CORS)](#urls-cors).

1. Escolha **Salvar**.

Isso cria um URL de função para o alias da função. O URL de função aparece na seção **Function overview** (Visão geral de funções) do console para o alias.

### Para criar uma nova função com um URL da função
<a name="create-url-new-function"></a>

**Para criar uma nova função com um URL de função (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha a opção **Criar função**.

1. Em **Basic information** (Informações básicas), faça o seguinte:

   1. Em **Function Name** (Nome da função), insira o nome da função, como **my-function**.

   1. Em **Runtime**, escolha o runtime da linguagem de sua preferência, como **Node.js 24**.

   1. Para **Architecture** (Arquitetura ), escolha **x86\$164** ou **arm64**.

   1. Expanda **Permissions** (Permissões) e depois escolha se vai criar uma nova função de execução ou usar uma já existente.

1. Expanda **Advanced settings** (Configurações avançadas) e selecione **Function URL** (URL de função).

1. Para **Auth type** (Tipo de autenticação), escolha **AWS\$1IAM** ou **NONE** (NENHUM). Para obter mais informações sobre autenticação de URLs de função, consulte [Controle de acesso](urls-auth.md).

1. (Opcional) Selecione **Configure cross-origin resource sharing (CORS)** [(Configurar compartilhamento de recursos de origem cruzada (CORS)]. Se essa opção for selecionada durante a criação da função, o URL de função permitirá solicitações de todas as origens por padrão. Você pode editar as configurações de CORS para o URL de função após criar a função. Para obter mais informações sobre CORS, consulte [Compartilhamento de recursos de origem cruzada (CORS)](#urls-cors).

1. Escolha a opção **Criar função**.

Isso cria um novo URL de função para a versão da função não publicada `$LATEST`. O URL de função aparece na seção **Function overview** (Visão geral de funções) do console.

## Criar um URL de função () (AWS CLI)
<a name="create-url-cli"></a>

Para criar uma URL de função para uma função existente do Lambda usando a AWS Command Line Interface (AWS CLI), execute o seguinte comando:

```
aws lambda create-function-url-config \
    --function-name my-function \
    --qualifier prod \ // optional
    --auth-type AWS_IAM
    --cors-config {AllowOrigins="https://example.com"} // optional
```

Isso adiciona um URL de função ao qualificador **prod** da função **my-function**. Para obter mais informações sobre esses parâmetros de configuração, consulte [CreateFunctionURLConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html) na referência da API.

**nota**  
Para criar um URL de função por meio da AWS CLI, a função já deve existir.

## Adicionar um URL de função a um modelo do CloudFormation
<a name="urls-cfn"></a>

Para adicionar um recurso de `AWS::Lambda::Url` ao modelo do CloudFormation, use a seguinte sintaxe:

### JSON
<a name="urls-cfn-json"></a>

```
{
  "Type" : "AWS::Lambda::Url",
  "Properties" : {
      "AuthType" : String,
      "Cors" : Cors,
      "Qualifier" : String,
      "TargetFunctionArn" : String
    }
}
```

### YAML
<a name="urls-cfn-yaml"></a>

```
Type: AWS::Lambda::Url
Properties: 
  AuthType: String
  Cors: 
    Cors
  Qualifier: String
  TargetFunctionArn: String
```

### Parâmetros
<a name="urls-cfn-params"></a>
+ (Obrigatório) `AuthType`: define o tipo de autenticação para o URL de função. Os valores possíveis são `AWS_IAM` ou `NONE`. Para restringir o acesso somente para usuários autenticados, defina como `AWS_IAM`. Para ignorar a autenticação do IAM e permitir que qualquer usuário faça solicitações à a função, defina como `NONE`.
+ (Optional) `Cors`: defina [CORS settings](#urls-cors) (Configurações de CORS) para o URL de função. Para adicionar `Cors` ao recurso `AWS::Lambda::Url` no CloudFormation, use a sintaxe a seguir.

    
**Example AWS::Lambda::Url.Cors (JSON)**  

  ```
  {
    "AllowCredentials" : Boolean,
    "AllowHeaders" : [ String, ... ],
    "AllowMethods" : [ String, ... ],
    "AllowOrigins" : [ String, ... ],
    "ExposeHeaders" : [ String, ... ],
    "MaxAge" : Integer
  }
  ```  
**Example AWS::Lambda::Url.Cors (YAML)**  

  ```
    AllowCredentials: Boolean
    AllowHeaders: 
      - String
    AllowMethods: 
      - String
    AllowOrigins: 
      - String
    ExposeHeaders: 
      - String
    MaxAge: Integer
  ```
+ (Optional) `Qualifier`: o nome do alias.
+ (Obrigatório) `TargetFunctionArn`: o nome ou o nome do recurso da Amazon (ARN) da função do Lambda. Os formatos de nome válidos incluem o seguinte:
  + **Nome da função** – `my-function`
  + **ARN da função** – `arn:aws:lambda:us-west-2:123456789012:function:my-function`
  + **ARN parcial** – `123456789012:function:my-function`

## Compartilhamento de recursos de origem cruzada (CORS)
<a name="urls-cors"></a>

Para definir como diferentes origens podem acessar o URL de função, use [Compartilhamento de recursos de origem cruzada (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). Recomendamos configurar o CORS se você pretender chamar o URL de função em um domínio diferente. O Lambda é compatível com os cabeçalhos de CORS a seguir para URLs de função.


| Cabeçalhos de CORS | Propriedade da configuração de CORS | Exemplos de valores | 
| --- | --- | --- | 
|  [ Access-Control-Allow-Origin](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Origin)  |  `AllowOrigins`  |  `*` (permitir todas as origens) `https://www.example.com` `http://localhost:60905`  | 
|  [ Access-Control-Allow-Methods](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods)  |  `AllowMethods`  |  `GET`, `POST`, `DELETE`, `*`  | 
|  [ Access-Control-Allow-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers)  |  `AllowHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Expose-Headers](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers)  |  `ExposeHeaders`  |  `Date`, `Keep-Alive`, `X-Custom-Header`  | 
|  [ Access-Control-Allow-Credentials](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Credentials)  |  `AllowCredentials`  |  `TRUE`  | 
|  [ Access-Control-Max-Age](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age)  |  `MaxAge`  |  `5` (padrão), `300`  | 

Quando você configura o CORS para um URL de função usando o console do Lambda ou a AWS CLI, o Lambda adiciona automaticamente os cabeçalhos de CORS a todas as respostas por meio do URL de função. Como alternativa, você pode adicionar manualmente cabeçalhos de CORS à resposta da função. Se houver cabeçalhos conflitantes, o comportamento esperado depende do tipo de solicitação:
+ Para solicitações de preflight, como solicitações de OPTIONS, os cabeçalhos CORS configurados na URL da função têm precedência. O Lambda só retorna esses cabeçalhos CORS na resposta.
+ Para solicitações que não são de preflight, como solicitações GET ou POST, o Lambda retorna os cabeçalhos CORS configurados na URL da função, bem como os cabeçalhos CORS retornados pela função. Isso pode resultar em cabeçalhos CORS duplicados na resposta. Você pode ver um log similar a este: `The 'Access-Control-Allow-Origin' header contains multiple values '*, *', but only one is allowed`.

Em geral, recomendamos definir todas as configurações de CORS na URL da função, em vez de enviar cabeçalhos CORS manualmente na resposta da função.

## Controlar a utilização de URLs de função
<a name="urls-throttling"></a>

O controle de utilização limita a taxa na qual a função processa as solicitações. Isso é útil em muitas situações, como para impedir que a função sobrecarregue recursos downstream ou para lidar com um aumento repentino de solicitações.

Você pode limitar a taxa de solicitações que a função do Lambda processa por meio de um URL de função configurando a simultaneidade reservada. A simultaneidade reservada limita o número máximo de invocações simultâneas para a função. A taxa máxima de solicitação por segundo (RPS) da função é equivalente a 10 vezes a simultaneidade reservada configurada. Por exemplo, se você configurar a função com uma simultaneidade reservada de 100, o RPS máximo será 1.000.

Sempre que a simultaneidade da função exceder a simultaneidade reservada, o URL de função retornará um código de status HTTP `429`. Se a função receber uma solicitação que exceda o máximo de 10x RPS com base na simultaneidade reservada configurada, você também receberá um erro HTTP `429`. Para obter mais informações sobre simultaneidade reservada, consulte [Configurar a simultaneidade reservada para uma função](configuration-concurrency.md).

## Desativar URLs de função
<a name="urls-deactivating"></a>

Em uma emergência, talvez você queira rejeitar todo o tráfego para o URL de função. Para reativar o URL de função, defina a simultaneidade reservada como zero. Isso controla a utilização de todas as solicitações ao URL de função, gerando respostas de status HTTP `429`. Para reativar o URL de função, exclua a configuração de simultaneidade reservada ou defina a configuração como um valor maior que zero.

## Excluir URLs de funções
<a name="w2aac39c81c53"></a>

Quando você exclui um URL de função, não pode recuperá-lo. A criação de um novo URL de função resultará em um endereço URL diferente.

**nota**  
Se você excluir um URL da função com o tipo de autenticação `NONE`, o Lambda não excluirá a política baseada em recursos associada a ela. Se quiser excluir essa política, deverá excluí-la manualmente.

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função.

1. Escolha a guia **Configuration** (Configuração) e depois **Function URL** (URL de função).

1. Escolha **Excluir**.

1. Insira a palavra *delete* (excluir) no campo para confirmar a exclusão.

1. Escolha **Excluir**.

**nota**  
Quando você exclui uma função que tem uma URL da função, o Lambda a exclui a URL da função de modo assíncrono. Se você criar imediatamente uma nova função com o mesmo nome e na mesma conta, é possível que a URL da função original seja mapeada para a nova função em vez de ser excluída.

# Controlar o acesso aos URLs de função do Lambda
<a name="urls-auth"></a>

**nota**  
A partir de outubro de 2025, os novos URLs da função exigirão as permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`.

É possível controlar o acesso aos URLs da função do Lambda usando o parâmetro [AuthType](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html#lambda-CreateFunctionUrlConfig-request-AuthType) combino com as [políticas baseadas em recursos](access-control-resource-based.md) anexadas a sua função específica. A configuração desses dois componentes determina quem pode invocar ou executar outras ações administrativas no URL de função.

O parâmetro `AuthType` determina como o Lambda autentica ou autoriza solicitações ao URL de função. Ao configurar o URL de função, você deve especificar uma das seguintes opções de `AuthType`:
+ `AWS_IAM`: o Lambda usa o AWS Identity and Access Management (IAM) para autenticar e autorizar solicitações com base na política de identidade da entidade principal do IAM e na política baseada em recursos da função. Escolha essa opção se quiser que apenas usuários e perfis autenticados para invocar a função usando o URL da função.
+ `NONE`: o Lambda não realiza nenhuma autenticação antes de invocar a função. Porém, a política baseada em recursos da função está sempre em vigor e deve conceder acesso público antes que o URL de função possa receber solicitações. Escolha essa opção para permitir acesso público e não autenticado ao URL de função.

Para obter informações adicionais sobre segurança, você pode usar AWS Identity and Access Management Access Analyzer para obter uma análise abrangente do acesso externo ao URL de função. O IAM Access Analyzer também monitora permissões novas ou atualizadas nas funções do Lambda para ajudá-lo a identificar as permissões que concedem acesso público e acesso entre contas. Você pode usar o analisador de acesso do IAM sem custo. Para começar a usar o IAM Access Analyzer, consulte [Usando o AWS IAM Access Analyzer](https://docs.aws.amazon.com/IAM/latest/UserGuide/what-is-access-analyzer.html).

Esta página contém exemplos de políticas baseadas em recursos para ambos os tipos de autenticação e como criar essas políticas usando a operação da API [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html) ou o console do Lambda. Para obter informações sobre como invocar o URL da função depois de configurar as permissões, consulte [Invocar URLs de função do Lambda](urls-invocation.md).

**Topics**
+ [

## Usar o tipo de autenticação `AWS_IAM`
](#urls-auth-iam)
+ [

## Usar o tipo de autenticação `NONE`
](#urls-auth-none)
+ [

## Governança e controle de acesso
](#urls-governance)

## Usar o tipo de autenticação `AWS_IAM`
<a name="urls-auth-iam"></a>

Se você escolher o tipo de autenticação `AWS_IAM`, os usuários que precisarem invocar o URL da função do Lambda deverão ter as permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`. Dependendo de quem faz a solicitação de invocação, pode ser necessário conceder essa permissão usando uma [política baseada em recursos](access-control-resource-based.md).

Se a entidade principal fazendo a solicitação estiver na mesma Conta da AWS que o URL da função, a entidade principal deve **ou** ter permissões `lambda:InvokeFunctionUrl` na `lambda:InvokeFunction` [política baseada em identidade](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html), **ou** ter permissões concedidas na política baseada em recursos da função. Em outras palavras, uma política baseada em recursos será opcional se o usuário já tiver permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction` em sua política baseada em identidade. A avaliação de políticas segue as regras descritas na [Lógica de avaliação de políticas](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html).

Se a entidade principal fazendo a solicitação estiver em uma conta diferente, a entidade principal deverá ter **ambas**, uma política baseada em identidade que forneça a ela as permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction` **e** permissões concedidas em uma política baseada em recursos para a função que ela está tentando invocar. A avaliação da política segue as regras descritas em [Determinar se uma solicitação entre contas é permitida](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic-cross-account.html#policy-eval-cross-account).

A política baseada em recursos a seguir permite que a função `example` na Conta da AWS `444455556666` invoque o URL da função associado à função `my-function`. A chave de contexto [lambda:invokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) restringe a ação `lambda:InvokeFunction` para as chamadas do URL da função. Isso significa que a entidade principal deve usar o URL da função para invocar a função. Se você não incluir `lambda:InvokedViaFunctionUrl`, a entidade principal poderá invocar sua função por meio de outros métodos de invocação, além do URL da função.

**Example — Política baseada em recursos entre contas**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "AWS_IAM"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::444455556666:role/example"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

Você pode criar essa política baseada em recursos por meio do console, seguindo as seguintes etapas:

**Como conceder permissões de invocação de URL a outra conta (console)**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Escolha o nome da função para a qual deseja conceder permissões de invocação de URL.

1. Escolha a guia **Configuration** (Configuração) e, depois, **Permissions** (Permissões).

1. Em **Resource-based policy** (Política baseada em recursos), escolha **Add permissions** (Adicionar permissões).

1. Escolha **Function URL** (URL de função).

1. Para **Auth type** (Tipo de autenticação), escolha **AWS\$1IAM**.

1. Insira um **ID de declaração** para sua declaração de política.

1. Em **Entidade principal**, insira o ID da conta ou o nome do recurso da Amazon (ARN) do usuário ou da função para a qual você deseja conceder permissões. Por exemplo: **444455556666**.

1. Escolha **Salvar**.

Como alternativa, você pode criar essa política usando os seguintes comandos [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) do AWS Command Line Interface (AWS CLI). Ao usar a AWS CLI, você deve adicionar as declarações `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction` separadamente. Por exemplo:

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal 444455556666 \
  --function-url-auth-type AWS_IAM
```

```
aws lambda add-permission --function-name my-function \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal 444455556666 \
  --invoked-via-function-url
```

## Usar o tipo de autenticação `NONE`
<a name="urls-auth-none"></a>

**Importante**  
Quando o tipo de autenticação do URL dA função for `NONE` e você tiver uma [política baseada em recursos](access-control-resource-based.md) que concede acesso público, qualquer usuário não autenticado com o URL da função poderá invocar a função.

Em alguns casos, você pode querer que o URL da função seja público. Por exemplo, você pode querer atender a solicitações feitas diretamente de um navegador da Web. Para permitir acesso público ao URL de função, escolha o tipo de autenticação `NONE`.

Se você escolher o tipo de autenticação `NONE`, o Lambda não usará o IAM para autenticar solicitações ao URL de função. No entanto, sua função deve ter uma política baseada em recursos que permita `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`. Quando você cria um URL da função com o tipo de autenticação `NONE` usando o console ou o AWS Serverless Application Model (AWS SAM), o Lambda cria automaticamente a política baseada em recursos para você. Se estiver usando a AWS CLI, o AWS CloudFormation ou a API do Lambda diretamente, deverá [adicionar as políticas](#policy-cli) você mesmo.

Recomendamos que você inclua a chave de contexto [lambda:InvokedViaFunctionUrl](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html#lambda-AddPermission-request-InvokedViaFunctionUrl) em suas políticas baseadas em recursos ao usar o tipo de autenticação `NONE`. Essa chave de contexto garante que a função só possa ser invocada por meio do URL da função e não por meio de outros métodos de invocação.

Observe o seguinte sobre essa política:
+ Todas as entidades podem chamar `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`. Isso significa que qualquer pessoa que tenha o URL da sua função pode invocá-la.
+ O valor da chave de condição `lambda:FunctionUrlAuthType` é `NONE`. Isso significa que a instrução da política só permite acesso quando o tipo de autenticação do URL da função também é `NONE`.
+ A condição `lambda:InvokedViaFunctionUrl` garante que a função só possa ser invocada por meio do URL da função e não por meio de outros métodos de invocação.

**Example — Política baseada em recursos padrão para o tipo de autenticação NONE**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FunctionURLAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunctionUrl",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "StringEquals": {
          "lambda:FunctionUrlAuthType": "NONE"
        }
      }
    },
    {
      "Sid": "FunctionURLInvokeAllowPublicAccess",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function",
      "Condition": {
        "Bool": {
          "lambda:InvokedViaFunctionUrl": "true"
        }
      }
    }
  ]
}
```

**Crie a política baseada em recursos usando o AWS CLI**  
A menos que você use o console ou AWS SAM crie um URL da função com tipo de autenticação `NONE`, você mesmo deve adicionar a política baseada em recursos. Use os seguintes comandos para criar instruções com as permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`. Cada instrução deve ser adicionada em um comando separado.

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeURL \
  --action lambda:InvokeFunctionUrl \
  --principal * \
  --function-url-auth-type NONE
```

```
aws lambda add-permission \
  --function-name UrlTestFunction \
  --statement-id UrlPolicyInvokeFunction \
  --action lambda:InvokeFunction \
  --principal * \
  --invoked-via-function-url
```

**nota**  
Se você excluir um URL da função com o tipo de autenticação `NONE`, o Lambda não excluirá a política baseada em recursos associada a ela. Se quiser excluir essa política, deverá excluí-la manualmente.

Se a política baseada em recursos para uma função não conceder as permissões `lambda:invokeFunctionUrl` e `lambda:InvokeFunction`, os usuários receberão um código de erro 403 Forbidden (Proibido) quando tentarem invocar o URL da função. Isso ocorrerá mesmo se o URL da função usar o tipo de autenticação `NONE`.

## Governança e controle de acesso
<a name="urls-governance"></a>

Além das permissões de invocação de URL de função, você também pode controlar o acesso nas ações usadas para configurar URLs de função. O Lambda é compatível com as seguintes ações da política do IAM para URLs de função:
+ `lambda:InvokeFunctionUrl`: chamar uma função do Lambda usando o URL de função.
+ `lambda:CreateFunctionUrlConfig` – criar um URL de função e definir seu `AuthType`.
+ `lambda:UpdateFunctionUrlConfig` – atualizar a configuração de um URL de função e seu `AuthType`.
+ `lambda:GetFunctionUrlConfig`: visualizar os detalhes de um URL de função.
+ `lambda:ListFunctionUrlConfigs`: listar as configurações de URL de função.
+ `lambda:DeleteFunctionUrlConfig`: excluir um URL de função.

Para permitir ou negar acesso a URLs de função a outras entidades da AWS, inclua essas ações nas políticas do IAM. Por exemplo, a política a seguir concede à função `example` na Conta da AWS `444455556666` permissões para atualizar o URL de função para a função **my-function** na conta `123456789012`.

**Example política de URL de função entre contas**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action": "lambda:UpdateFunctionUrlConfig",
            "Resource": "arn:aws:lambda:us-east-2:123456789012:function:my-function"
        }
    ]
}
```

### Chaves de condição
<a name="urls-condition-keys"></a>

Para ter um controle de acesso refinado sobre os URLs da função, use chaves de contexto de condição. O Lambda é compatível com as seguintes chaves de condição para URLs da função:
+ `lambda:FunctionUrlAuthType`: define um valor de enumerador descrevendo o tipo de autenticação que o URL da função usa. O valor pode ser `AWS_IAM` ou `NONE`.
+ `lambda:InvokedViaFunctionUrl`: restringe a ação `lambda:InvokeFunction` às chamadas feitas por meio do URL da função. Isso garante que a função só possa ser invocada por meio do URL da função e não por meio de outros métodos de invocação. Para exemplos de políticas baseadas em recursos que usam a chave de contexto `lambda:InvokedViaFunctionUrl`, consulte os exemplos em [Usar o tipo de autenticação `AWS_IAM`](#urls-auth-iam) e [Usar o tipo de autenticação `NONE`](#urls-auth-none).

É possível usar essas chaves de contexto em políticas associadas à sua função. Por exemplo, você pode restringir quem pode fazer alterações nas configurações dos URLs de função. Para negar todas as solicitações `UpdateFunctionUrlConfig` a qualquer função com o tipo de autenticação de URL `NONE`, você pode definir a seguinte política:

**Example política de URL de função com negação explícita**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action":[
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "NONE"
                }
            }
        }
    ]
}
```

Para conceder à função `example` na Conta da AWS `444455556666` permissões para fazer solicitações `CreateFunctionUrlConfig` e `UpdateFunctionUrlConfig` em funções com o tipo de autenticação de URL `AWS_IAM`, você pode definir a seguinte política:

**Example política de URL de função com permissão explícita**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": { 
                "AWS": "arn:aws:iam::444455556666:role/example"
            },
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:us-east-1:123456789012:function:*",
            "Condition": {
                "StringEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

Você também pode usar essa chave de condição em uma [política de controle de serviço](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html) (SCP). Use SCPs para gerenciar permissões em toda a organização em AWS Organizations. Por exemplo, para não permitir que usuários criem ou atualizem URLs de função que usem qualquer tipo de autenticação, exceto `AWS_IAM`, use a seguinte política de controle de serviço:

**Example SCP de URL de função com negação explícita**    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action":[
                "lambda:CreateFunctionUrlConfig",
                "lambda:UpdateFunctionUrlConfig"
            ],
            "Resource": "arn:aws:lambda:*:123456789012:function:*",
            "Condition": {
                "StringNotEquals": {
                    "lambda:FunctionUrlAuthType": "AWS_IAM"
                }
            }
        }
    ]
}
```

# Invocar URLs de função do Lambda
<a name="urls-invocation"></a>

Um URL de função é um endpoint HTTP(S) dedicado para a função do Lambda. Você pode criar e configurar um URL de função no console do Lambda ou na API do Lambda.

**dica**  
O Lambda oferece duas maneiras de invocar sua função por meio de um endpoint HTTP: URLs de função e Amazon API Gateway. Se não tiver certeza de qual é o melhor método para seu caso de uso, consulte [Seleção de um método para invocar a função do Lambda usando uma solicitação HTTP](furls-http-invoke-decision.md).

Ao criar um URL de função, o Lambda gera automaticamente um endpoint de URL exclusivo para você. Após a criação de um URL de função, o endpoint de URL nunca muda. Os endpoints de URLs de função têm o seguinte formato:

```
https://<url-id>.lambda-url.<region>.on.aws
```

**nota**  
Os URLs da função não são compatíveis com as seguintes Regiões da AWS: Ásia-Pacífico (Hyderabad) (`ap-south-2`), Ásia-Pacífico (Melbourne) (`ap-southeast-4`), Ásia-Pacífico (Malásia) (`ap-southeast-5`), Ásia-Pacífico (Nova Zelândia) (`ap-southeast-6`), Ásia-Pacífico (Tailândia) (`ap-southeast-7`), Ásia-Pacífico (Taipei) (`ap-east-2`), Oeste do Canadá (Calgary) (`ca-west-1`), Europa (Espanha) (`eu-south-2`), Europa (Zurique) (`eu-central-2`), Israel (Tel Aviv) (`il-central-1`), e Oriente Médio (EAU) (`me-central-1`).

Os URLs de função são habilitados para pilha dupla, sendo compatíveis com IPv4 e IPv6. Após configurar o URL de função, você pode invocar a função por meio de seu endpoint HTTP(S) via um navegador da Web, curl, Postman ou qualquer cliente HTTP. Para invocar um URL da função, você deve ter permissões `lambda:InvokeFunctionUrl` e `lambda:InvokeFunction`. Para obter mais informações, consulte [Controle de acesso](urls-auth.md).

**Topics**
+ [

## Noções básicas sobre invocação de URL de função
](#urls-invocation-basics)
+ [

## Cargas úteis de solicitações e respostas
](#urls-payloads)

## Noções básicas sobre invocação de URL de função
<a name="urls-invocation-basics"></a>

Se o URL de função usar o tipo de autenticação, `AWS_IAM`você deve assinar cada solicitação HTTP usando a \$1[AWS Signature Version 4 (SigV4)](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)\$1. Ferramentas como [Postman](https://quickstarts.postman.com/guide/aws/index.html?index=..%2F..index#2) oferecem maneiras integradas de assinar solicitações com o Sigv4.

Se não usar uma ferramenta para assinar as solicitações HTTP ao URL de função, você deverá assinar manualmente cada solicitação usando o SigV4. Quando o URL de função recebe uma solicitação, o Lambda também analisa a assinatura do Sigv4. O Lambda só processa a solicitação se as assinaturas corresponderem. Para obter instruções sobre como assinar manualmente as solicitações com o SigV4, consulte [Assinar solicitações da AWS com o Signature versão 4](https://docs.aws.amazon.com/general/latest/gr/sigv4_signing.html), no *Guia Referência geral da Amazon Web Services*.

Se o URL de função usar o tipo de autenticação `NONE`, você não precisará assinar as solicitações usando o Sigv4. Você pode invocar a função usando um navegador da Web, curl, Postman ou qualquer cliente HTTP.

Para testar simples solicitações `GET` à função, use um navegador da Web. Por exemplo, se o URL de função for `https://abcdefg.lambda-url.us-east-1.on.aws` e aceitar um parâmetro de string `message`, o URL de solicitação pode ser semelhante a este:

```
https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld
```

Para testar outras solicitações HTTP, como uma solicitação `POST`, você pode usar uma ferramenta como curl. Por exemplo, se quiser incluir alguns dados JSON em uma solicitação `POST` ao URL de função, você poderá usar o seguinte comando curl:

```
curl -v 'https://abcdefg.lambda-url.us-east-1.on.aws/?message=HelloWorld' \
-H 'content-type: application/json' \
-d '{ "example": "test" }'
```

## Cargas úteis de solicitações e respostas
<a name="urls-payloads"></a>

Quando um cliente chama o URL de função, o Lambda mapeia a solicitação para um objeto de evento antes de passá-la para a função. A resposta da função é então mapeada para uma resposta HTTP que o Lambda envia de volta ao cliente por meio do URL de função.

Os formatos de evento de solicitação e resposta seguem o mesmo esquema do [formato de carga útil do Amazon API Gateway versão 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).

### Formato de carga útil de solicitação
<a name="urls-request-payload"></a>

Uma carga útil de solicitação tem a seguinte estrutura:

```
{
  "version": "2.0",
  "routeKey": "$default",
  "rawPath": "/my/path",
  "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
  "cookies": [
    "cookie1",
    "cookie2"
  ],
  "headers": {
    "header1": "value1",
    "header2": "value1,value2"
  },
  "queryStringParameters": {
    "parameter1": "value1,value2",
    "parameter2": "value"
  },
  "requestContext": {
    "accountId": "123456789012",
    "apiId": "<urlid>",
    "authentication": null,
    "authorizer": {
        "iam": {
                "accessKey": "AKIA...",
                "accountId": "111122223333",
                "callerId": "AIDA...",
                "cognitoIdentity": null,
                "principalOrgId": null,
                "userArn": "arn:aws:iam::111122223333:user/example-user",
                "userId": "AIDA..."
        }
    },
    "domainName": "<url-id>.lambda-url.us-west-2.on.aws",
    "domainPrefix": "<url-id>",
    "http": {
      "method": "POST",
      "path": "/my/path",
      "protocol": "HTTP/1.1",
      "sourceIp": "123.123.123.123",
      "userAgent": "agent"
    },
    "requestId": "id",
    "routeKey": "$default",
    "stage": "$default",
    "time": "12/Mar/2020:19:03:58 +0000",
    "timeEpoch": 1583348638390
  },
  "body": "Hello from client!",
  "pathParameters": null,
  "isBase64Encoded": false,
  "stageVariables": null
}
```


| Parameter | Descrição | Exemplo | 
| --- | --- | --- | 
|  `version`  |  A versão do formato de carga útil para esse evento. Atualmente, os URLs de função do Lambda são compatíveis com o [formato de carga útil versão 2.0](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html#http-api-develop-integrations-lambda.proxy-format).  |  `2.0`  | 
|  `routeKey`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `$default` para marcar um espaço reservado.  |  `$default`  | 
|  `rawPath`  |  O caminho da solicitação. Por exemplo, se o URL de solicitação for `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`, o valor do caminho bruto será `/example/test/demo`.  |  `/example/test/demo`  | 
|  `rawQueryString`  |  A string bruta que contém os parâmetros de string de consulta da solicitação. Os caracteres compatíveis incluem `a-z`, `A-Z`, `0-9`, `.`, `_`, `-`, `%`, `&`, `=` e `+`.  |  `"?parameter1=value1&parameter2=value2"`  | 
|  `cookies`  |  Uma matriz contendo todos os cookies enviados como parte da solicitação.  |  `["Cookie_1=Value_1", "Cookie_2=Value_2"]`  | 
|  `headers`  |  A lista de cabeçalhos de solicitação, apresentada como pares chave-valor.  |  `{"header1": "value1", "header2": "value2"}`  | 
|  `queryStringParameters`  |  Os parâmetros de consulta para a solicitação. Por exemplo, se o URL de solicitação for `https://{url-id}.lambda-url.{region}.on.aws/example?name=Jane`, o valor `queryStringParameters` será um objeto JSON com uma chave `name` e um valor `Jane`.  |  `{"name": "Jane"}`  | 
|  `requestContext`  |  Um objeto que contém informações adicionais sobre a solicitação, como o `requestId`, a hora da solicitação e a identidade do chamador se autorizado pelo AWS Identity and Access Management (IAM).  |   | 
|  `requestContext.accountId`  |  O ID da Conta da AWS do proprietário da função.  |  `"123456789012"`  | 
|  `requestContext.apiId`  |  O ID do URL de função.  |  `"33anwqw8fj"`  | 
|  `requestContext.authentication`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `null`.  |  `null`  | 
|  `requestContext.authorizer`  |  Um objeto que contém informações sobre a identidade do chamador, se o URL de função usar o tipo de autenticação `AWS_IAM`. Do contrário, o Lambda define isso como `null`.  |   | 
|  `requestContext.authorizer.iam.accessKey`  |  A chave de acesso da identidade do chamador.  |  `"AKIAIOSFODNN7EXAMPLE"`  | 
|  `requestContext.authorizer.iam.accountId`  |  O ID da Conta da AWS da identidade do chamador.  |  `"111122223333"`  | 
|  `requestContext.authorizer.iam.callerId`  |  O ID (ID do usuário) do chamador.  |  `"AIDACKCEVSQ6C2EXAMPLE"`  | 
|  `requestContext.authorizer.iam.cognitoIdentity`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `null` ou exclui isso do JSON.  |  `null`  | 
|  `requestContext.authorizer.iam.principalOrgId`  |  O ID da organização da entidade principal associado à identidade do chamador.  |  `"AIDACKCEVSQORGEXAMPLE"`  | 
|  `requestContext.authorizer.iam.userArn`  |  O nome do recurso da Amazon (ARN) do usuário da identidade do chamador.  |  `"arn:aws:iam::111122223333:user/example-user"`  | 
|  `requestContext.authorizer.iam.userId`  |  O ID de usuário da identidade do chamador.  |  `"AIDACOSFODNN7EXAMPLE2"`  | 
|  `requestContext.domainName`  |  O nome do domínio do URL de função.  |  `"<url-id>.lambda-url.us-west-2.on.aws"`  | 
|  `requestContext.domainPrefix`  |  O prefixo do domínio do URL de função.  |  `"<url-id>"`  | 
|  `requestContext.http`  |  Um objeto que contém detalhes sobre a solicitação HTTP.  |   | 
|  `requestContext.http.method`  |  O método HTTP usado na solicitação. Os valores válidos incluem `GET`, `POST`, `PUT`, `HEAD`, `OPTIONS`, `PATCH` e `DELETE`.  |  `GET`  | 
|  `requestContext.http.path`  |  O caminho da solicitação. Por exemplo, se o URL de solicitação for `https://{url-id}.lambda-url.{region}.on.aws/example/test/demo`, o valor do caminho será `/example/test/demo`.  |  `/example/test/demo`  | 
|  `requestContext.http.protocol`  |  O protocolo da solicitação.  |  `HTTP/1.1`  | 
|  `requestContext.http.sourceIp`  |  O endereço IP de origem da conexão TCP imediata que está fazendo a solicitação.  |  `123.123.123.123`  | 
|  `requestContext.http.userAgent`  |  O valor do cabeçalho da solicitação User-Agent.  |  `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Gecko/20100101 Firefox/42.0`  | 
|  `requestContext.requestId`  |  O ID da solicitação da invocação. Você pode usar esse ID para logs de invocações relacionadas à função.  |  `e1506fd5-9e7b-434f-bd42-4f8fa224b599`  | 
|  `requestContext.routeKey`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `$default` para marcar um espaço reservado.  |  `$default`  | 
|  `requestContext.stage`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `$default` para marcar um espaço reservado.  |  `$default`  | 
|  `requestContext.time`  |  O timestamp da solicitação.  |  `"07/Sep/2021:22:50:22 +0000"`  | 
|  `requestContext.timeEpoch`  |  O timestamp da solicitação, no horário da era UNIX.  |  `"1631055022677"`  | 
|  `body`  |  O corpo da solicitação. Se o tipo de conteúdo da solicitação for binário, o corpo será codificado na base 64.  |  `{"key1": "value1", "key2": "value2"}`  | 
|  `pathParameters`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `null` ou exclui isso do JSON.  |  `null`  | 
|  `isBase64Encoded`  |  `TRUE` se o corpo for uma carga útil binária e for codificado na base 64. `FALSE` nos demais casos.  |  `FALSE`  | 
|  `stageVariables`  |  URLs de função não usam esse parâmetro. O Lambda define isso como `null` ou exclui isso do JSON.  |  `null`  | 

### Formato de carga útil de resposta
<a name="urls-response-payload"></a>

Quando a função retorna uma resposta, o Lambda analisa a resposta e converte-a em uma resposta HTTP. As cargas úteis de resposta de função têm o seguinte formato:

```
{
   "statusCode": 201,
    "headers": {
        "Content-Type": "application/json",
        "My-Custom-Header": "Custom Value"
    },
    "body": "{ \"message\": \"Hello, world!\" }",
    "cookies": [
        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",
        "Cookie_2=Value2; Max-Age=78000"
    ],
    "isBase64Encoded": false
}
```

O Lambda infere o formato de resposta para você. Se a função do Lambda retornar JSON válido e não retornar um `statusCode`, o Lambda pressupõe o seguinte:
+ `statusCode` is `200`.
**nota**  
Os `statusCode` válidos vão de 100 a 599.
+ `content-type` is `application/json`.
+ `body` é a resposta da função.
+ `isBase64Encoded` is `false`.

Os exemplos a seguir mostram como a saída da função do Lambda é mapeada para a carga útil da resposta e como a carga útil da resposta é mapeada para a resposta HTTP final. Quando o cliente invoca o URL de função, ele vê a resposta HTTP.

**Exemplo de saída para uma resposta de string**


| Saída da função do Lambda | Saída de resposta interpretada | Resposta HTTP (o que o cliente vê) | 
| --- | --- | --- | 
|  <pre>"Hello, world!"</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": "Hello, world!",<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 15<br /><br />"Hello, world!"</pre>  | 

**Exemplo de saída para uma resposta em JSON**


| Saída da função do Lambda | Saída de resposta interpretada | Resposta HTTP (o que o cliente vê) | 
| --- | --- | --- | 
|  <pre>{<br />  "message": "Hello, world!"<br />}</pre>  |  <pre>{<br />  "statusCode": 200,<br />  "body": {<br />    "message": "Hello, world!"<br />  },<br />  "headers": {<br />    "content-type": "application/json"<br />  },<br />  "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 200<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 34<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

**Exemplo de saída para uma resposta personalizada**


| Saída da função do Lambda | Saída de resposta interpretada | Resposta HTTP (o que o cliente vê) | 
| --- | --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

### Cookies
<a name="urls-cookies"></a>

Para retornar cookies da função, não adicione manualmente cabeçalhos `set-cookie`. Em vez disso, inclua os cookies no objeto de carga útil da resposta. O Lambda interpreta isso automaticamente e adiciona-os como cabeçalhos `set-cookie` na resposta HTTP, como no exemplo a seguir.


| Saída da função do Lambda | Resposta HTTP (o que o cliente vê) | 
| --- | --- | 
|  <pre>{<br />   "statusCode": 201,<br />    "headers": {<br />        "Content-Type": "application/json",<br />        "My-Custom-Header": "Custom Value"<br />    },<br />    "body": JSON.stringify({<br />        "message": "Hello, world!"<br />    }),<br />    "cookies": [<br />        "Cookie_1=Value1; Expires=21 Oct 2021 07:48 GMT",<br />        "Cookie_2=Value2; Max-Age=78000"<br />    ],<br />    "isBase64Encoded": false<br />}</pre>  |  <pre>HTTP/2 201<br />date: Wed, 08 Sep 2021 18:02:24 GMT<br />content-type: application/json<br />content-length: 27<br />my-custom-header: Custom Value<br />set-cookie: Cookie_1=Value2; Expires=21 Oct 2021 07:48 GMT<br />set-cookie: Cookie_2=Value2; Max-Age=78000<br /><br />{<br />  "message": "Hello, world!"<br />}</pre>  | 

# Monitorar URLs de função do Lambda
<a name="urls-monitoring"></a>

Você pode usar o AWS CloudTrail e o Amazon CloudWatch para monitorar os URLs de função.

**Topics**
+ [

## Monitorar URLs de função com o CloudTrail
](#urls-cloudtrail)
+ [

## Métricas do CloudWatch para URLs de função
](#urls-cloudwatch)

## Monitorar URLs de função com o CloudTrail
<a name="urls-cloudtrail"></a>

Para URLs de função, o Lambda é automaticamente compatível com o registro das seguintes operações de API como eventos nos arquivos de log do CloudTrail:
+ [CreateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunctionUrlConfig.html)
+ [UpdateFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionUrlConfig.html)
+ [DeleteFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteFunctionUrlConfig.html)
+ [GetFunctionUrlConfig](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionUrlConfig.html)
+ [ListFunctionUrlConfigs](https://docs.aws.amazon.com/lambda/latest/api/API_ListFunctionUrlConfigs.html)

Toda entrada de log contém informações sobre a identidade do chamador, quando a solicitação foi feita e outros detalhes. Você pode ver todos os eventos nos últimos 90 dias visualizando o **Event history** (Histórico de eventos) do CloudTrail. Para reter registros por mais de 90 dias, você pode criar uma trilha.

Por padrão, o CloudTrail não registra solicitações `InvokeFunctionUrl`, que são consideradas eventos de dados. Porém, você pode ativar o registro de eventos de dados no CloudTrail. Para obter mais informações, consulte [Registro eventos de dados em logs para trilhas](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/logging-data-events-with-cloudtrail.html) no *Guia do usuário do AWS CloudTrail*.

## Métricas do CloudWatch para URLs de função
<a name="urls-cloudwatch"></a>

O Lambda envia métricas agregadas sobre solicitações de URL de função para o CloudWatch. Com essas métricas, você pode monitorar os URLs de função, criar painéis e configurar alarmes no console do CloudWatch.

Os URLs de função são compatíveis as seguintes métricas de invocação. Recomendamos visualizar essas métricas com a estatística `Sum`.
+ `UrlRequestCount`: o número de solicitações feitas a esse URL de função.
+ `Url4xxCount`: o número de solicitações que retornaram um código de status HTTP 4XX. Os códigos da série 4XX indicam erros do lado do cliente, como solicitações incorretas.
+ `Url5xxCount`: o número de solicitações que retornaram um código de status HTTP 5XX. Os códigos da série 5XX indicam erros do lado do servidor, como erros de função e de tempo limite.

Os URLs de função também são compatíveis com a métrica de performance a seguir. Recomendamos visualizar essas métricas com as estatísticas `Average` ou `Max`.
+ `UrlRequestLatency`: o tempo decorrido entre a hora que o URL de função recebe uma solicitação e a hora que o URL de função retorna uma resposta.

Cada uma dessas métricas de invocação e performance é compatível com as seguintes dimensões:
+ `FunctionName`: visualizar as métricas agregadas para os URLs de função atribuídos a uma versão da função não publicada `$LATEST` ou para qualquer um dos aliases da função. Por exemplo, `hello-world-function`.
+ `Resource`: visualizar as métricas para um URL de função específico. Isso é definido por um nome de função, junto com a versão da função não publicada `$LATEST` ou um dos aliases da função. Por exemplo, `hello-world-function:$LATEST`.
+ `ExecutedVersion`: visualizar as métricas para um URL de função específico com base na versão executada. Você pode usar essa dimensão principalmente para rastrear o URL de função atribuído à versão não publicada `$LATEST`.

# Seleção de um método para invocar a função do Lambda usando uma solicitação HTTP
<a name="furls-http-invoke-decision"></a>

Muitos casos de uso comuns do Lambda envolvem invocar a função usando uma solicitação HTTP. Por exemplo, você pode querer que uma aplicação Web invoque sua função por meio de uma solicitação do navegador. As funções do Lambda também podem ser usadas para criar APIs REST completas, lidar com interações do usuário em aplicativos móveis, processar dados de serviços externos por meio de chamadas HTTP ou criar webhooks personalizados.

As seções a seguir explicam quais são as opções para invocar o Lambda por meio de HTTP e fornecem informações para que você tome a decisão certa para seu caso de uso específico.

## Quais são suas opções ao selecionar um método de invocação HTTP?
<a name="w2aac39c81c73b9"></a>

O Lambda oferece dois métodos principais para invocar uma função usando uma solicitação HTTP: [URLs de função](urls-configuration.md) e o [API Gateway](services-apigateway.md). As principais diferenças entre ambos são as duas opções seguintes:
+ Os **URLs de função do Lambda** fornecem um endpoint HTTP simples e direto para uma função do Lambda. Eles são otimizados para proporcionar simplicidade e economia e fornecem o caminho mais rápido para expor uma função do Lambda via HTTP.
+ O **API Gateway** é um serviço mais avançado para criar APIs completas. O API Gateway é otimizado para criar e gerenciar APIs de produção em grande escala e fornece ferramentas abrangentes para segurança, monitoramento e gerenciamento de tráfego.

## Recomendações se você já conhece seus requisitos
<a name="w2aac39c81c73c11"></a>

Se você já sabe quais são seus requisitos, estas são as nossas recomendações básicas:

Recomendamos usar os **[URLs de funções](urls-configuration.md)** para aplicações simples ou prototipagem em que você só precisa de métodos básicos de autenticação e tratamento de solicitações/respostas e onde deseja ter o mínimo de custo e a complexidade.

O **[API Gateway](services-apigateway.md)** é a melhor opção para aplicações de produção em grande escala ou para casos em que você precisa de recursos mais avançados, como suporte à [descrição de OpenAPI](https://www.openapis.org/), opções de autenticação, nomes de domínio personalizados ou tratamento avançado de solicitações/respostas, incluindo controle de utilização, armazenamento em cache e transformação de solicitação/resposta.

## O que considerar ao selecionar um método para invocar a função do Lambda
<a name="w2aac39c81c73c13"></a>

Ao selecionar entre URLs de função e o API Gateway, você precisa considerar os seguintes fatores:
+ Suas necessidades de autenticação, como se você precisa do OAuth ou do Amazon Cognito para autenticar usuários
+ Seus requisitos de escalabilidade e a complexidade da API que deseja implementar
+ Se você precisa de recursos avançados, como validação de solicitação e formatação de solicitação/resposta
+ Seus requisitos de monitoramento
+ Suas metas de custo

Ao compreender esses fatores, você pode selecionar a opção que melhor equilibra seus requisitos de segurança, complexidade e custo.

As informações a seguir resumem as principais diferenças entre as duas opções.

### Autenticação
<a name="w2aac39c81c73c13c11b1"></a>
+ Os **URLs de função** fornecem opções básicas de autenticação por meio do AWS Identity and Access Management (IAM). Você pode configurar seus endpoints para serem públicos (sem autenticação) ou para exigirem a autenticação do IAM. Com a autenticação do IAM, você pode usar credenciais padrão da AWS ou perfis do IAM para controlar o acesso. Embora seja simples de configurar, essa abordagem oferece opções limitadas em comparação a outros métodos de autenticação.
+ O **API Gateway** fornece acesso a uma variedade maior de opções de autenticação. Além da autenticação do IAM, você pode usar [autorizadores do Lambda](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (lógica de autenticação personalizada), grupos de usuários do [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) e fluxos do OAuth2.0. Essa flexibilidade permite que você implemente esquemas complexos de autenticação, incluindo provedores de autenticação terceirizados, autenticação baseada em tokens e autenticação multifator.

### Tratamento de solicitação/resposta
<a name="w2aac39c81c73c13c11b3"></a>
+ Os **URLs de função** fornecem tratamento básico para solicitações e respostas HTTP. Eles são compatíveis com métodos HTTP padrão e incluem suporte integrado para compartilhamento de recursos de origem cruzada (CORS). Embora consigam lidar com cargas úteis JSON e parâmetros de consulta naturalmente, eles não oferecem recursos de transformação ou validação de solicitações. O tratamento de respostas é igualmente simples: o cliente recebe a resposta da sua função do Lambda exatamente como o Lambda a retorna.
+ O **API Gateway** fornece recursos sofisticados de tratamento de solicitações e respostas. Você pode definir validadores de solicitações, transformar solicitações e respostas usando modelos de mapeamento, configurar cabeçalhos de solicitação/resposta e implementar o armazenamento em cache de respostas. O API Gateway também oferece suporte a cargas úteis binárias e nomes de domínio personalizados e pode modificar as respostas antes que elas cheguem ao cliente. Você pode configurar modelos para validação e transformação de solicitação/resposta usando o esquema JSON.

### Escalabilidade
<a name="w2aac39c81c73c13c11b5"></a>
+ Os **URLs de funções** escalam diretamente com os limites de simultaneidade da sua função do Lambda e lidam com picos de tráfego escalando sua função até o limite máximo de simultaneidade configurado. Quando esse limite é atingido, o Lambda responde a solicitações adicionais com respostas HTTP 429. Não há um mecanismo de enfileiramento integrado, portanto, lidar com a escalabilidade depende inteiramente da configuração da sua função do Lambda. Por padrão, as funções do Lambda têm um limite de mil execuções simultâneas por Região da AWS.
+ O **API Gateway** fornece recursos adicionais de escalabilidade além da própria escalabilidade do Lambda. Ele inclui recursos integrados de enfileiramento e controle de utilização, permitindo que você gerencie os picos de tráfego com mais tranquilidade. Por padrão, o API Gateway pode lidar com até 10 mil solicitações por segundo por região, com uma capacidade de expansão de 5 mil solicitações por segundo. Ele também fornece ferramentas para solicitações de controle de utilização em diferentes níveis (API, estágio ou método) para proteger seu backend.

### Monitoramento
<a name="w2aac39c81c73c13c11b7"></a>
+ Os **URLs de funções** oferecem monitoramento básico por meio de métricas do Amazon CloudWatch, incluindo contagem de solicitações, latência e taxas de erro. Você tem acesso às métricas e logs padrão do Lambda, que mostram as solicitações brutas que chegam à sua função. Embora isso forneça visibilidade operacional essencial, as métricas se concentram principalmente na execução da função.
+ O **API Gateway** fornece recursos abrangentes de monitoramento, incluindo métricas detalhadas, geração de logs e opções de rastreamento. Você pode monitorar chamadas de API, latência, taxas de erro e taxas de acerto/erro de cache por meio do CloudWatch. O API Gateway também se integra ao AWS X-Ray para rastreamento distribuído e fornece formatos de logs personalizáveis.

### Custo
<a name="w2aac39c81c73c13c11b9"></a>
+ Os **URLs de funções** seguem o modelo de preços padrão do Lambda: você paga somente pelas invocações de funções e pelo tempo de computação. Não há cobranças adicionais pelo endpoint do URL em si. Isso o torna uma opção econômica para APIs simples ou aplicações com pouco tráfego, caso você não precise dos recursos adicionais do API Gateway.
+ O **API Gateway** oferece um [nível gratuito](https://aws.amazon.com/api-gateway/pricing/#Free_Tier) que inclui um milhão de chamadas de API recebidas para APIs REST e um milhão de chamadas de API recebidas para APIs HTTP. Depois disso, o API Gateway cobra por chamadas de API, transferência de dados e armazenamento em cache (se habilitado). Consulte a [página de preços](https://aws.amazon.com/api-gateway/pricing/) do API Gateway para entender os custos do seu próprio caso de uso.

### Outros recursos
<a name="w2aac39c81c73c13c11c11"></a>
+ Os **URLs de funções** são projetados para oferecer simplicidade e integração direta com o Lambda. Eles são compatíveis com endpoints HTTP e HTTPS, oferecem suporte CORS integrado e fornecem endpoints de pilha dupla (IPv4 e IPv6). Embora não tenham recursos avançados, eles se destacam em cenários em que você precisa de uma forma rápida e direta de expor as funções do Lambda via HTTP.
+ O **API Gateway** inclui vários recursos adicionais, como versionamento de API, gerenciamento de estágios, chaves de API para planos de uso, documentação de API por meio do Swagger/OpenAPI, APIs de WebSocket, APIs privadas em uma VPC e integração com WAF para segurança extra. Ele também oferece suporte a implantações canário, integrações simuladas para testes e integração com outros Serviços da AWS além do Lambda.

## Seleção de um método para invocar a função do Lambda
<a name="w2aac39c81c73c15"></a>

Agora que você conhece os critérios para escolher entre URLs de funções do Lambda e o API Gateway, bem como as principais diferenças entre eles, você poderá selecionar a opção que melhor atende às suas necessidades e usar os recursos a seguir para ajudar a começar a usá-la.

------
#### [ Function URLs ]

**Conceitos básicos para usar URLs de funções com os recursos abaixo**
+ Siga o tutorial [Criar uma função do Lambda com um URL de função](urls-webhook-tutorial.md)
+ Saiba mais sobre URLs de funções no capítulo [Criar e gerenciar URLs de função do Lambda](urls-configuration.md) deste guia
+ Experimente o tutorial guiado no console **Criar um aplicativo Web simples** fazendo o seguinte:

1. Abra a [página de funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Abra o painel de ajuda escolhendo o ícone no canto superior direito da tela.  
![\[\]](http://docs.aws.amazon.com/pt_br/lambda/latest/dg/images/console_help_screenshot.png)

1. Selecione **Tutoriais**.

1. Em **Criar um aplicativo Web simples**, escolha **Iniciar tutorial**.

------
#### [ API Gateway ]

**Conceitos básicos para usar o Lambda e o API Gateway com os recursos abaixo**
+ Siga o tutorial [Uso do Lambda com API Gateway](services-apigateway-tutorial.md) para criar uma API REST integrada a uma função do Lambda de backend.
+ Saiba mais sobre os diferentes tipos de API oferecidos pelo API Gateway nas seguintes seções do *Guia do desenvolvedor do Amazon API Gateway*:
  + [APIs REST do API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [APIs HTTP do API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [APIs de WebSocket do API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ Experimente um ou mais dos exemplos na seção [Tutoriais e workshops](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) do *Guia do desenvolvedor do Amazon API Gateway*.

------

# Tutorial: criar um endpoint de webhook usando um URL de função do Lambda
<a name="urls-webhook-tutorial"></a>

Neste tutorial, você cria um URL de função do Lambda para implementar um endpoint de webhook. Um webhook é uma comunicação leve e orientada por eventos que envia dados automaticamente entre aplicações usando HTTP. Você pode usar um webhook para receber atualizações imediatas sobre eventos que acontecem em outro sistema, como quando um novo cliente se cadastra em um site, um pagamento é processado ou um arquivo é carregado.

Com o Lambda, os webhooks podem ser implementados usando URLs de funções do Lambda ou API Gateway. URLs de funções são uma boa opção para webhooks simples que não exigem atributos como autorização avançada ou validação de solicitações.

**dica**  
Se não tiver certeza de qual é a melhor solução para seu caso de uso, consulte [Seleção de um método para invocar a função do Lambda usando uma solicitação HTTP](furls-http-invoke-decision.md).

## Pré-requisitos
<a name="urls-webhook-tutorial-prereqs"></a>

Para concluir este tutorial, você deve ter Python (versão 3.8 ou posterior) ou Node.js (versão 18 ou posterior) instalado em sua máquina local.

Para testar o endpoint usando uma solicitação HTTP, o tutorial usa [curl](https://curl.se/), uma ferramenta de linha de comando que você pode usar para transferir dados usando vários protocolos de rede. Consulte a [documentação do curl](https://curl.se/docs/install.html) para saber como instalar a ferramenta, caso ainda não o tenha.

## Criar a função do Lambda
<a name="urls-webhook-tutorial-function"></a>

Primeiro, crie a função do Lambda que será executada quando uma solicitação HTTP for enviada para seu endpoint de webhook. Neste exemplo, a aplicação de envio envia uma atualização sempre que um pagamento é enviado e indica no corpo da solicitação HTTP se o pagamento foi bem-sucedido. A função do Lambda analisa a solicitação e age de acordo com o status do pagamento. Neste exemplo, o código apenas imprime o ID do pedido para o pagamento, mas em uma aplicação real, você pode adicionar o pedido a um banco de dados ou enviar uma notificação.

A função também implementa o método de autenticação mais comum usado para webhooks, a autenticação de mensagens baseada em hash (HMAC). Com esse método, as aplicações de envio e recebimento compartilham uma chave secreta. A aplicação de envio usa um algoritmo de hash para gerar uma assinatura exclusiva usando essa chave junto com o conteúdo da mensagem e inclui a assinatura na solicitação do webhook como um cabeçalho HTTP. A aplicação recebedora então repete essa etapa, gerando a assinatura usando a chave secreta, e compara o valor resultante com a assinatura enviada no cabeçalho da solicitação. Se o resultado corresponder, a solicitação será considerada legítima. 

Crie a função usando o console do Lambda com o runtime do Python ou do Node.js.

------
#### [ Python ]

**Criar a função do Lambda**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Crie uma função básica "Hello world" fazendo o seguinte:

   1. Escolha a opção **Criar função**.

   1. Selecione **Criar do zero**.

   1. Em **Function name** (Nome da função), insira **myLambdaWebhook**.

   1. Em **Runtime**, escolha **Python3.14**.

   1. Escolha a opção **Criar função**.

1. No painel **Código-fonte**, substitua o código existente copiando e colando o seguinte:

   ```
   import json
   import hmac
   import hashlib
   import os
   
   def lambda_handler(event, context):
       
       # Get the webhook secret from environment variables
       webhook_secret = os.environ['WEBHOOK_SECRET']
       
       # Verify the webhook signature
       if not verify_signature(event, webhook_secret):
           return {
               'statusCode': 401,
               'body': json.dumps({'error': 'Invalid signature'})
           }
       
       try:
           # Parse the webhook payload
           payload = json.loads(event['body'])
           
           # Handle different event types
           event_type = payload.get('type')
           
           if event_type == 'payment.success':
               # Handle successful payment
               order_id = payload.get('orderId')
               print(f"Processing successful payment for order {order_id}")
               
               # Add your business logic here
               # For example, update database, send notifications, etc.
               
           elif event_type == 'payment.failed':
               # Handle failed payment
               order_id = payload.get('orderId')
               print(f"Processing failed payment for order {order_id}")
               
               # Add your business logic here
               
           else:
               print(f"Received unhandled event type: {event_type}")
           
           # Return success response
           return {
               'statusCode': 200,
               'body': json.dumps({'received': True})
           }
           
       except json.JSONDecodeError:
           return {
               'statusCode': 400,
               'body': json.dumps({'error': 'Invalid JSON payload'})
           }
       except Exception as e:
           print(f"Error processing webhook: {e}")
           return {
               'statusCode': 500,
               'body': json.dumps({'error': 'Internal server error'})
           }
   
   def verify_signature(event, webhook_secret):
       """
       Verify the webhook signature using HMAC
       """
       try:
           # Get the signature from headers
           signature = event['headers'].get('x-webhook-signature')
   
           if not signature:
               print("Error: Missing webhook signature in headers")
               return False
           
           # Get the raw body (return an empty string if the body key doesn't exist)
           body = event.get('body', '')
           
           # Create HMAC using the secret key
           expected_signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
           
           # Compare the expected signature with the received signature to authenticate the message
           is_valid = hmac.compare_digest(signature, expected_signature)
           if not is_valid:
               print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}")
               return False
               
           return True
       except Exception as e:
           print(f"Error verifying signature: {e}")
           return False
   ```

1. Na seção **DEPLOY**, escolha **Implantar** para atualizar o código da função.

------
#### [ Node.js ]

**Criar a função do Lambda**

1. Abra a [página Funções](https://console.aws.amazon.com/lambda/home#/functions) do console do Lambda.

1. Crie uma função básica "Hello world" fazendo o seguinte:

   1. Escolha a opção **Criar função**.

   1. Selecione **Criar do zero**.

   1. Em **Function name** (Nome da função), insira **myLambdaWebhook**.

   1. Em **Runtime**, selecione **nodejs24.x**.

   1. Escolha a opção **Criar função**.

1. No painel **Código-fonte**, substitua o código existente copiando e colando o seguinte:

   ```
   import crypto from 'crypto';
   
   export const handler = async (event, context) => {
       // Get the webhook secret from environment variables
       const webhookSecret = process.env.WEBHOOK_SECRET;
   
       // Verify the webhook signature
       if (!verifySignature(event, webhookSecret)) {
           return {
               statusCode: 401,
               body: JSON.stringify({ error: 'Invalid signature' })
           };
       }
   
       try {
           // Parse the webhook payload
           const payload = JSON.parse(event.body);
   
           // Handle different event types
           const eventType = payload.type;
   
           switch (eventType) {
               case 'payment.success': {
                   // Handle successful payment
                   const orderId = payload.orderId;
                   console.log(`Processing successful payment for order ${orderId}`);
   
                   // Add your business logic here
                   // For example, update database, send notifications, etc.
                   break;
               }
   
               case 'payment.failed': {
                   // Handle failed payment
                   const orderId = payload.orderId;
                   console.log(`Processing failed payment for order ${orderId}`);
   
                   // Add your business logic here
                   break;
               }
   
               default:
                   console.log(`Received unhandled event type: ${eventType}`);
           }
   
           // Return success response
           return {
               statusCode: 200,
               body: JSON.stringify({ received: true })
           };
   
       } catch (error) {
           if (error instanceof SyntaxError) {
               // Handle JSON parsing errors
               return {
                   statusCode: 400,
                   body: JSON.stringify({ error: 'Invalid JSON payload' })
               };
           }
   
           // Handle all other errors
           console.error('Error processing webhook:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({ error: 'Internal server error' })
           };
       }
   };
   
   // Verify the webhook signature using HMAC
   
   const verifySignature = (event, webhookSecret) => {
       try {
           // Get the signature from headers
           const signature = event.headers['x-webhook-signature'];
     
           if (!signature) {
               console.log('No signature found in headers:', event.headers);
               return false;
           }
     
           // Get the raw body (return an empty string if the body key doesn't exist)
           const body = event.body || '';
     
           // Create HMAC using the secret key
           const hmac = crypto.createHmac('sha256', webhookSecret);
           const expectedSignature = hmac.update(body).digest('hex');
     
           // Compare expected and received signatures
           const isValid = signature === expectedSignature;
           if (!isValid) {
               console.log(`Invalid signature. Received: ${signature}, Expected: ${expectedSignature}`);
               return false;
           }
           
           return true;
       } catch (error) {
           console.error('Error during signature verification:', error);
           return false;
       }
     };
   ```

1. Na seção **DEPLOY**, escolha **Implantar** para atualizar o código da função.

------

## Criar a chave secreta
<a name="urls-webhook-tutorial-key"></a>

Para que a função do Lambda autentique a solicitação do webhook, ela usa uma chave secreta que compartilha com a aplicação de chamada. Neste exemplo, a chave é armazenada em um variável de ambiente. Não inclua informações confidenciais, como senhas, no código de função, em uma aplicação em produção. Em vez disso, [crie um segredo do AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) e [use a extensão do Lambda AWS Parameters and Secrets](with-secrets-manager.md) para recuperar suas credenciais na função do Lambda.

**Criar e armazenar a chave secreta do webhook**

1. Gere uma string longa e aleatória usando um gerador de números aleatórios criptograficamente seguro. Você pode usar os seguintes trechos de código em Python ou Node.js para gerar e imprimir um segredo de 32 caracteres, ou usar seu próprio método preferido.

------
#### [ Python ]

**Example código para gerar um segredo**  

   ```
   import secrets
   webhook_secret = secrets.token_urlsafe(32)
   print(webhook_secret)
   ```

------
#### [ Node.js ]

**Example código para gerar um segredo (formato de módulo ES)**  

   ```
   import crypto from 'crypto';
   let webhookSecret = crypto.randomBytes(32).toString('base64');
   console.log(webhookSecret)
   ```

------

1. Armazene sua string gerada como uma variável de ambiente para sua função fazendo o seguinte:

   1. Na guia **Configurações** para sua função, selecione **Variáveis de ambiente**.

   1. Escolha **Editar**.

   1. Escolha **Add environment variable (Adicionar variável de ambiente)**.

   1. Para **Chave**, insira **WEBHOOK\$1SECRET**, e para **Valor**, insira o segredo que você gerou na etapa anterior.

   1. Escolha **Salvar**.

Você precisará usar esse segredo novamente em outro momento no tutorial para testar sua função, então anote-o agora.

## Criar o endpoint do URL da função
<a name="urls-webhook-tutorial-furl"></a>

Criar um endpoint para seu webhook usando um URL da função do Lambda. Como você usa o tipo de autenticação `NONE` para criar um endpoint com acesso público, qualquer pessoa com o URL pode invocar sua função. Para saber mais sobre como controlar o acesso aos URLs das funções, consulte [Controlar o acesso aos URLs de função do Lambda](urls-auth.md). Se você precisar de opções de autenticação mais avançadas para seu webhook, considere usar o API Gateway.

**Criar o endpoint do URL da função**

1. Na guia **Configuração** para sua função, selecione **URL da função**.

1. Escolha **Create function URL** (Criar URL de função).

1. Para **Tipo de autenticação**, selecione **NONE**.

1. Escolha **Salvar**.

O endpoint do URL da função que você acabou de criar é exibido no painel **URL da função**. Copie o endpoint para usar posteriormente no tutorial.

## Testar a função no console
<a name="urls-webhook-tutorial-test-console"></a>

Antes de usar uma solicitação HTTP para invocar sua função usando o endpoint do URL, teste-a no console para confirmar se o código está funcionando conforme o esperado.

Para verificar a função no console, primeiro calcule uma assinatura de webhook usando o segredo gerado anteriormente no tutorial com a seguinte carga útil JSON de teste:

```
{
    "type": "payment.success", 
    "orderId": "1234",
    "amount": "99.99"
}
```

Use um dos exemplos de código Python ou Node.js a seguir para calcular a assinatura do webhook usando seu próprio segredo.

------
#### [ Python ]

**Calcular a assinatura do webhook**

1. Salve o código a seguir como um arquivo chamado `calculate_signature.py`. Substitua o segredo do webhook no código pelo seu próprio valor.

   ```
   import secrets
   import hmac
   import json
   import hashlib
   
   webhook_secret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   
   body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"})
   
   signature = hmac.new(
               webhook_secret.encode('utf-8'),
               body.encode('utf-8'),
               hashlib.sha256
           ).hexdigest()
   
   print(signature)
   ```

1. Calcule a assinatura executando o comando a seguir no diretório onde você salvou o código. Copie a assinatura que o código gera.

   ```
   python calculate_signature.py
   ```

------
#### [ Node.js ]

**Calcular a assinatura do webhook**

1. Salve o código a seguir como um arquivo chamado `calculate_signature.mjs`. Substitua o segredo do webhook no código pelo seu próprio valor.

   ```
   import crypto from 'crypto';
   
   const webhookSecret = "arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M"
   const body = "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}";
   
   let hmac = crypto.createHmac('sha256', webhookSecret);
   let signature = hmac.update(body).digest('hex');
   
   console.log(signature);
   ```

1. Calcule a assinatura executando o comando a seguir no diretório onde você salvou o código. Copie a assinatura que o código gera.

   ```
   node calculate_signature.mjs
   ```

------

Agora você pode testar o código da função usando uma solicitação HTTP de teste no console.

**Testar a função no console**

1. Selecione a guia **Code** para sua função.

1. Na seção **TEST EVENTS**, selecione **Create new test event**

1. Em **Event Name (Nome do evento)**, insira **myEvent**.

1. Substitua o JSON existente copiando e colando o seguinte no painel **JSON do evento**. Substitua a assinatura do webhook pelo valor calculado na etapa anterior.

   ```
   {
     "headers": {
       "Content-Type": "application/json",
       "x-webhook-signature": "2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a"
     },
     "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}"
   }
   ```

1. Escolha **Salvar**.

1. Escolha **Invoke (Invocar)**.

   Você deve ver uma saída semelhante a:

------
#### [ Python ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\": true}"
   }
   
   Function Logs:
   START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST
   Processing successful payment for order 1234
   END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6
   REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6	Duration: 1.55 ms	Billed Duration: 2 ms	Memory Size: 128 MB	Max Memory Used: 36 MB	Init Duration: 136.32 ms
   ```

------
#### [ Node.js ]

   ```
   Status: Succeeded
   Test Event Name: myEvent
   
   Response:
   {
     "statusCode": 200,
     "body": "{\"received\":true}"
   }
   
   Function Logs:
   START RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 Version: $LATEST
   2025-01-10T18:05:42.062Z	e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	INFO	Processing successful payment for order 1234
   END RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   REPORT RequestId: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4	Duration: 60.10 ms	Billed Duration: 61 ms	Memory Size: 128 MB	Max Memory Used: 72 MB	Init Duration: 174.46 ms
   
   Request ID: e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4
   ```

------

## Testar a função usando uma solicitação HTTP
<a name="urls-webhook-tutorial-test-curl"></a>

Use a ferramenta de linha de comando curl para testar seu endpoint de webhook.

**Testar a função usando solicitações HTTP**

1. Em um terminal ou programa shell, execute o seguinte comando curl. Substitua o URL pelo valor do endpoint do URL da sua própria função e substitua a assinatura do webhook pela assinatura que você calculou usando sua própria chave secreta.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   A seguinte saída deverá ser mostrada:

   ```
   {"received": true}
   ```

1. Inspecione os logs do CloudWatch da sua função para confirmar se ela analisou a carga útil corretamente, fazendo o seguinte:

   1. No console do Amazon CloudWatch, abra a página [Grupo de logs](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups).

   1. Selecione o grupo de logs da função (`/aws/lambda/myLambdaWebhook`).

   1. Selecione o stream de logs mais recente.

      Você deve ver uma saída semelhante à seguinte nos logs da sua função:

------
#### [ Python ]

      ```
      Processing successful payment for order 1234
      ```

------
#### [ Node.js ]

      ```
      2025-01-10T18:05:42.062Z e54fe6c7-1df9-4f05-a4c4-0f71cacd64f4 INFO Processing successful payment for order 1234
      ```

------

1. Confirme se seu código detecta uma assinatura inválida executando o seguinte comando curl. Substitua o URL pelo endpoint do URL da sua própria função.

   ```
   curl -X POST https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/ \
   -H "Content-Type: application/json" \
   -H "x-webhook-signature: abcdefg" \
   -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'
   ```

   A seguinte saída deverá ser mostrada:

   ```
   {"error": "Invalid signature"}
   ```

## Limpe os recursos
<a name="urls-webhook-tutorial-cleanup"></a>

Agora você pode excluir os recursos criados para este tutorial, a menos que queira mantê-los. Excluindo os recursos da AWS que você não está mais usando, você evita cobranças desnecessárias em sua Conta da AWS.

**Como excluir a função do Lambda**

1. Abra a página [Functions](https://console.aws.amazon.com/lambda/home#/functions) (Funções) no console do Lambda.

1. Selecione a função que você criou.

1. Selecione **Actions**, **Delete**.

1. Digite **confirm** no campo de entrada de texto e escolha **Delete** (Excluir).

Quando você cria uma função do Lambda no console, o Lambda também cria um [perfil de execução](lambda-intro-execution-role.md) para essa função.

**Para excluir a função de execução**

1. Abra a página [Roles](https://console.aws.amazon.com/iam/home#/roles) (Funções) no console do IAM.

1. Selecione o perfil de execução que o Lambda criou. O perfil tem o formato de nome `myLambdaWebhook-role-<random string>`.

1. Escolha **Excluir**.

1. Insira o nome do perfil no campo de entrada de texto e escolha **Delete** (Excluir).