Tutorial: Uso de AWS Lambda con Amazon Simple Notification Service
En este tutorial, utilizará una función de Lambda en una Cuenta de AWS para suscribirse a un tema de Amazon Simple Notification Service (Amazon SNS) en una Cuenta de AWS independiente. Cuando publica mensajes en su tema de Amazon SNS, la función de Lambda lee el contenido del mensaje y lo envía a Registros de Amazon CloudWatch. Para completar este tutorial, debe usar la AWS Command Line Interface (AWS CLI).

Para completar este tutorial, lleve a cabo los siguientes pasos:
-
En la cuenta A, cree un tema de Amazon SNS.
-
En la cuenta B, cree una función de Lambda que lea los mensajes del tema.
-
En la cuenta B, cree una suscripción al tema.
-
Publique los mensajes en el tema de Amazon SNS en la cuenta A y confirme que la función de Lambda de la cuenta B los envíe a Registros de CloudWatch.
Al completar estos pasos, aprenderá a configurar un tema de Amazon SNS para invocar una función de Lambda. También aprenderá a crear una política de AWS Identity and Access Management (IAM) que conceda permiso a un recurso de otra Cuenta de AWS para invocar Lambda.
En el tutorial, utiliza dos Cuentas de AWS independientes. Los comandos de AWS CLI ilustran esto mediante dos perfiles con nombre llamados accountA
y accountB
, cada uno configurado para usarse con una Cuenta de AWS diferente. A fin de aprender a configurar AWS CLI para usar diferentes perfiles, consulte Opciones de los archivos de configuración y credenciales en la Guía del usuario de la versión 2 de la AWS Command Line Interface. Asegúrese de configurar la misma Región de AWS predeterminada para ambos perfiles.
Si los perfiles de AWS CLI que crea para las dos Cuentas de AWS utilizan nombres distintos, o si usa el perfil predeterminado y un perfil con nombre, modifique los comandos de AWS CLI en los siguientes pasos según sea necesario.
Requisitos previos
Si aún no ha instalado AWS Command Line Interface, siga los pasos que se indican en Instalación o actualización de la versión más reciente de AWS CLI para instalarlo.
El tutorial requiere un intérprete de comandos o un terminal de línea de comando para ejecutar los comandos. En Linux y macOS, use su administrador de intérprete de comandos y paquetes preferido.
nota
En Windows, algunos comandos de la CLI de Bash que se utilizan habitualmente con Lambda (por ejemplo, zip
) no son compatibles con los terminales integrados del sistema operativo. Para obtener una versión de Ubuntu y Bash integrada con Windows, instale el subsistema de Windows para Linux
Creación de un tema de Amazon SNS (cuenta A)

Para crear el tema
-
En la cuenta A, cree un tema estándar de Amazon SNS mediante el siguiente comando de AWS CLI.
aws sns create-topic --name sns-topic-for-lambda --profile accountA
Debería ver un resultado similar a este.
{ "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda" }
Anote el Nombre de recurso de Amazon (ARN) del tema. Lo necesitará más adelante en el tutorial cuando agregue permisos a la función de Lambda para suscribirse al tema.
Creación de un rol de ejecución de función (cuenta B)

Un rol de ejecución es un rol de IAM que concede a la función de Lambda permiso para acceder a servicios y recursos de Servicios de AWS. Antes de crear la función en la cuenta B, cree un rol que conceda a la función permisos básicos para escribir registros en Registros de CloudWatch. Agregaremos los permisos para leer el tema de Amazon SNS en un paso posterior.
Para crear un rol de ejecución
-
En la cuenta B, abra la página de roles
en la consola de IAM. -
Elija Creación de rol.
-
En Tipo de entidad de confianza, elija Servicio de AWS.
-
En Caso de uso, elija Lambda.
-
Elija Siguiente.
-
Siga estos pasos para agregar una política de permisos básicos al rol:
-
En el cuadro de búsqueda Permisos de selección, ingrese
AWSLambdaBasicExecutionRole
. -
Elija Siguiente.
-
-
Siga estos pasos para finalizar la creación del rol:
-
En Detalles del rol, escriba
lambda-sns-role
en Nombre de rol. -
Elija Creación de rol.
-
Creación de una función de Lambda (cuenta B)

Cree una función de Lambda que procese los mensajes de Amazon SNS. El código de función registra el contenido de los mensajes de cada entrada en los Registros de Amazon CloudWatch.
En este tutorial, se utiliza el tiempo de ejecución de Node.js 18.x, pero también hemos proporcionado archivos de código de ejemplo en otros lenguajes de tiempo de ejecución. Puede seleccionar la pestaña del siguiente cuadro para ver el código del tiempo de ejecución que le interesa. El código JavaScript que usará en este paso está en el primer ejemplo que se muestra en la pestaña JavaScript.
Cómo crear la función
-
Cree un directorio para el proyecto y, a continuación, cambie a ese directorio.
mkdir sns-tutorial cd sns-tutorial
-
Copie el código de muestra de JavaScript en un nuevo archivo con el nombre
index.js
. -
Cree un paquete de implementación utilizando el siguiente comando
zip
.zip function.zip index.js
-
Ejecute el siguiente comando de AWS CLI para crear la función de Lambda en la cuenta B.
aws lambda create-function --function-name Function-With-SNS \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs18.x \ --role arn:aws:iam::
<AccountB_ID>
:role/lambda-sns-role \ --timeout 60 --profile accountBDebería ver un resultado similar a este.
{ "FunctionName": "Function-With-SNS", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS", "Runtime": "nodejs18.x", "Role": "arn:aws:iam::123456789012:role/lambda_basic_role", "Handler": "index.handler", ... "RuntimeVersionConfig": { "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206" } }
-
Registre el Nombre de recurso de Amazon (ARN) de la función. Lo necesitará más adelante en el tutorial cuando agregue permisos para permitir a Amazon SNS que invoque la función.
Adición de permisos a la función (cuenta B)

Para que Amazon SNS invoque la función, debe concederle permiso en una instrucción de una política basada en recursos. Para agregar esta instrucción, utilice el comando add-permission
de AWS CLI.
Para conceder permiso a Amazon SNS para invocar la función
-
En la cuenta B, ejecute el siguiente comando de AWS CLI mediante el ARN del tema de Amazon SNS que registró anteriormente.
aws lambda add-permission --function-name Function-With-SNS \ --source-arn arn:aws:sns:
us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --statement-id function-with-sns --action "lambda:InvokeFunction" \ --principal sns.amazonaws.com --profile accountBDebería ver un resultado similar a este.
{ "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\": \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}}, \"Action\":[\"lambda:InvokeFunction\"], \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\", \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"}, \"Sid\":\"function-with-sns\"}" }
nota
Si la cuenta con el tema de Amazon SNS está alojada en una Región de AWS con suscripción, debe especificar la región en la entidad principal. Por ejemplo, si trabaja con un tema de Amazon SNS en la región de Asia-Pacífico (Hong Kong), debe especificar sns.ap-east-1.amazonaws.com
en lugar de sns.amazonaws.com
para la entidad principal.
Concesión de permiso entre cuentas para la suscripción a Amazon SNS (cuenta A)

Para que su función de Lambda de la cuenta B se suscriba al tema de Amazon SNS que creó en la cuenta A, tiene que conceder permiso a la cuenta B para suscribirse al tema. Utilice el comando add-permission
de AWS CLI para conceder este permiso.
Para conceder permiso para que la cuenta B se suscriba al tema
-
En la cuenta A, ejecute el siguiente comando de AWS CLI. Utilice el ARN del tema de Amazon SNS que registró anteriormente.
aws sns add-permission --label lambda-access --aws-account-id
<AccountB_ID>
\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --action-name Subscribe ListSubscriptionsByTopic --profile accountA
Creación de una suscripción (cuenta B)

En la cuenta B, ahora puede suscribir su función de Lambda al tema de Amazon SNS que creó al principio del tutorial en la cuenta A. Cuando se envía un mensaje a este tema (sns-topic-for-lambda
), Amazon SNS invoca su función de Lambda Function-With-SNS
en la cuenta B.
Para crear una suscripción
-
En la cuenta B, ejecute el siguiente comando de AWS CLI. Use la región predeterminada en la que creó el tema y los ARN del tema y la función de Lambda.
aws sns subscribe --protocol lambda \ --region
us-east-1
\ --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>
:function:Function-With-SNS \ --profile accountBDebería ver un resultado similar a este.
{ "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx" }
Publicación de mensajes en el tema (cuenta A y cuenta B)

Ahora que su función de Lambda de la cuenta B se ha suscrito a su tema de Amazon SNS en la cuenta A, es hora de probar la configuración mediante la publicación de mensajes en el tema. Para confirmar que Amazon SNS ha invocado la función de Lambda, utilice Registros de CloudWatch para ver la salida de la función.
Para publicar un mensaje en el tema y ver la salida de la función
-
Escriba
Hello World
en un archivo de texto y guárdelo comomessage.txt
. -
Desde el mismo directorio en el que guardó el archivo de texto, ejecute el siguiente comando de AWS CLI en la cuenta A. Use el ARN de su propio tema.
aws sns publish --message file://message.txt --subject Test \ --topic-arn arn:aws:sns:
us-east-1:<AccountA_ID>
:sns-topic-for-lambda \ --profile accountAEsto devolverá un ID de mensaje con un identificador único que indica que Amazon SNS ha aceptado el mensaje. Posteriormente, Amazon SNS intentará entregar el mensaje a los suscriptores del tema. Para confirmar que Amazon SNS ha invocado la función de Lambda, utilice Registros de CloudWatch para ver la salida de la función:
-
En la cuenta B, abra la página Grupos de registro
de la consola de Amazon CloudWatch. -
Elija el grupo de registro para la función (
/aws/lambda/Function-With-SNS
). -
Elija el flujo de registros más reciente.
-
Si la función se ha invocado correctamente, verá una salida similar a la siguiente en la que se muestra el contenido del mensaje que publicó en el tema.
2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World 2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
Eliminación de sus recursos
A menos que desee conservar los recursos que creó para este tutorial, puede eliminarlos ahora. Si elimina los recursos de AWS que ya no utiliza, evitará gastos innecesarios en su Cuenta de AWS.
En la cuenta A, limpie el tema de Amazon SNS.
Para eliminar el tema de Amazon SNS
-
Abra la página Topics (Temas)
en la consola de Amazon SNS. -
Seleccione el tema que creó.
-
Elija Eliminar.
-
Introduzca
delete me
en el campo de entrada de texto. -
Elija Eliminar.
En la cuenta B, limpie el rol de ejecución, la función de Lambda y la suscripción de Amazon SNS.
Cómo eliminar el rol de ejecución
-
Abra la página Roles
en la consola de IAM. -
Seleccione el rol de ejecución que creó.
-
Elija Eliminar.
-
Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija Delete (Eliminar).
Cómo eliminar la función de Lambda
-
Abra la página de Funciones
en la consola de Lambda. -
Seleccione la función que ha creado.
-
Elija Acciones, Eliminar.
-
Escriba
confirm
en el campo de entrada de texto y elija Delete (Eliminar).
Para eliminar la suscripción a Amazon SNS
-
Abra la página Suscriptions (Suscripciones)
en la consola de Amazon SNS. -
Seleccione la suscripción que creó.
-
Elija Delete (Eliminar), Delete (Eliminar).