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.
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
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
Tópicos
Adicionar um acionador de tópico do Amazon SNS para uma função do Lambda usando o console
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)
Abra a página Funções
do console do Lambda. -
Escolha o nome da função à qual você deseja adicionar o acionador.
-
Escolha Configuração e, em seguida, escolha Acionadores.
-
Escolha Add trigger.
-
Em Configuração do acionador, no menu suspenso, escolha SNS.
-
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
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.
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-arnarn: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-endpointarn:aws:lambda:us-east-1:123456789012:function:example-function
Exemplo de formato de evento do SNS
O Amazon SNS invoca a função de forma assíncrona com um evento que contém uma mensagem e metadados.
exemplo 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&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"
}
}
]
}