Tutorial: Procesamiento de nuevos elementos con Amazon DynamoDB Streams 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 Amazon DynamoDB Streams y Lambda

En este tutorial, va a crear unAWS Lambdapara procesar una secuencia de una tabla de 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 flujo indica que se agregó un nuevo elemento aBarkTable, la función 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 laAWS Command Line InterfaceGuía del usuarioPara instalar y configurar laAWS CLI.

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

En este paso, se crea 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 LatestStreamArn en los resultados.

    ... "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: Creación de un rol de ejecución de Lambda

En este paso, va a crear unAWS Identity and Access ManagementRol de (IAM) deWooferLambdaRole) y asignarle permisos. Esta función lo utilizará la función Lambda que va a crear enPaso 4: Creación y prueba de una función Lambda.

Asimismo, va a crear una política para el rol. La política contiene todos los permisos que la función Lambda necesita 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. (ReemplaceregionyaccountIDCon tuAWSRegión e 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 función Lambda) (publishNewBark). Creará la función más adelante en este tutorial.

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

    • Leer datos de la secuencia de DynamoDB paraBarkTable.

    • 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, se crea un tema de Amazon SNS (wooferTopic) y suscribe una dirección de correo electrónico a ella. La función 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. (ReemplaceregionyaccountIDCon tuAWSId. de región y cuenta, y reemplazarexample@example.com).

    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: Creación y prueba de 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. ReemplazarregionyaccountIDCon tuAWSId. de cuenta y región.

    '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 Lambda, debe especificar el nombre de recurso de Amazon (ARN) paraWooferLambdaRole, que creó enPaso 2: Creación de un rol de ejecución de Lambda. Introduzca el siguiente comando para recuperar este ARN.

    aws iam get-role --role-name WooferLambdaRole

    Busque WooferLambdaRole en los resultados.

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

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

    aws lambda create-function \ --region region \ --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 DynamoDB Streams.

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

    { "Records": [ { "eventID": "7de3041dd709b024af6f29e4fa13d34c", "eventName": "INSERT", "eventVersion": "1.1", "eventSource": "aws:dynamodb", "awsRegion": "region", "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:region: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 Lambdaescribe 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: Creación y prueba de un disparador

EnPaso 4: Creación y prueba de una función Lambda, ha probado la función Lambda para asegurarse de que se ejecutaba correctamente. En este paso, va a crear unDisparadorasociando la función Lambda (publishNewBark) con un origen de evento (elBarkTablestream).

  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 LatestStreamArn en los resultados.

    ... "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 region \ --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 aBarkTable. 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 Lambda procesa solamente los elementos nuevos que se agregan aBarkTable. Si actualiza o elimina un elemento de la tabla, la función no hace nada.

nota

AWS Lambdaescribe 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.