Tutorial: Uso de AWS Lambda con Amazon DocumentDB Streams - AWS Lambda

Tutorial: Uso de AWS Lambda con Amazon DocumentDB Streams

En este tutorial, creará una función de Lambda básica que consuma eventos de un flujo de cambios de Amazon DocumentDB (con compatibilidad con MongoDB). Para completar este tutorial, pasará por las siguientes etapas:

  • Configure su clúster de Amazon DocumentDB, conéctese a él y active los flujos de cambios en él.

  • Cree la función de Lambda y configure el clúster de Amazon DocumentDB como origen de eventos para su función.

  • Para probar la configuración integral, inserte elementos en la base de datos de Amazon DocumentDB.

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.

Crear el entorno AWS Cloud9

Paso 1: crear un entorno de AWS Cloud9

Antes de crear la función de Lambda, debe crear y configurar el clúster de Amazon DocumentDB. Los pasos para configurar el clúster de este tutorial se basan en el procedimiento de Introducción a Amazon DocumentDB.

nota

Si ya tiene configurado un clúster de Amazon DocumentDB, asegúrese de activar los flujos de cambios y crear los puntos de conexión de VPC de interfaz necesarios. Luego puede pasar directamente a los pasos de creación de la función.

Primero, cree un entorno AWS Cloud9. Utilizará este entorno a lo largo de este tutorial para conectarse a su clúster de Amazon DocumentDB y hacer consultas en él.

Para crear un entorno de AWS Cloud9, realice los siguientes pasos:
  1. Abra la consola de AWS Cloud9 y elija Crear entorno.

  2. Cree un entorno con la siguiente configuración:

    • En Detalles:

      • Nombre: DocumentDBCloud9Environment

      • Tipo de entorno: nueva instancia de EC2

    • En Nueva instancia de EC2:

      • Tipo de instancia: t2.micro (1 GiB de RAM + 1 vCPU)

      • Plataforma: Amazon Linux 2

      • Tiempo de espera: 30 minutos

    • En Configuración de red:

      • Conexión: AWS Systems Manager (SSM)

      • Expanda el menú desplegable Configuración de VPC.

      • Nube privada virtual (VPC) de Amazon: elija su VPC predeterminada.

      • Subred: sin preferencia

    • Conserve todas las otras opciones de configuración predeterminadas.

  3. Seleccione Crear. Aprovisionar el nuevo entorno de AWS Cloud9 puede tardar varios minutos.

Creación del grupo de seguridad de Amazon EC2

Paso 2: creación de un grupo de seguridad de Amazon EC2

A continuación, cree un grupo de seguridad de Amazon EC2 con reglas que permitan el tráfico entre el clúster de Amazon DocumentDB y el entorno de AWS Cloud9.

Para crear un grupo de seguridad de EC2
  1. Abra la consola de EC2. En Red y seguridad, elija Grupos de seguridad.

  2. Elija Creación de grupo de seguridad.

  3. Cree un grupo de seguridad con la siguiente configuración:

    • En Detalles básicos:

      • Security group name (Nombre de grupo de seguridad: DocDBTutorial

      • Descripción: grupo de seguridad para el tráfico entre AWS Cloud9 y Amazon DocumentDB.

      • VPC: seleccione la VPC predeterminada.

    • En Inbound rules (Reglas de entrada), elija Add rule (Agregar regla). Cree una regla con la siguiente configuración:

      • Tipo: TCP personalizado

      • Rango de puertos: 27017

      • Source (Fuente): Custom

      • En el cuadro de búsqueda situado junto a Origen, elija el grupo de seguridad para el entorno de AWS Cloud9 que creó en el paso anterior. Para ver una lista de los grupos de seguridad disponibles, ingrese cloud9 en el cuadro de búsqueda. Elija el grupo de seguridad con el nombre aws-cloud9-<environment_name>.

    • Conserve todas las otras opciones de configuración predeterminadas.

  4. Elija Creación de grupo de seguridad.

Creación de un clúster de Amazon DocumentDB

Paso 3: creación de un clúster de Amazon DocumentDB

En este paso, creará un clúster de Amazon DocumentDB con el grupo de seguridad del paso anterior.

Creación de un clúster de Amazon DocumentDB
  1. Abra la consola de Amazon DocumentDB. En Clústeres, elija Crear.

  2. Cree un clúster con la siguiente configuración:

    • En Tipo de clúster, elija Clúster basado en instancias.

    • En Configuración:

      • Versión del motor: 5.0.0

      • Clase de instancia: db.t3.medium (apta para prueba gratuita)

      • Número de instancias: 1

    • En Autenticación:

      • Ingrese el nombre de usuario y la contraseña necesarios para conectarse al clúster (las mismas credenciales que utilizó para crear el secreto en el paso anterior). En Confirmar contraseña, confirme la contraseña.

    • Active Mostrar configuración avanzada.

    • En Configuración de red:

      • Nube privada virtual (VPC): elija su VPC predeterminada.

      • Grupo de subred: predeterminado

      • Grupos de seguridad de VPC: además de default (VPC), elija el grupo de seguridad DocDBTutorial (VPC) que creó en el paso anterior.

    • Conserve todas las otras opciones de configuración predeterminadas.

  3. Elija Create cluster. Aprovisionar el clúster de Amazon DocumentDB puede llevar varios minutos.

Crear un secreto en Secrets Manager

Paso 4: crear un secreto en Secrets Manager

Para acceder al clúster de Amazon DocumentDB de forma manual, debe proporcionar las credenciales de nombre de usuario y contraseña. Para que Lambda acceda al clúster, debe proporcionar un secreto de Secrets Manager que contenga estas mismas credenciales de acceso al configurar la asignación de orígenes de eventos. En este paso, creará este secreto.

Para crear un secreto en Secrets Manager
  1. Abra la consola de Secrets Manager y elija Almacenar un nuevo secreto.

  2. En Elegir tipo de secreto, elija las siguientes opciones:

    • En Detalles básicos:

      • Tipo de secreto: credenciales para la base de datos de Amazon DocumentDB

      • En Credenciales, ingrese el nombre de usuario y la contraseña que utilizará para acceder al clúster de Amazon DocumentDB.

      • Base de datos: elija su clúster de Amazon DocumentDB.

      • Elija Siguiente.

  3. En Configurar secreto, elija las siguientes opciones:

    • Nombre del secreto: DocumentDBSecret

    • Elija Siguiente.

  4. Elija Siguiente.

  5. Elija Almacenar.

  6. Actualice la consola para comprobar que ha guardado correctamente el secreto DocumentDBSecret.

Anote el ARN de su secreto. Lo necesitará en un paso posterior.

Instale el shell de mongo

Paso 5: instalar el intérprete de comandos de mongo

En este paso, instalará el intérprete de comandos de mongo en su entorno de AWS Cloud9. El intérprete de comandos de mongo es un programa de utilidad de línea de comandos que se utiliza para conectarse al clúster de Amazon DocumentDB y consultarlo.

Instalación del intérprete de comandos de mongo en el entorno de AWS Cloud9
  1. Abra la consola de AWS Cloud9. Junto al entorno DocumentDBCloud9Environment que creó anteriormente, haga clic en el enlace Abrir en la columna IDE de AWS Cloud9.

  2. En la ventana de terminal, cree el archivo de repositorio de MongoDB con el siguiente comando:

    echo -e "[mongodb-org-5.0] \nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/5.0/x86_64/\ngpgcheck=1 \nenabled=1 \ngpgkey=https://www.mongodb.org/static/pgp/server-5.0.asc" | sudo tee /etc/yum.repos.d/mongodb-org-5.0.repo
  3. A continuación, instale el intérprete de comandos de mongo con el siguiente comando:

    sudo yum install -y mongodb-org-shell
  4. Para cifrar los datos en tránsito, descargue la clave pública de Amazon DocumentDB. El siguiente comando descarga un archivo denominado global-bundle.pem:

    wget https://truststore.pki.rds.amazonaws.com/global/global-bundle.pem

Conexión al clúster de Amazon DocumentDB

Paso 6: conexión al clúster de Amazon DocumentDB

Ya tiene todo listo para conectarse a su clúster de Amazon DocumentDB mediante el intérprete de comandos de mongo.

Conexión al clúster de Amazon DocumentDB
  1. Abra la consola de Amazon DocumentDB. En Clústeres, elija su clúster al seleccionar su identificador de clúster.

  2. En la pestaña Conectividad y seguridad, en Conectar a este clúster con el shell mongo, elija Copiar.

  3. En su entorno de AWS Cloud9, pegue este comando en el terminal. Sustituya <insertYourPassword> por la contraseña correcta.

Tras introducir este comando, si en el símbolo del sistema aparece rs0:PRIMARY>, está conectado a su clúster de Amazon DocumentDB.

Activar flujos de cambios

Paso 7: activar flujos de cambios

En este tutorial, hará un seguimiento de los cambios en la colección products de la base de datos docdbdemo en el clúster de Amazon DocumentDB. Para ello, active los flujos de cambios. Primero, cree la base de datos docdbdemo e inserte un registro para probarla.

Para crear una nueva base de datos dentro del clúster
  1. En su entorno de AWS Cloud9, asegúrese de seguir conectado al clúster de Amazon DocumentDB.

  2. En la ventana de terminal, use el siguiente comando para crear una nueva base de datos llamada docdbdemo:

    use docdbdemo
  3. Luego use el siguiente comando para insertar un registro en docdbdemo:

    db.products.insert({"hello":"world"})

    Debería ver un resultado con un aspecto similar al siguiente:

    WriteResult({ "nInserted" : 1 })
  4. Utilice el siguiente comando para enumerar todas las bases de datos:

    show dbs

    Asegúrese de que el resultado contenga la base de datos docdbdemo:

    docdbdemo 0.000GB

A continuación, active los flujos de cambios en la colección products de la base de datos docdbdemo con el siguiente comando:

db.adminCommand({modifyChangeStreams: 1, database: "docdbdemo", collection: "products", enable: true});

Debería ver un resultado con un aspecto similar al siguiente:

{ "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }

Creación de puntos de conexión de VPC de interfaz

Paso 8: crear puntos de conexión de VPC de interfaz

A continuación, cree puntos de conexión de VPC de interfaz para garantizar que Lambda y Secrets Manager (que se utilizarán más adelante para almacenar nuestras credenciales de acceso al clúster) puedan conectarse a su VPC predeterminada.

Cómo crear puntos de conexión de VPC de interfaz
  1. Abra la consola de VPC. En el menú de la izquierda, en Nube privada virtual, seleccione Puntos de conexión.

  2. Elija Crear punto de conexión. Cree un punto de conexión con la siguiente configuración:

    • En Etiqueta de nombre, ingrese lambda-default-vpc.

    • En Categoría de servicios, elija Servicios de AWS.

    • En Servicios, ingrese lambda en el cuadro de búsqueda. Elija el servicio con formato com.amazonaws.<region>.lambda.

    • En VPC, seleccione su VPC predeterminada.

    • En Subredes, marque las casillas situadas junto a cada zona de disponibilidad. Elija el ID de subred correcto para cada zona de disponibilidad.

    • En Tipo de dirección IP, seleccione IPv4.

    • En Grupos de seguridad, elija el grupo de seguridad de VPC predeterminado (nombre del grupo de default) y el grupo de seguridad que creó anteriormente (nombre del grupo de DocDBTutorial).

    • Conserve todas las otras opciones de configuración predeterminadas.

    • Elija Crear punto de conexión.

  3. Elija nuevamente Crear punto de conexión. Cree un punto de conexión con la siguiente configuración:

    • En Etiqueta de nombre, ingrese secretsmanager-default-vpc.

    • En Categoría de servicios, elija Servicios de AWS.

    • En Servicios, ingrese secretsmanager en el cuadro de búsqueda. Elija el servicio con formato com.amazonaws.<region>.secretsmanager.

    • En VPC, seleccione su VPC predeterminada.

    • En Subredes, marque las casillas situadas junto a cada zona de disponibilidad. Elija el ID de subred correcto para cada zona de disponibilidad.

    • En Tipo de dirección IP, seleccione IPv4.

    • En Grupos de seguridad, elija el grupo de seguridad de VPC predeterminado (nombre del grupo de default) y el grupo de seguridad que creó anteriormente (nombre del grupo de DocDBTutorial).

    • Conserve todas las otras opciones de configuración predeterminadas.

    • Elija Crear punto de conexión.

Esto completa la parte de configuración del clúster de este tutorial.

Creación del rol de ejecución

Paso 9: crear el rol de ejecución

En la siguiente serie de pasos, creará la función de Lambda. Primero, debe crear el rol de ejecución que concederá a su función permiso para acceder al clúster. Para ello, primero creará una política de IAM y luego asociará esta política a un rol de IAM.

Para crear una política de IAM
  1. En la consola de IAM, abra la página Políticas, y, a continuación, elija Crear política.

  2. Seleccione la pestaña JSON. En la siguiente política, sustituya el ARN del recurso de Secrets Manager en la última línea de la instrucción por el ARN secreto anterior y copie la política en el editor.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "LambdaESMNetworkingAccess", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface", "ec2:DescribeNetworkInterfaces", "ec2:DescribeVpcs", "ec2:DeleteNetworkInterface", "ec2:DescribeSubnets", "ec2:DescribeSecurityGroups", "kms:Decrypt" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMAccess", "Effect": "Allow", "Action": [ "rds:DescribeDBClusters", "rds:DescribeDBClusterParameters", "rds:DescribeDBSubnetGroups" ], "Resource": "*" }, { "Sid": "LambdaDocDBESMGetSecretValueAccess", "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:DocumentDBSecret" } ] }
  3. Elija Siguiente: Etiquetas y, a continuación, seleccione Siguiente: Revisar.

  4. En Name (Nombre), ingrese AWSDocumentDBLambdaPolicy.

  5. Seleccione Crear política.

Creación del rol de IAM
  1. Abra la página Roles en la consola de IAM y elija Crear rol.

  2. En Seleccionar entidad de confianza, elija las siguientes opciones:

    • Tipo de entidad de confianza: servicio de AWS

    • Caso de uso: Lambda

    • Elija Siguiente.

  3. En Agregar permisos, elija la política AWSDocumentDBLambdaPolicy que acaba de crear y también AWSLambdaBasicExecutionRole para conceder a su función permisos para escribir en los Registros de Amazon CloudWatch.

  4. Elija Siguiente.

  5. En Role name (Nombre del rol), introduzca AWSDocumentDBLambdaExecutionRole.

  6. Elija Create role (Crear rol).

Crear la función de Lambda

Paso 10: crear la función de Lambda

El siguiente código de ejemplo recibe un evento de Amazon DocumentDB como entrada y procesa el mensaje que contiene.

.NET
AWS SDK for .NET
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante .NET.

using Amazon.Lambda.Core; using System.Text.Json; using System; using System.Collections.Generic; using System.Text.Json.Serialization; //Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class. [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] namespace LambdaDocDb; public class Function { /// <summary> /// Lambda function entry point to process Amazon DocumentDB events. /// </summary> /// <param name="event">The Amazon DocumentDB event.</param> /// <param name="context">The Lambda context object.</param> /// <returns>A string to indicate successful processing.</returns> public string FunctionHandler(Event evnt, ILambdaContext context) { foreach (var record in evnt.Events) { ProcessDocumentDBEvent(record, context); } return "OK"; } private void ProcessDocumentDBEvent(DocumentDBEventRecord record, ILambdaContext context) { var eventData = record.Event; var operationType = eventData.OperationType; var databaseName = eventData.Ns.Db; var collectionName = eventData.Ns.Coll; var fullDocument = JsonSerializer.Serialize(eventData.FullDocument, new JsonSerializerOptions { WriteIndented = true }); context.Logger.LogLine($"Operation type: {operationType}"); context.Logger.LogLine($"Database: {databaseName}"); context.Logger.LogLine($"Collection: {collectionName}"); context.Logger.LogLine($"Full document:\n{fullDocument}"); } public class Event { [JsonPropertyName("eventSourceArn")] public string EventSourceArn { get; set; } [JsonPropertyName("events")] public List<DocumentDBEventRecord> Events { get; set; } [JsonPropertyName("eventSource")] public string EventSource { get; set; } } public class DocumentDBEventRecord { [JsonPropertyName("event")] public EventData Event { get; set; } } public class EventData { [JsonPropertyName("_id")] public IdData Id { get; set; } [JsonPropertyName("clusterTime")] public ClusterTime ClusterTime { get; set; } [JsonPropertyName("documentKey")] public DocumentKey DocumentKey { get; set; } [JsonPropertyName("fullDocument")] public Dictionary<string, object> FullDocument { get; set; } [JsonPropertyName("ns")] public Namespace Ns { get; set; } [JsonPropertyName("operationType")] public string OperationType { get; set; } } public class IdData { [JsonPropertyName("_data")] public string Data { get; set; } } public class ClusterTime { [JsonPropertyName("$timestamp")] public Timestamp Timestamp { get; set; } } public class Timestamp { [JsonPropertyName("t")] public long T { get; set; } [JsonPropertyName("i")] public int I { get; set; } } public class DocumentKey { [JsonPropertyName("_id")] public Id Id { get; set; } } public class Id { [JsonPropertyName("$oid")] public string Oid { get; set; } } public class Namespace { [JsonPropertyName("db")] public string Db { get; set; } [JsonPropertyName("coll")] public string Coll { get; set; } } }
Go
SDK para Go V2
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumir un evento de Amazon DocumentDB con Lambda utilizando Go.

package main import ( "context" "encoding/json" "fmt" "github.com/aws/aws-lambda-go/lambda" ) type Event struct { Events []Record `json:"events"` } type Record struct { Event struct { OperationType string `json:"operationType"` NS struct { DB string `json:"db"` Coll string `json:"coll"` } `json:"ns"` FullDocument interface{} `json:"fullDocument"` } `json:"event"` } func main() { lambda.Start(handler) } func handler(ctx context.Context, event Event) (string, error) { fmt.Println("Loading function") for _, record := range event.Events { logDocumentDBEvent(record) } return "OK", nil } func logDocumentDBEvent(record Record) { fmt.Printf("Operation type: %s\n", record.Event.OperationType) fmt.Printf("db: %s\n", record.Event.NS.DB) fmt.Printf("collection: %s\n", record.Event.NS.Coll) docBytes, _ := json.MarshalIndent(record.Event.FullDocument, "", " ") fmt.Printf("Full document: %s\n", string(docBytes)) }
Java
SDK para Java 2.x
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Cómo consumir un evento de Amazon DocumentDB con Lambda mediante Java.

import java.util.List; import java.util.Map; import com.amazonaws.services.lambda.runtime.Context; import com.amazonaws.services.lambda.runtime.RequestHandler; public class Example implements RequestHandler<Map<String, Object>, String> { @SuppressWarnings("unchecked") @Override public String handleRequest(Map<String, Object> event, Context context) { List<Map<String, Object>> events = (List<Map<String, Object>>) event.get("events"); for (Map<String, Object> record : events) { Map<String, Object> eventData = (Map<String, Object>) record.get("event"); processEventData(eventData); } return "OK"; } @SuppressWarnings("unchecked") private void processEventData(Map<String, Object> eventData) { String operationType = (String) eventData.get("operationType"); System.out.println("operationType: %s".formatted(operationType)); Map<String, Object> ns = (Map<String, Object>) eventData.get("ns"); String db = (String) ns.get("db"); System.out.println("db: %s".formatted(db)); String coll = (String) ns.get("coll"); System.out.println("coll: %s".formatted(coll)); Map<String, Object> fullDocument = (Map<String, Object>) eventData.get("fullDocument"); System.out.println("fullDocument: %s".formatted(fullDocument)); } }
JavaScript
SDK para JavaScript (v3)
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante JavaScript.

console.log('Loading function'); exports.handler = async (event, context) => { event.events.forEach(record => { logDocumentDBEvent(record); }); return 'OK'; }; const logDocumentDBEvent = (record) => { console.log('Operation type: ' + record.event.operationType); console.log('db: ' + record.event.ns.db); console.log('collection: ' + record.event.ns.coll); console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2)); };

Consumo de un evento de Amazon DocumentDB con Lambda mediante TypeScript

import { DocumentDBEventRecord, DocumentDBEventSubscriptionContext } from 'aws-lambda'; console.log('Loading function'); export const handler = async ( event: DocumentDBEventSubscriptionContext, context: any ): Promise<string> => { event.events.forEach((record: DocumentDBEventRecord) => { logDocumentDBEvent(record); }); return 'OK'; }; const logDocumentDBEvent = (record: DocumentDBEventRecord): void => { console.log('Operation type: ' + record.event.operationType); console.log('db: ' + record.event.ns.db); console.log('collection: ' + record.event.ns.coll); console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2)); };
PHP
SDK para PHP
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante PHP.

<?php require __DIR__.'/vendor/autoload.php'; use Bref\Context\Context; use Bref\Event\Handler; class DocumentDBEventHandler implements Handler { public function handle($event, Context $context): string { $events = $event['events'] ?? []; foreach ($events as $record) { $this->logDocumentDBEvent($record['event']); } return 'OK'; } private function logDocumentDBEvent($event): void { // Extract information from the event record $operationType = $event['operationType'] ?? 'Unknown'; $db = $event['ns']['db'] ?? 'Unknown'; $collection = $event['ns']['coll'] ?? 'Unknown'; $fullDocument = $event['fullDocument'] ?? []; // Log the event details echo "Operation type: $operationType\n"; echo "Database: $db\n"; echo "Collection: $collection\n"; echo "Full document: " . json_encode($fullDocument, JSON_PRETTY_PRINT) . "\n"; } } return new DocumentDBEventHandler();
Python
SDK para Python (Boto3)
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante Python.

import json def lambda_handler(event, context): for record in event.get('events', []): log_document_db_event(record) return 'OK' def log_document_db_event(record): event_data = record.get('event', {}) operation_type = event_data.get('operationType', 'Unknown') db = event_data.get('ns', {}).get('db', 'Unknown') collection = event_data.get('ns', {}).get('coll', 'Unknown') full_document = event_data.get('fullDocument', {}) print(f"Operation type: {operation_type}") print(f"db: {db}") print(f"collection: {collection}") print("Full document:", json.dumps(full_document, indent=2))
Ruby
SDK para Ruby
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante Ruby.

require 'json' def lambda_handler(event:, context:) event['events'].each do |record| log_document_db_event(record) end 'OK' end def log_document_db_event(record) event_data = record['event'] || {} operation_type = event_data['operationType'] || 'Unknown' db = event_data.dig('ns', 'db') || 'Unknown' collection = event_data.dig('ns', 'coll') || 'Unknown' full_document = event_data['fullDocument'] || {} puts "Operation type: #{operation_type}" puts "db: #{db}" puts "collection: #{collection}" puts "Full document: #{JSON.pretty_generate(full_document)}" end
Rust
SDK para Rust
nota

Hay más en GitHub. Busque el ejemplo completo y aprenda a configurar y ejecutar en el repositorio de ejemplos de tecnología sin servidor.

Consumo de un evento de Amazon DocumentDB con Lambda mediante Rust.

use lambda_runtime::{service_fn, tracing, Error, LambdaEvent}; use aws_lambda_events::{ event::documentdb::{DocumentDbEvent, DocumentDbInnerEvent}, }; // Built with the following dependencies: //lambda_runtime = "0.11.1" //serde_json = "1.0" //tokio = { version = "1", features = ["macros"] } //tracing = { version = "0.1", features = ["log"] } //tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] } //aws_lambda_events = "0.15.0" async fn function_handler(event: LambdaEvent<DocumentDbEvent>) ->Result<(), Error> { tracing::info!("Event Source ARN: {:?}", event.payload.event_source_arn); tracing::info!("Event Source: {:?}", event.payload.event_source); let records = &event.payload.events; if records.is_empty() { tracing::info!("No records found. Exiting."); return Ok(()); } for record in records{ log_document_db_event(record); } tracing::info!("Document db records processed"); // Prepare the response Ok(()) } fn log_document_db_event(record: &DocumentDbInnerEvent)-> Result<(), Error>{ tracing::info!("Change Event: {:?}", record.event); Ok(()) } #[tokio::main] async fn main() -> Result<(), Error> { tracing_subscriber::fmt() .with_max_level(tracing::Level::INFO) .with_target(false) .without_time() .init(); let func = service_fn(function_handler); lambda_runtime::run(func).await?; Ok(()) }
Para crear la función de Lambda
  1. Copie el código de muestra en un archivo con el nombre index.js.

  2. Cree un paquete de despliegue con el siguiente comando.

    zip function.zip index.js
  3. Use el siguiente comando de la CLI para crear la función. Sustituya us-east-1 por la Región de AWS y 123456789012 por el ID de su cuenta.

    aws lambda create-function \ --function-name ProcessDocumentDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs22.x \ --region us-east-1 \ --role arn:aws:iam::123456789012:role/AWSDocumentDBLambdaExecutionRole

Crear la asignación de orígenes de eventos de Lambda

Paso 11: crear la asignación de orígenes de eventos de Lambda

Cree la asignación de orígenes de eventos que asocie su flujo de cambios de Amazon DocumentDB a la función de Lambda. Una vez creada esta asignación de orígenes de eventos, AWS Lambda comienza a sondear el flujo.

Para crear la asignación de orígenes de eventos
  1. Abra la página Funciones en la consola de Lambda.

  2. Elija la función ProcessDocumentDBRecords que creó anteriormente.

  3. Elija la pestaña Configuración y, a continuación, elija Desencadenadores en el menú de la izquierda.

  4. Elija Add trigger (Añadir disparador).

  5. En Configuración del desencadenador, para el origen, seleccione Amazon DocumentDB.

  6. Cree la asignación de orígenes de eventos con la siguiente configuración:

    • Clúster de Amazon DocumentDB: elija el clúster que creó anteriormente.

    • Nombre de base de datos: docdbdemo

    • Nombre de la colección: products

    • Tamaño del lote: 1

    • Posición inicial: más reciente

    • Autenticación: BASIC_AUTH

    • Clave de Secrets Manager: elija el DocumentDBSecret que acaba de crear.

    • Intervalo del lote: 1

    • Configuración de documentos completa: UpdateLookup

  7. Elija Agregar. Crear la asignación de orígenes de eventos puede tardar unos minutos.

Probar la función: invocación manual

Paso 12: probar la función con una invocación manual

Para comprobar que ha creado correctamente la función y la asignación de orígenes de eventos, invoque la función con el comando invoke. Para ello, primero copie el siguiente evento JSON en un archivo llamado input.txt:

{ "eventSourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:canaryclusterb2a659a2-qo5tcmqkcl03", "events": [ { "event": { "_id": { "_data": "0163eeb6e7000000090100000009000041e1" }, "clusterTime": { "$timestamp": { "t": 1676588775, "i": 9 } }, "documentKey": { "_id": { "$oid": "63eeb6e7d418cd98afb1c1d7" } }, "fullDocument": { "_id": { "$oid": "63eeb6e7d418cd98afb1c1d7" }, "anyField": "sampleValue" }, "ns": { "db": "docdbdemo", "coll": "products" }, "operationType": "insert" } } ], "eventSource": "aws:docdb" }

Luego use el siguiente comando para invocar la función con este evento:

aws lambda invoke \ --function-name ProcessDocumentDBRecords \ --cli-binary-format raw-in-base64-out \ --region us-east-1 \ --payload file://input.txt out.txt

Debería ver una respuesta como la siguiente:

{ "StatusCode": 200, "ExecutedVersion": "$LATEST" }

Puede comprobar que su función procesó correctamente el evento al consultar los Registros de CloudWatch.

Cómo verificar la invocación manual mediante los Registros de CloudWatch
  1. Abra la página Funciones en la consola de Lambda.

  2. Elija la pestaña Supervisión y luego elija Ver Registros de CloudWatch. Esto lo lleva al grupo de registro específico asociado a su función en la consola de CloudWatch.

  3. Elija el flujo de registros más reciente. Dentro de los mensajes de registro, debería ver el JSON del evento.

Probar la función: insertar un registro

Paso 13: insertar un registro para probar la función.

Para probar su configuración integral, interactúe directamente con la base de datos de Amazon DocumentDB. En la siguiente serie de pasos, insertará un registro, lo actualizará y, a continuación, lo eliminará.

Para insertar un registro
  1. Vuelva a conectarse al clúster de Amazon DocumentDB en su entorno de AWS Cloud9.

  2. Use este comando para asegurarse de que está usando la base de datos docdbdemo:

    use docdbdemo
  3. Inserte un registro en la colección products de la base de datos docdbdemo:

    db.products.insert({"name":"Pencil", "price": 1.00})

Probar la función: actualizar un registro

Paso 14: actualizar un registro para probar la función.

A continuación, actualice el registro que acaba de insertar con el siguiente comando:

db.products.update( { "name": "Pencil" }, { $set: { "price": 0.50 }} )

Compruebe que su función procesó correctamente este evento al consultar los Registros de CloudWatch.

Probar la función: eliminar un registro

Paso 15: eliminar un registro para probar la función.

Por último, elimine el registro que acaba de actualizar con el siguiente comando:

db.products.remove( { "name": "Pencil" } )

Compruebe que su función procesó correctamente este evento al consultar los Registros de CloudWatch.

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.

Cómo eliminar la función de Lambda
  1. Abra la página de Funciones en la consola de Lambda.

  2. Seleccione la función que ha creado.

  3. Elija Acciones, Eliminar.

  4. Escriba confirm en el campo de entrada de texto y elija Delete(Eliminar).

Cómo eliminar el rol de ejecución
  1. Abra la página Roles en la consola de IAM.

  2. Seleccione el rol de ejecución que creó.

  3. Elija Eliminar.

  4. Si desea continuar, escriba el nombre del rol en el campo de entrada de texto y elija Delete (Eliminar).

Para eliminar los puntos de conexión de VPC
  1. Abra la consola de VPC. En el menú de la izquierda, en Nube privada virtual, seleccione Puntos de conexión.

  2. Seleccione los puntos de conexión que ha creado.

  3. Elija Acciones, Eliminar puntos de conexión de VPC.

  4. Introduzca delete en el campo de entrada de texto.

  5. Elija Eliminar.

Para eliminar el clúster de Amazon DocumentDB
  1. Abra la consola de Amazon DocumentDB.

  2. Elija el clúster de Amazon DocumentDB que creó para este tutorial y deshabilite la protección contra la eliminación.

  3. En la página principal Clústeres, vuelva a elegir el clúster de Amazon DocumentDB.

  4. Elija Acciones, Eliminar.

  5. En Crear instantánea final del clúster, seleccione No.

  6. Introduzca delete en el campo de entrada de texto.

  7. Elija Eliminar.

Para eliminar el secreto en Secrets Manager
  1. Abra la consola de Secrets Manager.

  2. Elija el secreto que ha creado para este tutorial.

  3. Elija Acciones, Eliminar secreto.

  4. Elija Schedule deletion.

Para eliminar el grupo de seguridad de Amazon EC2
  1. Abra la consola de EC2. En Red y seguridad, elija Grupos de seguridad.

  2. Seleccione el grupo de seguridad que ha creado para este tutorial.

  3. Elija Acciones, Eliminar grupos de seguridad.

  4. Elija Eliminar.

Eliminación del entorno de AWS Cloud9
  1. Abra la consola de AWS Cloud9.

  2. Seleccione el entorno que creó para este tutorial.

  3. Elija Eliminar.

  4. Introduzca delete en el campo de entrada de texto.

  5. Elija Eliminar.