

# Invocar funções do Lambda com notificações do Amazon SNS
<a name="with-sns"></a>

Você pode usar uma função do Lambda para processar notificações do Amazon Simple Notification Service (Amazon SNS). O Amazon SNS oferece suporte às funções do Lambda como destino para mensagens enviadas para um tópico. É possível inscrever a sua função em tópicos na mesma conta ou em outras contas da AWS. Para obter uma descrição detalhada, consulte [Tutorial: usar o AWS Lambda com o Amazon Simple Notification Service](with-sns-example.md).

O Lambda oferece suporte a acionadores do SNS somente para tópicos do SNS padrão. Não há suporte a tópicos FIFO.

O Lambda processa mensagens do SNS de forma assíncrona, enfileirando as mensagens e lidando com novas tentativas. Se o Amazon SNS não puder acessar o Lambda ou se a mensagem for rejeitada, o Amazon SNS tentará novamente em intervalos crescentes ao longo de várias horas. Para obter detalhes, consulte [Confiabilidade](https://aws.amazon.com/sns/faqs/#Reliability) nas Perguntas frequentes do Amazon SNS.

**Atenção**  
As invocações assíncronas do Lambda processam cada evento ao menos uma vez, e o processamento duplicado de registros pode ocorrer. 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.

## Utilitário de idempotência do Powertools para Lambda AWS
<a name="services-sns-powertools-idempotency"></a>

O utilitário de idempotência do Powertools para AWS Lambda torna suas funções do Lambda idempotentes. Está disponível para Python, TypeScript, Java e .NET. *Para obter mais informações, consulte [Utilitário de idempotência](https://docs.powertools.aws.dev/lambda/python/latest/utilities/idempotency/) na documentação do *Powertools para AWS Lambda (Python*), [Utilitário de idempotência](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/idempotency/) na *documentação do Powertools para AWS Lambda (TypeScript)*, [Utilitário de idempotência](https://docs.powertools.aws.dev/lambda/java/latest/utilities/idempotency/) na *documentação do Powertools para AWS Lambda (Java)* e [Utilitário de idempotência](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/) na documentação do Powertools para AWS Lambda* (.NET).

**Topics**
+ [Utilitário de idempotência do Powertools para Lambda AWS](#services-sns-powertools-idempotency)
+ [Adicionar um acionador de tópico do Amazon SNS para uma função do Lambda usando o console](#sns-trigger-console)
+ [Adicionar manualmente um acionador de tópico do Amazon SNS para uma função do Lambda](#sns-trigger-manual)
+ [Exemplo de formato de evento do SNS](#sns-sample-event)
+ [Tutorial: usar o AWS Lambda com o Amazon Simple Notification Service](with-sns-example.md)

## Adicionar um acionador de tópico do Amazon SNS para uma função do Lambda usando o console
<a name="sns-trigger-console"></a>

Para adicionar um tópico do SNS como acionador de uma função do Lambda, a maneira mais fácil é usar o console do Lambda. Quando você adiciona o acionador por meio do console, o Lambda configura automaticamente as permissões e assinaturas necessárias para começar a receber eventos do tópico do SNS.

**Para adicionar um tópico do SNS como acionador para uma função do Lambda (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 à qual você deseja adicionar o acionador.

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

1. Escolha **Add trigger**.

1. Em **Configuração do acionador**, no menu suspenso, escolha **SNS**.

1. Em **Tópico do SNS**, escolha o tópico do SNS para assinar.

## Adicionar manualmente um acionador de tópico do Amazon SNS para uma função do Lambda
<a name="sns-trigger-manual"></a>

Para configurar manualmente um acionador do SNS para uma função do Lambda, é necessário concluir as seguintes etapas:
+ Definir uma política baseada em recurso para a sua função para permitir que o SNS a invoque.
+ Inscrever a função do Lambda no tópico do Amazon SNS.
**nota**  
Se seu tópico do SNS e sua função do Lambda estiverem em contas da AWS diferentes, também será necessário conceder permissões extras para permitir assinaturas entre contas do tópico do SNS. Para obter mais informações, consulte [Concede permissões entre contas para assinatura do Amazon SNS](with-sns-example.md#with-sns-subscription-grant-permission).

Você pode usar o AWS Command Line Interface (AWS CLI) para concluir essas duas etapas. Primeiro, para definir uma política baseada em recursos para uma função do Lambda que permita invocações do SNS, use o comando da AWS CLI a seguir. Certifique-se de substituir o valor de `--function-name` pelo nome da função do Lambda e o valor de `--source-arn` pelo ARN do tópico do SNS.

```
aws lambda add-permission --function-name {{example-function}} \
    --source-arn {{arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda}} \
    --statement-id function-with-sns --action "lambda:InvokeFunction" \
    --principal sns.amazonaws.com
```

Para inscrever sua função no tópico do SNS, use o comando da AWS CLI a seguir. Substitua o valor de `--topic-arn` pelo ARN do tópico do SNS e o valor de `--notification-endpoint` pelo ARN da função do Lambda.

```
aws sns subscribe --protocol lambda \
    --region us-east-1 \
    --topic-arn {{arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda}} \
    --notification-endpoint {{arn:aws:lambda:us-east-1:123456789012:function:example-function}}
```

## Exemplo de formato de evento do SNS
<a name="sns-sample-event"></a>

O Amazon SNS invoca a função [de forma assíncrona](invocation-async.md) com um evento que contém uma mensagem e metadados.

**Example Evento da mensagem do Amazon SNS**  

```
{
  "Records": [
    {
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
      "EventSource": "aws:sns",
      "Sns": {
        "SignatureVersion": "1",
        "Timestamp": "2019-01-02T12:45:07.000Z",
        "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
        "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "Message": "Hello from SNS!",
        "MessageAttributes": {
          "Test": {
            "Type": "String",
            "Value": "TestString"
          },
          "TestBinary": {
            "Type": "Binary",
            "Value": "TestBinary"
          }
        },
        "Type": "Notification",
        "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
        "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda",
        "Subject": "TestInvoke"
      }
    }
  ]
}
```