Tutorial: uso de AWS Lambda con Amazon Simple Notification Service - AWS Lambda

Tutorial: uso de AWS Lambda con Amazon Simple Notification Service

Puede utilizar una función de Lambda en una cuenta de AWS para suscribirse a un tema de Amazon SNS de otra cuenta de AWS. En este tutorial, se utiliza la AWS Command Line Interface para realizar operaciones de AWS Lambda, como, por ejemplo, la creación de una función de Lambda, la creación de un tema de Amazon SNS y la concesión de permisos permitir que estos dos recursos puedan acceder el uno al otro.

Requisitos previos

En este tutorial, se le presuponen algunos conocimientos sobre las operaciones básicas de Lambda y la consola de Lambda. Si aún no lo ha hecho, siga las instrucciones que se indican en Introducción a Lambda para crear la primera función Lambda.

Para completar los siguientes pasos, necesita un terminal de línea de comandos o shell para ejecutar comandos. Los comandos y la salida esperada se muestran en bloques separados:

aws --version

Debería ver los siguientes datos de salida:

aws-cli/2.0.57 Python/3.7.4 Darwin/19.6.0 exe/x86_64

Para los comandos largos, se utiliza un carácter de escape (\) para dividir un comando en varias líneas.

En Linux y macOS, use su administrador de shell y paquetes preferido. En Windows 10, puede instalar Windows Subsystem para Linux para obtener una versión de Ubuntu y Bash integrada con Windows.

En el tutorial, se utilizarán dos cuentas. Los comandos de la AWS CLI ilustran esto utilizando dos perfiles con nombre, cada uno configurado para el uso con una cuenta diferente. Si utiliza perfiles con nombres distintos, bien el perfil predeterminado o un perfil con nombre, modifique los comandos según sea necesario.

Crear un tema de Amazon SNS

Desde la cuenta A (01234567891A), cree el tema de Amazon SNS de origen.

aws sns create-topic --name lambda-x-account --profile accountA

Anote el ARN del tema que devuelve el comando. Lo necesitará cuando añada permisos a la función de Lambda para suscribirse al tema.

Creación del rol de ejecución

Desde la cuenta B (01234567891B), cree el rol de ejecución que da a la función permiso para acceder a los recursos de AWS.

Para crear un rol de ejecución

  1. Abra la página Roles en la consola de IAM.

  2. Elija Create role (Crear rol).

  3. Cree un rol con las propiedades siguientes.

    • Trusted entity (Entidad de confianza)AWS Lambda.

    • PermisosAWSLambdaVPCAccessExecutionRole..

    • Role name (Nombre de rol): lambda-sns-role.

La política AWSLambdaVPCAccessExecutionRole tiene permisos que la función necesita para escribir registros a CloudWatch Logs.

Crear una función de Lambda

Desde la cuenta B (01234567891B), cree la función que procesa los eventos desde Amazon SNS. A continuación se muestra código de ejemplo que recibe un evento de Amazon SNS como entrada y procesa los mensajes que contiene. Con fines ilustrativos, el código escribe parte de los datos de los eventos de entrada en CloudWatch Logs.

nota

Para ver código de muestra en otros lenguajes, consulte Código de función de ejemplo.

ejemplo index.js

console.log('Loading function'); exports.handler = function(event, context, callback) { // console.log('Received event:', JSON.stringify(event, null, 4)); var message = event.Records[0].Sns.Message; console.log('Message received from SNS:', message); callback(null, "Success"); };

Para crear la función

  1. Copie el código de muestra en un archivo con el nombre index.js.

  2. Crear un paquete de implementación.

    zip function.zip index.js
  3. Cree una función de Lambda con el comando create-function.

    aws lambda create-function --function-name SNS-X-Account \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::01234567891B:role/service-role/lambda-sns-execution-role \ --timeout 60 --profile accountB

Anote el ARN de la función que devuelve el comando. Lo necesitará cuando añada permisos para permitir a Amazon SNS que invoque la función.

Configuración de los permisos entre las cuentas

Desde la cuenta A (01234567891A), conceda permiso a la cuenta B (01234567891B) para suscribirse al tema:

aws sns add-permission --label lambda-access --aws-account-id 12345678901B \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --action-name Subscribe ListSubscriptionsByTopic --profile accountA

Desde la cuenta B (01234567891B) añada el permiso de Lambda para permitir la invocación desde Amazon SNS.

aws lambda add-permission --function-name SNS-X-Account \ --source-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --statement-id sns-x-account --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountB

Debería ver los siguientes datos de salida:

{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\": \"arn:aws:sns:us-east-2:12345678901A:lambda-x-account\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-east-2:01234567891B:function:SNS-X-Account\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"}, \"Sid\":\"sns-x-account1\"}" }

No utilice el parámetro --source-account para añadir una cuenta de origen a la política de Lambda al añadir la política. La cuenta de origen no es compatible con los orígenes de eventos de Amazon SNS y dará lugar a la denegación de acceso.

nota

Si la cuenta con el tema de SNS está alojada en una región de registro, debe especificar la región en la entidad principal. Para ver un ejemplo, consulte Invocación de funciones de Lambda mediante las notificaciones de Amazon SNS en la Guía para desarrolladores de Amazon Simple Notification Service.

Crear una suscripción

Desde la cuenta B, suscriba la función de Lambda al tema. Cuando se envía un mensaje al tema de lambda-x-account en la cuenta A (01234567891A), Amazon SNS invoca la función SNS-X-Account en la cuenta B (01234567891B).

aws sns subscribe --protocol lambda \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --notification-endpoint arn:aws:lambda:us-east-2:12345678901B:function:SNS-X-Account \ --profile accountB

Debería ver los siguientes datos de salida:

{ "SubscriptionArn": "arn:aws:sns:us-east-2:12345678901A:lambda-x-account:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }

La salida contiene el ARN de la suscripción al tema.

Probar suscripción

Desde la cuenta A (01234567891A), pruebe la suscripción. Escriba Hello World en un archivo de texto y guárdelo como message.txt. A continuación, ejecute el siguiente comando:

aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:us-east-2:12345678901A:lambda-x-account \ --profile accountA

Esto devolverá un ID de mensaje con un identificador único que indica que el servicio Amazon SNS aceptó el mensaje. A continuación, Amazon SNS intentará entregarlo a los suscriptores del tema. También puede proporcionar una cadena JSON directamente al parámetro message, pero si utiliza un archivo de texto, puede incluir saltos de línea en el mensaje.

Para obtener más información sobre Amazon SNS, consulte ¿Qué es Amazon Simple Notification Service?

Limpiar los recursos

Ahora puede eliminar los recursos que creó para este tutorial, a menos que desee conservarlos. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su cuenta de AWS.

Para eliminar el tema de Amazon SNS

  1. Abra la página Temas de la consola de Amazon SNS.

  2. Seleccione el tema que ha creado.

  3. Elija Eliminar.

  4. Escriba delete me en el cuadro de texto.

  5. Elija Eliminar.

Para eliminar el rol de ejecución

  1. Abra la Página de Roles de la consola de IAM.

  2. Seleccione el rol de ejecución que ha creado.

  3. Elija Delete role (Eliminar rol).

  4. Elija Sí, eliminar.

Para eliminar la función de Lambda

  1. Abra la Página de Funciones de la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Actions (Acciones), Delete (Eliminar).

  4. Elija Eliminar.

Para eliminar la suscripción de Amazon SNS

  1. Abra la página Suscripciones de la consola de Amazon SNS.

  2. Seleccione la suscripción que ha creado.

  3. Elija Delete (Eliminar), Delete (Eliminar).