Tutorial: uso do AWS Lambda com o Amazon DocumentDB Streams - AWS Lambda

Tutorial: uso do AWS Lambda com o Amazon DocumentDB Streams

Neste tutorial, você criará uma função do Lambda que consome eventos de um stream de alterações do Amazon DocumentDB (compativel com MongoDB). Para concluir este tutorial, você passará pelos seguintes estágios:

  • Configure seu cluster Amazon DocumentDB, conecte-se a ele e ative streams de alterações nele.

  • Crie a função do Lambda e configure seu cluster do Amazon DocumentDB como uma origem de eventos para a sua função.

  • Teste a configuração de ponta a ponta inserindo itens no seu banco de dados do Amazon DocumentDB.

Pré-requisitos

Se você ainda não tem Conta da AWS, siga as etapas a seguir para criar um.

Para se cadastrar em uma Conta da AWS
  1. Abra https://portal.aws.amazon.com/billing/signup.

  2. Siga as instruções online.

    Parte do procedimento de inscrição envolve receber uma chamada telefônica e inserir um código de verificação no teclado do telefone.

    Quando você se cadastra em uma Conta da AWS, um Usuário raiz da conta da AWS é criado. O usuário raiz tem acesso a todos os Serviços da AWS e atributos na conta. Como prática recomendada de segurança, atribua o acesso administrativo a um usuário e use somente o usuário-raiz para executar tarefas que exigem acesso de usuário-raiz.

A AWS envia um e-mail de confirmação depois que o processo de cadastramento é concluído. A qualquer momento, é possível visualizar as atividades da conta atual e gerenciar sua conta acessando https://aws.amazon.com/ e selecionando Minha conta.

Depois de se cadastrar em uma Conta da AWS, proteja seu Usuário raiz da conta da AWS, habilite o AWS IAM Identity Center e crie um usuário administrativo para não usar o usuário raiz em tarefas cotidianas.

Proteger seu Usuário raiz da conta da AWS
  1. Faça login no AWS Management Console como o proprietário da conta ao escolher a opção Usuário raiz e inserir o endereço de e-mail da Conta da AWS. Na próxima página, insira sua senha.

    Para obter ajuda ao fazer login usando o usuário raiz, consulte Fazer login como usuário raiz no Guia do usuário do Início de Sessão da AWS.

  2. Habilite a autenticação multifator (MFA) para o usuário raiz.

    Para obter instruções, consulte Habilitar um dispositivo MFA virtual para o usuário raiz de sua conta da Conta da AWS (console) no Guia do usuário do IAM.

Criar um usuário com acesso administrativo
  1. Habilitar o IAM Identity Center.

    Para obter instruções, consulte Habilitar AWS IAM Identity Center no Guia do usuário do AWS IAM Identity Center.

  2. No Centro de Identidade do IAM, conceda o acesso administrativo para um usuário.

    Para obter um tutorial sobre como usar o Diretório do Centro de Identidade do IAM como fonte de identidade, consulte Configurar o acesso dos usuários com o Diretório do Centro de Identidade do IAM padrão no Guia do usuário do AWS IAM Identity Center.

Iniciar sessão como o usuário com acesso administrativo
  • Para fazer login com seu usuário do Centro de Identidade do IAM, use o URL de login que foi enviado ao seu endereço de e-mail quando você criou o usuário do Centro do Usuário do IAM.

    Para obter ajuda com o login utilizando um usuário do Centro de Identidade do IAM, consulte Fazer login no portal de acesso da AWS, no Guia do usuário do Início de Sessão da AWS.

Atribuir acesso a usuários adicionais
  1. No Centro de Identidade do IAM, crie um conjunto de permissões que siga as práticas recomendadas de aplicação de permissões com privilégio mínimo.

    Para obter instruções, consulte Create a permission set no Guia do usuário do AWS IAM Identity Center.

  2. Atribua usuários a um grupo e, em seguida, atribua o acesso de autenticação única ao grupo.

    Para obter instruções, consulte Add groups no Guia do usuário do AWS IAM Identity Center.

Se você ainda não instalou a AWS Command Line Interface, siga as etapas em Instalar ou atualizar a versão mais recente da AWS CLI para instalá-la.

O tutorial requer um terminal de linha de comando ou um shell para executar os comandos. No Linux e no macOS, use o gerenciador de pacotes e de shell de sua preferência.

nota

No Windows, alguns comandos da CLI do Bash que você costuma usar com o Lambda (como zip) não são compatíveis com os terminais integrados do sistema operacional. Para obter uma versão do Ubuntu com o Bash integrada no Windows, instale o Subsistema do Windows para Linux.

Criar o ambiente do AWS Cloud9

Etapa 1: criar um ambiente do AWS Cloud9

Antes de criar a função do Lambda, é necessário criar e configurar seu cluster do Amazon DocumentDB. As etapas para configurar seu cluster neste tutorial são baseadas no procedimento em Comece a usar o Amazon DocumentDB.

nota

Se você já tem um cluster do Amazon DocumentDB configurado, ative os streams de alterações e crie os endpoints da VPC de interface necessários. Em seguida, é possível pular diretamente para as etapas de criação da função.

Primeiro, crie um ambiente do AWS Cloud9. Você usará esse ambiente ao longo deste tutorial para se conectar e consultar seu cluster do Amazon DocumentDB.

Para criar um ambiente do AWS Cloud9
  1. Abra o console do AWS Cloud9 e escolha Criar ambiente.

  2. Crie um ambiente com a seguinte configuração:

    • Em Detalhes:

      • Nome: DocumentDBCloud9Environment

      • Tipo de ambiente: nova instância do EC2

    • Em Nova instância do EC2:

      • Tipo de instância: t2.micro (1 GiB RAM + 1 vCPU)

      • Plataforma: Amazon Linux 2

      • Tempo limite: 30 minutos

    • Em Configurações de rede:

      • Conexão: AWS Systems Manager (SSM)

      • Expanda o menu suspenso Configurações da VPC.

      • Nuvem privada virtual (VPC) da Amazon: escolha sua VPC padrão.

      • Sub-rede: sem preferências

    • Mantenha todas as outras configurações como o padrão.

  3. Escolha Criar. O provisionamento do seu novo ambiente do AWS Cloud9 pode levar alguns minutos.

Criar o grupo de segurança do Amazon EC2

Etapa 2: criar um grupo de segurança do Amazon EC2

Em seguida, crie um grupo de segurança do Amazon EC2 com regras que permitam o tráfego entre seu cluster do Amazon DocumentDB e seu ambiente AWS Cloud9.

Para criar um grupo de segurança do EC2
  1. Abra o console do EC2. Em Rede e segurança, escolha Grupos de segurança.

  2. Escolha Create security group (Criar grupo de segurança).

  3. Crie um grupo de segurança com a seguinte configuração:

    • Em Detalhes básicos:

      • Security group name (Nome do grupo de segurança: DocDBTutorial

      • Descrição: grupo de segurança para tráfego entre o AWS Cloud9 e o Amazon DocumentDB.

      • VPC: escolha sua VPC padrão.

    • Em Inbound rules (Regras de entrada), escolha Add rule (Adicionar regra). Crie uma regra com a seguinte configuração:

      • Tipo: TCP personalizado

      • Intervalo de portas: 27.017

      • Source (Origem): personalizado

      • Na caixa de pesquisa ao lado de Origem, escolha o grupo de segurança para o ambiente do AWS Cloud9 que você criou na etapa anterior. Para ver uma lista dos grupos de segurança disponíveis, insira cloud9 na caixa de pesquisa. Escolha o grupo de segurança com o nome aws-cloud9-<environment_name>.

    • Mantenha todas as outras configurações como o padrão.

  4. Escolha Create security group (Criar grupo de segurança).

Criar o cluster do Amazon DocumentDB

Etapa 3: criar um cluster do Amazon DocumentDB

Nesta etapa, você criará um cluster do Amazon DocumentDB usando o grupo de segurança da etapa anterior.

Para criar um cluster do Amazon DocumentDB
  1. Abra o console do Amazon DocumentDB. Em Clusters, escolha Criar.

  2. Crie um cluster com a seguinte configuração:

    • Em Tipo de cluster, escolha Cluster baseado em instância.

    • Em Configuração:

      • Versão do mecanismo: 5.0.0

      • Classe de instância: db.t3.medium (elegível para avaliação gratuita)

      • Número de instâncias: 1.

    • Em Autenticação:

      • Insira o Nome de usuário e a Senha necessários para conectar ao seu cluster (as mesmas credenciais que você usou para criar o segredo na etapa anterior). Em Confirmar senha, confirme sua senha.

    • Ative Exibir configurações avançadas.

    • Em Configurações de rede:

      • Nuvem privada virtual (VPC): escolha sua VPC padrão.

      • Grupo da sub-rede: padrão

      • Grupos de segurança da VPC: além de default (VPC), escolha o grupo de segurança DocDBTutorial (VPC) que criou na etapa anterior.

    • Mantenha todas as outras configurações como o padrão.

  3. Selecione Criar cluster. O provisionamento do seu cluster do Amazon DocumentDB pode levar vários minutos.

Criar o segredo no Secrets Manager

Etapa 4: criar um segredo no Secrets Manager

Para acessar seu cluster do Amazon DocumentDB manualmente, é necessário fornecer credenciais de nome de usuário e senha. Para que o Lambda acesse seu cluster, é necessário informar um secredo do Secrets Manager que contenha essas mesmas credenciais de acesso ao configurar seu mapeamento da origem do evento. Nesta etapa, você criará esse segredo.

Para criar o segredo no Secrets Manager
  1. Abra o console do Secrets Manager e escolha Armazenar um novo segredo.

  2. Em Escolha o tipo de segredo, selecione as seguintes opções:

    • Em Detalhes básicos:

      • Tipo de segredo: credenciais para o banco de dados do Amazon DocumentDB

      • Em Credenciais, insira o nome de usuário e a senha que você usará para acessar seu cluster do Amazon DocumentDB.

      • Banco de dados: escolha seu cluster do Amazon DocumentDB.

      • Escolha Próximo.

  3. Em Configurar segredo, escolha as seguintes opções:

    • Nome de segredo: DocumentDBSecret

    • Escolha Próximo.

  4. Escolha Próximo.

  5. Escolha Armazenar.

  6. Atualize o console para verificar se você armazenou o segredo DocumentDBSecret com êxito.

Anote o ARN do segredo do seu segredo. Você precisará dele em uma etapa posterior.

Instale o shell do mongo

Etapa 5: instalar o shell do Mongo

Nesta etapa, você instalará o shell do Mongo em seu ambiente AWS Cloud9. O shell do Mongo é um utilitário de linha de comando que você usa para se conectar e consultar seu cluster do Amazon DocumentDB.

Para instalar o shell do Mongo em seu ambiente AWS Cloud9
  1. Abra o console de AWS Cloud9. Ao lado do ambiente DocumentDBCloud9Environment que você criou anteriormente, clique no link Abrir abaixo da coluna IDE do AWS Cloud9.

  2. Na janela do terminal, crie o arquivo do repositório do MongoDB com o seguinte 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. Em seguida, instale o shell do Mongo com o seguinte comando:

    sudo yum install -y mongodb-org-shell
  4. Para criptografar dados em trânsito, faça download da chave pública do Amazon DocumentDB. O comando a seguir faz download de um arquivo de nome global-bundle.pem:

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

Conectar ao cluster do Amazon DocumentDB

Etapa 6: conectar ao cluster do Amazon DocumentDB

Agora você está pronto para se conectar ao seu cluster do Amazon DocumentDB usando o shell do Mongo.

Para conectar ao cluster do Amazon DocumentDB
  1. Abra o console do Amazon DocumentDB. Em Clusters, escolha seu cluster escolhendo seu identificador de cluster.

  2. Na guia Conectividade e segurança, em Conectar a este cluster com o shell do Mongo, escolha Copiar.

  3. Em seu ambiente AWS Cloud9, cole esse comando no terminal. Substitua <insertYourPassword> pela senha correta.

Depois de inserir esse comando, se o prompt de comando se tornar rs0:PRIMARY>, você estará conectado ao seu cluster do Amazon DocumentDB.

Ativar os streams de alteração

Etapa 7: ativar os streams de alteração

Neste tutorial, você acompanhará as alterações na coleção de products do banco de dados docdbdemo em seu cluster do Amazon DocumentDB. Você faz isso com a ativação de streams de alterações. Primeiro, crie o banco de dados docdbdemo e teste-o, inserindo um registro.

Para criar um novo banco de dados em seu cluster
  1. Em seu ambiente AWS Cloud9, certifique-se de que você ainda esteja conectado ao seu cluster do Amazon DocumentDB.

  2. Na janela do terminal, use o comando a seguir para criar um novo banco de dados chamado docdbdemo:

    use docdbdemo
  3. Em seguida, use o comando a seguir para inserir um registro no docdbdemo:

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

    Você deve ver uma saída semelhante a:

    WriteResult({ "nInserted" : 1 })
  4. Use o comando a seguir para listar todos os bancos de dados:

    show dbs

    Certifique-se de que sua saída contenha o banco de dados docdbdemo:

    docdbdemo 0.000GB

Em seguida, ative os streams de alterações na coleção de products do banco de dados docdbdemo usando o seguinte comando:

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

Você deve ver uma saída semelhante a:

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

Criar endpoints da VPC de interface

Etapa 8: criar endpoints da VPC de interface

Em seguida, crie endpoints da VPC de interface para garantir que o Lambda e o Secrets Manager (usados posteriormente para armazenar nossas credenciais de acesso ao cluster) possam se conectar à sua VPC padrão.

Para criar endpoints da VPC de interface
  1. Abra o console da VPC. No menu à esquerda, em Nuvem privada virtual, escolha Endpoints.

  2. Escolha Criar endpoint. Crie um endpoint com a seguinte configuração:

    • Em Nomear tag, insira lambda-default-vpc.

    • Em Categoria do serviço, escolha serviços da AWS.

    • Em Serviços, insira lambda na caixa de pesquisa. Escolha o serviço com formato com.amazonaws.<region>.lambda.

    • Em VPC, escolha sua VPC padrão.

    • Em sub-redes, marque as caixas ao lado de cada zona de disponibilidade. Escolha O ID correto da sub-rede de cada zona de disponibilidade.

    • Em Tipo de endereço IP, selecione IPv4.

    • Em Grupos de segurança, escolha o grupo de segurança da VPC padrão (nome do grupo de default) e o grupo de segurança que você criou anteriormente (nome do grupo de DocDBTutorial).

    • Mantenha todas as outras configurações como o padrão.

    • Escolha Criar endpoint.

  3. Novamente, escolha Criar endpoint. Crie um endpoint com a seguinte configuração:

    • Em Nomear tag, insira secretsmanager-default-vpc.

    • Em Categoria do serviço, escolha serviços da AWS.

    • Em Serviços, insira secretsmanager na caixa de pesquisa. Escolha o serviço com formato com.amazonaws.<region>.secretsmanager.

    • Em VPC, escolha sua VPC padrão.

    • Em sub-redes, marque as caixas ao lado de cada zona de disponibilidade. Escolha O ID correto da sub-rede de cada zona de disponibilidade.

    • Em Tipo de endereço IP, selecione IPv4.

    • Em Grupos de segurança, escolha o grupo de segurança da VPC padrão (nome do grupo de default) e o grupo de segurança que você criou anteriormente (nome do grupo de DocDBTutorial).

    • Mantenha todas as outras configurações como o padrão.

    • Escolha Criar endpoint.

Isso conclui a parte de configuração de cluster deste tutorial.

Criar a função de execução

Etapa 9: criar o perfil de execução

No próximo conjunto de etapas, você criará sua função do Lambda. Primeiro, é necessário criar o perfil de execução que concede à sua função permissão para acessar o seu cluster. Você criará uma política do IAM primeiro e, em seguida, anexará essa política a um perfil do IAM.

Para criar uma política do IAM
  1. Abra a página Políticas no console do IAM e escolha Criar política.

  2. Escolha a guia JSON. Na política a seguir, substitua o ARN do recurso Secrets Manager na linha final da declaração pelo ARN do seu segredo de antes, e copie a política no 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. Escolha Próximo: Tags, e, em seguida, escolha Próximo: Revisar.

  4. Em Nome, insira AWSDocumentDBLambdaPolicy.

  5. Escolha Criar política.

Para criar perfil do IAM
  1. Abra a página Perfis no console do IAM e escolha Criar perfil.

  2. Em Selecionar entidade confiável, escolha as seguintes opções:

    • Tipo de entidade confiável: serviço da AWS

    • Caso de uso: Lambda

    • Escolha Próximo.

  3. Em Adicionar permissões, escolha a política AWSDocumentDBLambdaPolicy que você acabou de criar, bem como AWSLambdaBasicExecutionRole para conceder à sua função permissões para gravar no Amazon CloudWatch Logs.

  4. Escolha Próximo.

  5. Em Nome do perfil, insira AWSDocumentDBLambdaExecutionRole.

  6. Escolha Create role (Criar função).

Criar a função do Lambda

Etapa 10: criar a função do Lambda

O código de exemplo a seguir recebe uma entrada de evento do Amazon DocumentDB e processa a mensagem contida.

.NET
AWS SDK for .NET
nota

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Processando um evento do Amazon DocumentDB com o Lambda ao usar .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

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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)) }
JavaScript
SDK para JavaScript (v3)
nota

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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)); };

Consumir um evento do Amazon DocumentDB com o Lambda usando 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

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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

Há mais no GitHub. Encontre o exemplo completo e saiba como configurar e executar no repositório dos Exemplos sem servidor.

Consumir um evento do Amazon DocumentDB com o Lambda usando 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 criar a função do Lambda
  1. Copie o código de amostra em um arquivo chamado index.js.

  2. Crie um pacote de implantação com o comando a seguir.

    zip function.zip index.js
  3. Use o comando a seguir da CLI para criar a função. Substitua us-east-1 pela Região da AWS e 123456789012 pelo ID da sua conta.

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

Crie o mapeamento da origem do evento do Lambda

Etapa 11: criar o mapeamento da origem do evento do Lambda

Crie o mapeamento da origem do evento que associa o seu fluxo de alterações do Amazon DocumentDB à sua função do Lambda. Depois que você criar esse mapeamento da origem do evento, o AWS Lambda começará imediatamente a sondar o stream.

Para criar o mapeamento da origem do evento
  1. Abra a página Funções no console do Lambda.

  2. Escolha a função ProcessDocumentDBRecords criada anteriormente.

  3. Escolha a guia Configuração e, em seguida, escolha Acionadores no menu à esquerda.

  4. Escolha Add trigger.

  5. Em Configuração do acionador, para a origem, selecione Amazon DocumentDB.

  6. Crie o mapeamento da origem do evento com a seguinte configuração:

    • Cluster do Amazon DocumentDB: escolha o cluster que você criou anteriormente.

    • Nome do banco de dados: docdbdemo

    • Nome da coleção: produtos

    • Tamanho do lote: 1

    • Posição inicial: última

    • Autenticação: BASIC_AUTH

    • Chave do Secrets Manager: escolha o DocumentDBSecret que acabou de criar.

    • Janela do lote: 1

    • Configuração do documento completo: UpdateLookup

  7. Escolha Adicionar. A criação do mapeamento da origem do evento pode levar alguns minutos.

Teste sua função com invocação manual

Etapa 12: teste sua função com uma invocação manual

Para testar se você criou corretamente sua função e o mapeamento da origem do evento, invoque sua função usando o comando invoke. Para fazer isso, primeiro copie o evento JSON a seguir em um arquivo chamado 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" }

Em seguida, use o comando a seguir para invocar sua função com 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

Você verá uma resposta parecida com a seguinte:

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

É possível verificar se sua função processou o evento com êxito examinando o CloudWatch Logs.

Para verificar a invocação manual por meio do CloudWatch Logs
  1. Abra a página Funções no console do Lambda.

  2. Escolha a guia Monitor e selecione Visualizar logs do CloudWatch. Isso leva você ao grupo de logs específico associado à sua função no console do CloudWatch.

  3. Escolha o stream de logs mais recente. Nas mensagens de log, você deverá ver o evento JSON.

Teste sua função inserindo um registro

Etapa 13: teste sua função com a inserção de um registro.

Teste sua configuração de ponta a ponta interagindo diretamente com seu banco de dados do Amazon DocumentDB. No próximo conjunto de etapas, você inserirá um registro, o atualizará e o excluirá.

Para inserir um registro
  1. Reconecte-se ao seu cluster do Amazon DocumentDB em seu ambiente AWS Cloud9.

  2. Use este comando para garantir que você esteja usando o banco de dados docdbdemo no momento:

    use docdbdemo
  3. Insira um registro na coleção products do banco de dados docdbdemo:

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

Teste sua função atualizando um registro

Etapa 14: teste sua função com a atualização de um registro.

Em seguida, atualize o registro que você acabou de inserir com o seguinte comando:

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

Verifique se sua função processou o evento com êxito examinando o CloudWatch Logs.

Teste sua função excluindo um registro

Etapa 15: teste sua função com a exclusão de um registro.

Por fim, exclua o registro que você acabou de inserir com o seguinte comando:

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

Verifique se sua função processou o evento com êxito examinando o CloudWatch Logs.

Limpe os recursos

Agora você pode excluir os recursos criados para este tutorial, a menos que queira mantê-los. Excluindo os recursos da AWS que você não está mais usando, você evita cobranças desnecessárias em sua Conta da AWS.

Como excluir a função do Lambda
  1. Abra a página Functions (Funções) no console do Lambda.

  2. Selecione a função que você criou.

  3. Escolha Ações, Excluir.

  4. Digite delete no campo de entrada de texto e escolha Delete (Excluir).

Para excluir a função de execução
  1. Abra a página Roles (Funções) no console do IAM.

  2. Selecione a função de execução que você criou.

  3. Escolha Excluir.

  4. Insira o nome do perfil no campo de entrada de texto e escolha Delete (Excluir).

Para excluir os endpoints da VPC
  1. Abra o console da VPC. No menu à esquerda, em Nuvem privada virtual, escolha Endpoints.

  2. Selecione os endpoints que você criou.

  3. Escolha Actions (Ações), Delete VPC endpoints (Excluir endpoints da VPC).

  4. Digite delete no campo de entrada de texto.

  5. Escolha Excluir.

Para excluir o cluster do Amazon DocumentDB
  1. Abra o console do Amazon DocumentDB.

  2. Escolha o cluster do Amazon DocumentDB que você criou para este tutorial e desative a proteção contra exclusão.

  3. Na página principal de Clusters, escolha seu cluster do Amazon DocumentDB novamente.

  4. Escolha Ações, Excluir.

  5. Em Criar snapshot final do cluster, selecione Não.

  6. Digite delete no campo de entrada de texto.

  7. Escolha Excluir.

Para excluir o segredo no Secrets Manager
  1. Abra o console do Secrets Manager.

  2. Escolha o segredo que você criou para este tutorial.

  3. Escolha Ações, Excluir segredo.

  4. Escolha Schedule deletion.

Para excluir o grupo de segurança do Amazon EC2
  1. Abra o console do EC2. Em Rede e segurança, escolha Grupos de segurança.

  2. Selecione o grupo de segurança que você criou para este tutorial.

  3. Escolha Ações, Excluir grupos de segurança.

  4. Escolha Excluir.

Para excluir o ambiente AWS Cloud9
  1. Abra o console de AWS Cloud9.

  2. Selecione o ambiente que você criou para este tutorial.

  3. Escolha Excluir.

  4. Digite delete no campo de entrada de texto.

  5. Escolha Excluir.