Tutorial: Procesamiento de nuevos elementos con Flujos de DynamoDB y Lambda - Amazon DynamoDB

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Tutorial: Procesamiento de nuevos elementos con Flujos de DynamoDB y Lambda

En este tutorial, va a crear un disparador AWS Lambda para procesar la secuencia de una tabla DynamoDB.

El escenario en que tiene lugar este tutorial es Woofer, una red social sencilla. Los usuarios de Woofer se comunican utilizando ladridos (mensajes de texto breves) que se envían a otros usuarios de Woofer. En el siguiente diagrama se muestran los componentes y el flujo de trabajo de esta aplicación.

  1. Un usuario escribe un elemento en una tabla de DynamoDB (BarkTable). Cada elemento de la tabla representa un ladrido.

  2. Se escribe un nuevo registro de secuencia para reflejar que se ha agregado un elemento nuevo a BarkTable.

  3. El nuevo registro de secuencia activa una función de AWS Lambda (publishNewBark).

  4. Si el registro de secuencia indica que se ha agregado un nuevo elemento a BarkTable, la función de Lambda lee los datos del registro de secuencia y publica un mensaje en un tema de Amazon Simple Notification Service (Amazon SNS).

  5. Los suscriptores a ese tema de Amazon SNS reciben el mensaje. En este tutorial, el único suscriptor es una dirección de correo electrónico.

Antes de empezar

En este tutorial se utiliza la AWS Command Line Interface AWS CLI. Si aún no lo ha hecho, siga las instrucciones que figuran en la AWS Command Line Interface Guía del usuario para instalar y configurar la AWS CLI.

Paso 1: Crear una tabla de DynamoDB con una secuencia habilitada

En este paso, va a crear una tabla de DynamoDB (BarkTable) para almacenar todos los ladridos de los usuarios de Woofer. La clave principal consta de Username (clave de partición) y Timestamp (clave de ordenación). Ambos atributos son de tipo String.

BarkTable tiene una secuencia habilitada. Más adelante en este tutorial, asociará una función de AWS Lambda a la secuencia para crear un disparador.

  1. Introduzca el siguiente comando para crear la tabla.

    aws dynamodb create-table \ --table-name BarkTable \ --attribute-definitions AttributeName=Username,AttributeType=S AttributeName=Timestamp,AttributeType=S \ --key-schema AttributeName=Username,KeyType=HASH AttributeName=Timestamp,KeyType=RANGE \ --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \ --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES
  2. Busque en los resultado LatestStreamArn.

    ... "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp ...

    Anote el valor de region y accountID, porque los necesitará para los demás pasos de este tutorial.

Paso 2: Crear un rol de ejecución para Lambda

En este paso, va a crear un rol de AWS Identity and Access Management (IAM) (WooferLambdaRole y a asignarle permisos. El rol lo utilizará la función de Lambda que va a crear en Paso 4: Crear y probar una función Lambda.

Asimismo, va a crear una política para el rol. La política contendrá todos los permisos que la función de Lambda va a necesitar en tiempo de ejecución.

  1. Cree un archivo denominado trust-relationship.json con el siguiente contenido.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. Escriba el siguiente comando para crear WooferLambdaRole.

    aws iam create-role --role-name WooferLambdaRole \ --path "/service-role/" \ --assume-role-policy-document file://trust-relationship.json
  3. Cree un archivo denominado role-policy.json con el siguiente contenido. (Sustituya region y accountID por su región de AWS y su identificador de cuenta).

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "lambda:InvokeFunction", "Resource": "arn:aws:lambda:region:accountID:function:publishNewBark*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:region:accountID:*" }, { "Effect": "Allow", "Action": [ "dynamodb:DescribeStream", "dynamodb:GetRecords", "dynamodb:GetShardIterator", "dynamodb:ListStreams" ], "Resource": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/*" }, { "Effect": "Allow", "Action": [ "sns:Publish" ], "Resource": [ "*" ] } ] }

    La política tiene cuatro instrucciones que permiten que WooferLambdaRole realice las siguientes acciones:

    • Ejecute una Lambda función de (publishNewBark). Creará la función más adelante en este tutorial.

    • Acceder a Amazon CloudWatch Logs. La función de Lambda escribe diagnósticos en CloudWatch Logs en tiempo de ejecución.

    • Leer datos de la secuencia de DynamoDB relativos a BarkTable.

    • Publicar mensajes en Amazon SNS.

  4. Introduzca el siguiente comando para asociar la política al WooferLambdaRole.

    aws iam put-role-policy --role-name WooferLambdaRole \ --policy-name WooferLambdaRolePolicy \ --policy-document file://role-policy.json

Paso 3: Creación de un tema de Amazon SNS

En este paso, va a crear un tema de Amazon SNS (wooferTopic) y suscribe una dirección de correo electrónico a ese tema. La función de Lambda utiliza este tema para publicar los ladridos nuevos de los usuarios de Woofer.

  1. Introduzca el siguiente comando para crear un nuevo tema de Amazon SNS.

    aws sns create-topic --name wooferTopic
  2. Introduzca el siguiente comando para suscribir una dirección de correo electrónico a wooferTopic. Sustituya region y accountID por su región de AWS y su identificador de cuenta; además, sustituya example@example.com por una dirección de correo electrónico válida.

    aws sns subscribe \ --topic-arn arn:aws:sns:region:accountID:wooferTopic \ --protocol email \ --notification-endpoint example@example.com
  3. Amazon SNS envía un mensaje de confirmación a la dirección de correo electrónico indicada. Elija el enlace Confirm subscription (Confirmar suscripción) del mensaje para completar el proceso de suscripción.

Paso 4: Crear y probar una función Lambda

En este paso, va a crear una función de AWS Lambda (publishNewBark) para procesar los registros de secuencia de BarkTable.

La función publishNewBark solamente procesa los eventos de la secuencia que corresponden a elementos nuevos de BarkTable. La función lee los datos de esos eventos y, a continuación, llama a Amazon SNS para publicarlos.

  1. Cree un archivo denominado publishNewBark.js con el siguiente contenido. Sustituya region y accountID por su AWS región e ID de cuenta de .

    'use strict'; var AWS = require("aws-sdk"); var sns = new AWS.SNS(); exports.handler = (event, context, callback) => { event.Records.forEach((record) => { console.log('Stream record: ', JSON.stringify(record, null, 2)); if (record.eventName == 'INSERT') { var who = JSON.stringify(record.dynamodb.NewImage.Username.S); var when = JSON.stringify(record.dynamodb.NewImage.Timestamp.S); var what = JSON.stringify(record.dynamodb.NewImage.Message.S); var params = { Subject: 'A new bark from ' + who, Message: 'Woofer user ' + who + ' barked the following at ' + when + ':\n\n ' + what, TopicArn: 'arn:aws:sns:region:accountID:wooferTopic' }; sns.publish(params, function(err, data) { if (err) { console.error("Unable to send message. Error JSON:", JSON.stringify(err, null, 2)); } else { console.log("Results from sending message: ", JSON.stringify(data, null, 2)); } }); } }); callback(null, `Successfully processed ${event.Records.length} records.`); };
  2. Cree un archivo zip que contenga publishNewBark.js. Si tiene la utilidad de línea de comandos zip, puede introducir el siguiente comando para hacerlo.

    zip publishNewBark.zip publishNewBark.js
  3. Al crear la función de Lambda, debe especificar el nombre de recurso de Amazon (ARN) de WooferLambdaRole, que creó en Paso 2: Crear un rol de ejecución para Lambda. Introduzca el siguiente comando para recuperar este ARN.

    aws iam get-role --role-name WooferLambdaRole

    Busque en los resultado WooferLambdaRole.

    ... "Arn": "arn:aws:iam::region:role/service-role/WooferLambdaRole" ...

    Introduzca el siguiente comando para crear la función de Lambda. Reemplazar roleARN con el ARN de WooferLambdaRole.

    aws lambda create-function \ --region us-east-1 \ --function-name publishNewBark \ --zip-file fileb://publishNewBark.zip \ --role roleARN \ --handler publishNewBark.handler \ --timeout 5 \ --runtime nodejs10.x
  4. Ahora pruebe publishNewBark para comprobar que funciona. Para ello, le facilitamos información de entrada que parece un registro auténtico de Flujos de DynamoDB.

    Cree un archivo denominado payload.json con el siguiente contenido.

    { "Records": [ { "eventID": "7de3041dd709b024af6f29e4fa13d34c", "eventName": "INSERT", "eventVersion": "1.1", "eventSource": "aws:dynamodb", "awsRegion": "us-west-2", "dynamodb": { "ApproximateCreationDateTime": 1479499740, "Keys": { "Timestamp": { "S": "2016-11-18:12:09:36" }, "Username": { "S": "John Doe" } }, "NewImage": { "Timestamp": { "S": "2016-11-18:12:09:36" }, "Message": { "S": "This is a bark from the Woofer social network" }, "Username": { "S": "John Doe" } }, "SequenceNumber": "13021600000000001596893679", "SizeBytes": 112, "StreamViewType": "NEW_IMAGE" }, "eventSourceARN": "arn:aws:dynamodb:us-east-1:123456789012:table/BarkTable/stream/2016-11-16T20:42:48.104" } ] }

    Introduzca el siguiente comando para probar la función de publishNewBark.

    aws lambda invoke --function-name publishNewBark --payload file://payload.json output.txt

    Si la prueba se realiza correctamente, aparecerá el siguiente resultado.

    { "StatusCode": 200 }

    Además, el archivo output.txt contendrá el siguiente texto.

    "Successfully processed 1 records."

    También recibirá un nuevo mensaje de correo electrónico dentro de unos minutos.

    nota

    AWS Lambda escribe la información de diagnóstico en Amazon CloudWatch Logs. Si se produce cualquier error en la función Lambda, puede utilizar esos diagnósticos para solucionar el problema:

    1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.

    2. En el panel de navegación, elija Logs.

    3. Elija el grupo de log siguiente: /aws/lambda/publishNewBark

    4. Elija la última secuencia de log para ver el resultado (y los errores) de la función.

Paso 5: Crear y probar un disparador

En Paso 4: Crear y probar una función Lambda, ha probado la función de Lambda para asegurarse de que se ejecutaba correctamente. En este paso, va a crear un disparador. Para ello, asociará la función de Lambda (publishNewBark) con el origen de eventos (la secuencia BarkTable).

  1. Al crear el disparador, debe especificar el ARN de la secuencia de BarkTable. Introduzca el siguiente comando para recuperar este ARN.

    aws dynamodb describe-table --table-name BarkTable

    Busque en los resultado LatestStreamArn.

    ... "LatestStreamArn": "arn:aws:dynamodb:region:accountID:table/BarkTable/stream/timestamp ...
  2. Introduzca el siguiente comando para crear el disparador. Sustituya streamARN por el ARN de la secuencia real.

    aws lambda create-event-source-mapping \ --region us-east-1 \ --function-name publishNewBark \ --event-source streamARN \ --batch-size 1 \ --starting-position TRIM_HORIZON
  3. Prueba el disparador. Introduzca el siguiente comando para agregar un elemento a BarkTable.

    aws dynamodb put-item \ --table-name BarkTable \ --item Username={S="Jane Doe"},Timestamp={S="2016-11-18:14:32:17"},Message={S="Testing...1...2...3"}

    Debería recibir un nuevo mensaje de correo electrónico dentro de unos minutos.

  4. Abra la consola de DynamoDB y agregue algunos elementos más a BarkTable. Debe especificar valores para los atributos Username y Timestamp. También debe especificar un valor para Message, aunque no es obligatorio. Debe recibir un nuevo mensaje de correo electrónico por cada elemento que agregue a BarkTable.

    La función de Lambda procesa solamente los elementos nuevos que se agregan a BarkTable. Si actualiza o elimina un elemento de la tabla, la función no hace nada.

nota

AWS Lambda escribe la información de diagnóstico en Amazon CloudWatch Logs. Si se produce cualquier error en la función Lambda, puede utilizar esos diagnósticos para solucionar el problema.

  1. Abra la consola de CloudWatch en https://console.aws.amazon.com/cloudwatch/.

  2. En el panel de navegación, elija Logs.

  3. Elija el grupo de log siguiente: /aws/lambda/publishNewBark

  4. Elija la última secuencia de log para ver el resultado (y los errores) de la función.