Invocar las funciones de Lambda usando las notificaciones de Amazon SNS - AWS Lambda

Invocar las funciones de Lambda usando las notificaciones de Amazon SNS

Puede utilizar una función de Lambda para procesar notificaciones de Amazon Simple Notification Service (Amazon SNS). Amazon SNS admite funciones de Lambda como destino para los mensajes enviados a un tema. Puede suscribir la función a temas de la misma cuenta o de otras cuentas de AWS. Para ver un tutorial detallado, consulte Tutorial: Uso de AWS Lambda con Amazon Simple Notification Service.

Lambda admite desencadenadores de SNS únicamente para temas de SNS estándar. Los temas FIFO no son compatibles.

Para la invocación asíncrona, Lambda pone en cola el mensaje y administra los reintentos. Si Amazon SNS no puede conectar con Lambda o se rechaza el mensaje, Amazon SNS lo vuelve a intentar a intervalos cada vez mayores durante varias horas. Para conocer los detalles, consulte Fiabilidad en las preguntas frecuentes de Amazon SNS.

aviso

Las asignaciones de orígenes de eventos de Lambda procesan cada evento al menos una vez, y puede producirse un procesamiento duplicado de registros. Para evitar posibles problemas relacionados con la duplicación de eventos, le recomendamos encarecidamente que haga que el código de la función sea idempotente. Para obtener más información, consulte ¿Cómo puedo hacer que mi función de Lambda sea idempotente? en el Centro de conocimientos de AWS.

Adición de un desencadenador de temas de Amazon SNS para una función de Lambda mediante la consola

Para agregar un tema de SNS como desencadenador de una función de Lambda, la forma más sencilla es utilizar la consola de Lambda. Al agregar el desencadenador a través de la consola, Lambda configura automáticamente los permisos y suscripciones necesarios para empezar a recibir eventos del tema de SNS.

Cómo agregar un tema de SNS como desencadenador de una función de Lambda (consola)
  1. Abra la página de Funciones en la consola de Lambda.

  2. Elija el nombre de una función a la que desee agregarle el desencadenador.

  3. Elija Configuración y, a continuación, seleccione Desencadenadores.

  4. Elija Add trigger (Añadir disparador).

  5. En Configuración del desencadenador, seleccione SNS de la lista desplegable.

  6. Para el tema de SNS, elija el tema de SNS al que desee suscribirse.

Adición manual de un desencadenador de temas de Amazon SNS para una función de Lambda

Para configurar manualmente un desencadenador de SNS para una función de Lambda, debe completar los siguientes pasos:

  • Defina una política basada en recursos para la función de modo que SNS pueda invocarla.

  • Suscriba la función de Lambda al tema de Amazon SNS.

    nota

    Si su tema de SNS y su función de Lambda están en cuentas de AWS diferentes, también debe conceder permisos adicionales para permitir las suscripciones multicuenta al tema de SNS. Para obtener más información, consulte Conceder permiso entre cuentas para la suscripción a Amazon SNS.

Puede usar el AWS Command Line Interface (AWS CLI) para completar estos dos pasos. En primer lugar, para definir una política basada en recursos para una función de Lambda que permita las invocaciones de SNS, utilice el siguiente comando de la AWS CLI. Asegúrese de sustituir el valor de --function-name por el nombre de la función de Lambda y el valor de --source-arn por el ARN del tema de 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

Utilice el siguiente comando AWS CLI para suscribir la función al tema SNS. Sustituya el valor de --topic-arn por el ARN del tema de SNS y el valor de --notification-endpoint por el ARN de la función de 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

Ejemplo de forma de evento SNS

Amazon SNS invoca la función de forma asíncrona con un evento que contiene un mensaje y metadatos.

ejemplo Evento de mensajes de 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" } } ] }