Tutorial: Uso de AWS Lambda con flujos de Amazon DynamoDB - AWS Lambda

Tutorial: Uso de AWS Lambda con flujos de Amazon DynamoDB

En este tutorial, se crea una función de Lambda para consumir eventos de un flujo de Amazon DynamoDB.

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.

Creación del rol de ejecución

Cree el rol de ejecución que concederá a su función permiso para obtener acceso 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): Lambda.

    • PermisosAWSLambdaDynamoDBExecutionRole.

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

El AWSLambdaDynamoDBExecutionRole (Rol de ejecución Dynamo DB de AWS Lambda) tiene los permisos que la función necesita para leer elementos desde DynamoDB y escribir registros al CloudWatch Logs.

Creación de la función

A continuación se muestra código de ejemplo que recibe un evento de DynamoDB 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(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { console.log(record.eventID); console.log(record.eventName); console.log('DynamoDB Record: %j', record.dynamodb); }); callback(null, "message"); };

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 ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/lambda-dynamodb-role

Prueba de la función de Lambda

En este paso, invocará la función de Lambda manualmente mediante el comando invoke de la CLI de AWS Lambda y el siguiente evento de muestra de DynamoDB.

ejemplo input.txt

{ "Records":[ { "eventID":"1", "eventName":"INSERT", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"111", "SizeBytes":26, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"2", "eventName":"MODIFY", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "NewImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"New item!" }, "Id":{ "N":"101" } }, "SequenceNumber":"222", "SizeBytes":59, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" }, { "eventID":"3", "eventName":"REMOVE", "eventVersion":"1.0", "eventSource":"aws:dynamodb", "awsRegion":"us-east-1", "dynamodb":{ "Keys":{ "Id":{ "N":"101" } }, "OldImage":{ "Message":{ "S":"This item has changed" }, "Id":{ "N":"101" } }, "SequenceNumber":"333", "SizeBytes":38, "StreamViewType":"NEW_AND_OLD_IMAGES" }, "eventSourceARN":"stream-ARN" } ] }

Ejecute el siguiente comando invoke.

aws lambda invoke --function-name ProcessDynamoDBRecords --payload file://input.txt outputfile.txt
nota

Si utiliza la versión 2 de la AWS CLI, agregue los siguientes parámetros al comando:

--cli-binary-format raw-in-base64-out

La función devuelve la cadena message en el cuerpo de la respuesta.

Verifique la salida en el archivo outputfile.txt.

Crear una tabla de DynamoDB con un flujo habilitado

Crear una tabla de Amazon DynamoDB con un flujo habilitado.

Para crear una tabla de DynamoDB

  1. Abra la consola de DynamoDB.

  2. Seleccione Create table.

  3. Cree una tabla con la siguiente configuración:

    • Nombre de la tablalambda-dynamodb-stream

    • Primary key (Clave principal)id (cadena)

  4. Seleccione Create.

Habilitar secuencias

  1. Abra la consola de DynamoDB.

  2. Elija Tables (Tablas).

  3. Elija la tabla lambda-dynamodb-stream (Flujo de dynamodb lambda).

  4. En la pestaña Información general, elija Administrar flujo.

  5. Elija Enable.

Anote el ARN del flujo. Lo necesitará en el siguiente paso al asociar el flujo a la función de Lambda. Para obtener más información acerca de cómo habilitar flujos, consulte Captura de la actividad de las tablas con flujos de DynamoDB.

Añadir un origen de eventos en AWS Lambda

Crear un mapeo de origen de eventos en AWS Lambda. Este mapeo de origen de eventos asocia el flujo de DynamoDB a la función de Lambda. Una vez creado este mapeo de origen de eventos, AWS Lambda comienza a sondear el flujo.

Ejecute el comando siguiente AWS CLI create-event-source-mapping. Después de ejecutar el comando, anote el UUID. Necesitará este UUID para hacer referencia al mapeo de origen de eventos en los comandos, por ejemplo, al eliminar el mapeo de origen de eventos.

aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \ --batch-size 100 --starting-position LATEST --event-source DynamoDB-stream-arn

Esto crea un mapeo entre el flujo de DynamoDB especificado y la función de Lambda. Puede asociar un flujo de DynamoDB a varias funciones de Lambda, así como asociar la misma función de Lambda a varios flujos. Sin embargo, las funciones de Lambda compartirán el desempeño de lectura para el flujo que comparten.

Para obtener la lista de mapeos de orígenes de eventos, ejecute el siguiente comando.

aws lambda list-event-source-mappings

La lista devuelve todos los mapeos de orígenes de eventos creados, y para cada uno de ellos muestra el LastProcessingResult, entre otras cosas. Este campo se utiliza para proporcionar un mensaje informativo en caso de que surja algún problema. Los valores como No records processed (indica que AWS Lambda no ha comenzado el sondeo o que no hay registros en el flujo) y OK (indica que AWS Lambda ha leído correctamente los registros del flujo y ha invocado la función de Lambda) indican que no hay ningún problema. Si hay algún problema, recibirá un mensaje de error.

Si tiene muchos mapeos de origen de eventos, use la función nombrar parámetro para reducir los resultados.

aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords

Prueba de la configuración

Probar la experiencia integral. A medida que se actualiza la tabla, DynamoDB escribe los registros de eventos en el flujo. Cuando AWS Lambda sondea el flujo, detecta nuevos registros en él e invoca la función Lambda en nombre del usuario pasando eventos a esta.

  1. En la consola de DynamoDB, añada, actualice y elimine elementos de la tabla. DynamoDB escribe registros de estas acciones en el flujo.

  2. AWS Lambda sondea el flujo y, cuando detecta actualizaciones en este, invoca la función de Lambda pasando los datos de eventos que encuentra en el flujo.

  3. La función se ejecuta y crea registros en Amazon CloudWatch. Puede verificar los registros reportados en la consola de Amazon CloudWatch.

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

Eliminar la tabla DynamoDB

  1. Abra la Página de Tablas de la consola de DynamoDB.

  2. Seleccione la tabla que ha creado.

  3. Elija Eliminar.

  4. Escriba delete en el cuadro de texto.

  5. Elija Eliminar.