Processar eventos do Amazon DocumentDB com o Lambda - AWS Lambda

Processar eventos do Amazon DocumentDB com o Lambda

Você pode usar uma função do Lambda para processar eventos em um fluxo de alterações do Amazon DocumentDB (compatível com MongoDB) ao configurar um cluster do Amazon DocumentDB como uma origem do evento. Em seguida, você pode automatizar workloads orientadas por eventos invocando a função do Lambda sempre que os dados são alterados com o cluster do Amazon DocumentDB.

nota

O Lambda é compatível somente com as versões 4.0 e 5.0 do Amazon DocumentDB. O Lambda não é compatível com a versão 3.6.

Além disso, para os mapeamentos da origem do evento, o Lambda oferece suporte somente a clusters baseados em instâncias e a clusters regionais. O Lambda não é compatível com clusters elásticos ou clusters globais. Essa limitação não se aplica ao usar o Lambda como cliente para se conectar ao Amazon DocumentDB. O Lambda pode se conectar a todos os tipos de cluster para realizar operações CRUD.

O Lambda processa eventos dos fluxos de alterações do Amazon DocumentDB sequencialmente na ordem em que chegam. Consequentemente, a função só pode processar uma invocação simultânea do Amazon DocumentDB de cada vez. Para monitorar a função, você pode rastrear as métricas de simultaneidade dela.

Atenção

Os mapeamentos da origem do evento do Lambda processam cada evento ao menos uma vez, podendo haver o processamento duplicado de registros. Para evitar possíveis problemas relacionados a eventos duplicados, é altamente recomendável tornar o código da função idempotente. Para saber mais, consulte Como tornar minha função do Lambda idempotente no Centro de Conhecimentos da AWS.

Exemplo de evento do Amazon DocumentDB

{ "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": "test_database", "coll": "test_collection" }, "operationType": "insert" } } ], "eventSource": "aws:docdb" }

Para obter mais informações sobre os eventos neste exemplo e suas formas, consulte Alterar eventos no site de documentação do MongoDB.

Pré-requisitos e permissões

Antes que você possa usar o Amazon DocumentDB como origem do evento a sua função do Lambda, observe os pré-requisitos a seguir. Você deve:

  • Ter um cluster do Amazon DocumentDB existente na mesma Conta da AWS e Região da AWS como sua função. Se você não tiver um cluster existente, poderá criar um seguindo as etapas em Get Started with Amazon DocumentDB no Guia do desenvolvedor do Amazon DocumentDB. Como alternativa, o primeiro conjunto de etapas do Tutorial: uso do AWS Lambda com o Amazon DocumentDB Streams orientará você ao longo do processo de criação de um cluster do Amazon DocumentDB com todos os pré-requisitos necessários.

  • Permitir que o Lambda tenha acesso aos recursos da Amazon Virtual Private Cloud (Amazon VPC) associados ao cluster do Amazon DocumentDB. Para ter mais informações, consulte Configuração de rede.

  • Habilitar o TLS no cluster do Amazon DocumentDB. Essa é a configuração padrão. Se você desabilitar o TLS, o Lambda não poderá se comunicar com o cluster.

  • Ativar os fluxos de alterações no cluster do Amazon DocumentDB. Para obter mais informações, consulte Usar fluxos de alterações com o Amazon DocumentDB no Guia do desenvolvedor do Amazon DocumentDB.

  • Fornecer ao Lambda credenciais para acessar o cluster  do Amazon DocumentDB. Ao configurar a origem do evento, forneça a chave AWS Secrets Manager que contém os detalhes de autenticação (nome de usuário e senha) necessários para acessar o cluster. Para fornecer essa chave durante a configuração, execute uma das seguintes ações:

    • Se você estiver usando o console do Lambda para configurar, forneça essa chave no campo chave do Secrets Manager.

    • Se você estiver usando o AWS Command Line Interface (AWS CLI) para configuração, forneça essa chave na opção source-access-configurations. Você pode incluir essa opção com o comando create-event-source-mapping ou o comando update-event-source-mapping. Por exemplo:

      aws lambda create-event-source-mapping \ ... --source-access-configurations '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-west-2:123456789012:secret:DocDBSecret-AbC4E6"}]' \ ...
  • Conceder permissões ao Lambda para gerenciar recursos relacionados ao fluxo do Amazon DocumentDB. Adicione manualmente as seguintes permissões à função de execução da função:

  • Manter o tamanho dos eventos de fluxos de alterações do Amazon DocumentDB que você envia para o Lambda abaixo de 6 MB. O Lambda suporta apenas cargas úteis de até 6 MB. Se seu fluxo de alterações tentar enviar ao Lambda um evento maior que 6 MB, o Lambda descartará a mensagem e emitirá a métrica OversizedRecordCount. O Lambda emite todas as métricas com base no melhor esforço.

nota

Embora as funções do Lambda normalmente tenham um limite máximo de tempo de 15 minutos, os mapeamentos da origem dos eventos para o Amazon MSK, o Apache Kafka autogerenciado, o Amazon DocumentDB e o Amazon MQ para ActiveMQ e RabbitMQ são compatíveis somente com funções com limites máximos de tempo limite de 14 minutos. Essa restrição garante que o mapeamento da origem do evento possa solucionar adequadamente os erros de função e repetições.

Configuração de rede

Para que o Lambda use seu cluster do Amazon DocumentDB como uma origem de eventos, ele precisa de acesso à Amazon VPC na qual o cluster reside. Recomendamos implantar endpoints da VPC do AWS PrivateLink para o Lambda acessar sua VPC. Implante um endpoint da VPC para o Lambda e, se o cluster usar autenticação, implante também um endpoint da VPC para o Secrets Manager.

Como alternativa, verifique se a VPC associada ao cluster do  Amazon DocumentDB contém um gateway NAT por sub-rede pública. Para ter mais informações, consulte Habilitar o acesso à Internet para funções do Lambda conectadas à VPC.

Se você usa endpoints da VPC, também deve configurá-los para habilitar nomes DNS privados.

Quando você cria um mapeamento da origem do evento para um cluster do Amazon DocumentDB, o Lambda verifica se as interfaces de rede elástica (ENIs) já estão presentes nas sub-redes e nos grupos de segurança da VPC do seu cluster. Se o Lambda encontrar ENIs existentes, ele tentará reutilizá-las. Caso contrário, o Lambda criará novas ENIs para se conectar à origem do evento e invocar sua função.

nota

As funções do Lambda sempre são executadas em VPCs de propriedade do serviço Lambda. Essas VPCs recebem manutenção automática do serviço e não são visíveis para os clientes. Você também pode conectar sua função a uma Amazon VPC. Em ambos os casos, a configuração de VPC da sua função não afetará o mapeamento da origem do evento. Somente a configuração da VPC da origem de eventos determina o modo de conexão do Lambda à sua origem de eventos.

Regras de grupos de segurança da VPC

Configure com as seguintes regras (no mínimo) os grupos de segurança da Amazon VPC que contêm seu cluster:

  • Regras de entrada: permita todo o tráfego na porta do cluster do Amazon DocumentDB para os grupos de segurança especificados para sua origem do evento. O Amazon DocumentDB usa a porta 27017 por padrão.

  • Regras de saída: permitir todo o tráfego na porta 443 para todos os destinos. Permita todo o tráfego na porta do cluster do Amazon DocumentDB. O Amazon DocumentDB usa a porta 27017 por padrão.

  • Se você estiver usando endpoints da VPC em vez de um gateway NAT, os grupos de segurança associados aos endpoints da VPC deverão permitir todo o tráfego de entrada na porta 443 dos grupos de segurança da fonte de eventos.

Trabalhar com endpoints da VPC

Quando você usa endpoints da VPC, as chamadas de API para invocar sua função são roteadas por esses endpoints usando as ENIs. A entidade principal do serviço Lambda precisa chamar lambda:InvokeFunction para quaisquer funções que usem essas ENIs.

Por padrão, os endpoints da VPC têm políticas do IAM que são abertas. A prática recomendada é restringir essas políticas a fim de permitir somente que entidades principais específicas executem as ações necessárias usando esse endpoint. Para garantir que seu mapeamento da origem do evento seja capaz de invocar sua função do Lambda, a política de endpoint da VPC deve permitir que a entidade principal do serviço Lambda chame lambda:InvokeFunction. A restrição de suas políticas de endpoint da VPC para apenas permitir chamadas de API originadas em sua organização impedirá o funcionamento adequado do mapeamento da origem do evento.

O seguinte exemplo de políticas de endpoint da VPC mostra como conceder o acesso necessário aos endpoints do Lambda.

exemplo Política de endpoint da VPC: endpoint do Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

Se o seu cluster do Amazon DocumentDB usar autenticação, você também poderá restringir a política de endpoint da VPC para o endpoint do Secrets Manager. Para chamar a API do Secrets Manager, o Lambda usa seu perfil de função, e não a entidade principal de serviço do Lambda. O exemplo a seguir mostra uma política de endpoint do Secrets Manager.

exemplo Política de endpoint da VPC: endpoint do Secrets Manager.
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

Criar um mapeamento da origem do evento do Amazon DocumentDB (console)

Para que uma função do Lambda faça leituras de um fluxo de alterações de um cluster do Amazon DocumentDB, crie um mapeamento da origem do evento. Esta seção descreve como fazer isso pelo console do Lambda. Para obter o AWS SDK e instruções da AWS CLI, consulte Criar um mapeamento da origem do evento do Amazon DocumentDB (SDK ou CLI).

Para criar um mapeamento da origem do evento do Amazon DocumentDB (console)
  1. Abra a página Funções do console do Lambda.

  2. Escolha o nome de uma função.

  3. Em Visão geral da função, escolha Adicionar gatilho.

  4. Em Configuração do acionador, na lista suspensa, escolha DocumentDB.

  5. Configure as opções necessárias e escolha Add (Adicionar).

O Lambda oferece suporte às seguintes opções de origem do evento do Amazon DocumentDB:

  • Cluster do DocumentDB: selecione um cluster do Amazon DocumentDB.

  • Ativar acionador: escolha se você deseja ativar o acionador imediatamente. Se você marcar esta caixa de seleção, a função começará imediatamente a receber tráfego do fluxo de alterações do Amazon DocumentDB especificado após a criação do mapeamento da origem do evento. Recomendamos desmarcar a caixa de seleção para criar o mapeamento da origem do evento em um estado desativado para testes. Após a criação, é possível ativar o mapeamento da origem do evento a qualquer momento.

  • Nome do banco de dados: insira o nome de um banco de dados do cluster a ser consumido.

  • (Opcional) Nome da coleção: insira o nome de uma coleção no banco de dados a ser consumida. Se você não especificar uma coleção, o Lambda receberá todos os eventos de cada coleção no banco de dados.

  • Tamanho do lote: defina o número máximo de mensagens a serem recuperadas em um único lote, até 10 mil. O tamanho padrão do lote é 100.

  • Posição inicial: escolha a posição no fluxo para começar a ler registros.

    • Mais recente: processe somente novos registros adicionados ao fluxo. Sua função começa a processar registros somente depois que o Lambda termina de criar a origem do evento. Isso significa que alguns registros podem ser descartados até que a origem do evento seja criada com sucesso.

    • Trim horizon (Redução horizontal): processe todos os registros na transmissão. O Lambda usa a duração da retenção de logs do cluster para determinar por onde começar a ler os eventos. Especificamente, o Lambda começa a ler a partir de current_time - log_retention_duration. O fluxo de alterações já deve estar ativo antes desse carimbo de data e hora para que o Lambda leia corretamente todos os eventos.

    • At timestamp (Na data e hora): processe registros a partir de uma hora específica. O fluxo de alterações já deve estar ativo antes do carimbo de data e hora especificado para que o Lambda leia corretamente todos os eventos.

  • Autenticação: escolha o método de autenticação para acessar os agentes do Kafka no cluster.

    • BASIC_AUTH: com a autenticação básica, é necessário fornecer a chave do Secrets Manager que contém as credenciais para acessar o cluster.

  • Chave do Secrets Manager: escolha a chave do Secrets Manager que contém os detalhes de autenticação (nome de usuário e senha) necessários para acessar o cluster do Amazon DocumentDB.

  • (Opcional) Janela de lote: defina o tempo máximo em segundos para reunir registros antes de invocar a função, até 300.

  • (Opcional) Configuração completa do documento: para operações de atualização de documentos, escolha o que você deseja enviar ao fluxo. O valor padrão é Default, o que significa que, para cada evento de fluxo de alterações, o Amazon DocumentDB enviará somente um delta descrevendo as alterações feitas. Para obter mais informações sobre esse campo, consulte FullDocument na documentação da API do Javadoc do MongoDB.

    • Padrão: o Lambda envia somente um documento parcial descrevendo as alterações feitas.

    • UpdateLookup: o Lambda envia um delta descrevendo as alterações, junto com uma cópia de todo o documento.

Criar um mapeamento da origem do evento do Amazon DocumentDB (SDK ou CLI)

Para criar ou gerenciar um mapeamento da origem do evento do Amazon DocumentDB com um AWS SDK, você pode usar as seguintes operações de API:

Para criar o mapeamento de origem de eventos com a AWS CLI, use o comando create-event-source-mapping. O exemplo a seguir usa esse comando para mapear uma função denominada my-function para um fluxo de alterações do Amazon DocumentDB. A origem do evento é especificada por um nome do recurso da Amazon (ARN), com um tamanho de lote de 500, a partir do timestamp no horário do Unix. O comando também especifica a chave do Secrets Manager que o Lambda usa para se conectar ao Amazon DocumentDB. Além disso, ele inclui parâmetros document-db-event-source-config que especificam o banco de dados e a coleção de onde serão feitas as leituras.

aws lambda create-event-source-mapping --function-name my-function \ --event-source-arn arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy --batch-size 500 \ --starting-position AT_TIMESTAMP \ --starting-position-timestamp 1541139109 \ --source-access-configurations '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-east-1:123456789012:secret:DocDBSecret-BAtjxi"}]' \ --document-db-event-source-config '{"DatabaseName":"test_database", "CollectionName": "test_collection"}' \

Você deve ver uma saída semelhante a:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 500, "DocumentDBEventSourceConfig": { "CollectionName": "test_collection", "DatabaseName": "test_database", "FullDocument": "Default" }, "MaximumBatchingWindowInSeconds": 0, "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "LastModified": 1541348195.412, "LastProcessingResult": "No records processed", "State": "Creating", "StateTransitionReason": "User action" }

Após a criação, você pode usar o comando update-event-source-mapping para atualizar as configurações da origem do evento do Amazon DocumentDB. O exemplo a seguir atualiza o tamanho do lote para 1 mil e a janela do lote para dez segundos. Para esse comando, é necessário o UUID do mapeamento da origem do evento, que pode ser recuperado usando o comando list-event-source-mapping ou o console do Lambda.

aws lambda update-event-source-mapping --function-name my-function \ --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \ --batch-size 1000 \ --batch-window 10

Você deve ver uma saída semelhante a:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "BatchSize": 500, "DocumentDBEventSourceConfig": { "CollectionName": "test_collection", "DatabaseName": "test_database", "FullDocument": "Default" }, "MaximumBatchingWindowInSeconds": 0, "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "LastModified": 1541359182.919, "LastProcessingResult": "OK", "State": "Updating", "StateTransitionReason": "User action" }

O Lambda atualiza as configurações de maneira assíncrona. Talvez você não veja essas alterações na saída até que o processo seja concluído. Para visualizar as configurações atuais do mapeamento da origem do evento, use o comando get-event-source-mapping.

aws lambda get-event-source-mapping --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b

Você deve ver uma saída semelhante a:

{ "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284", "DocumentDBEventSourceConfig": { "CollectionName": "test_collection", "DatabaseName": "test_database", "FullDocument": "Default" }, "BatchSize": 1000, "MaximumBatchingWindowInSeconds": 10, "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy", "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function", "LastModified": 1541359182.919, "LastProcessingResult": "OK", "State": "Enabled", "StateTransitionReason": "User action" }

Para excluir o mapeamento da origem do evento do  Amazon DocumentDB, use o comando delete-event-source-mapping.

aws lambda delete-event-source-mapping \ --uuid 2b733gdc-8ac3-cdf5-af3a-1827b3b11284

Posições iniciais de sondagem e fluxo

Esteja ciente de que a sondagem do fluxo durante a criação e as atualizações do mapeamento da origem do evento é, finalmente, consistente.

  • Durante a criação do mapeamento da origem do evento, pode levar alguns minutos para a sondagem de eventos do fluxo iniciar.

  • Durante as atualizações do mapeamento da origem do evento, pode levar alguns minutos para interromper e reiniciar a sondagem de eventos do fluxo.

Esse comportamento significa que, se você especificar LATEST como posição inicial do fluxo, o mapeamento da origem do evento poderá perder eventos durante a criação ou as atualizações. Para garantir que nenhum evento seja perdido, especifique a posição inicial do fluxo como TRIM_HORIZON ou AT_TIMESTAMP.

Monitorar a origem do evento do Amazon DocumentDB

Para ajudar você a monitorar a origem do evento do Amazon DocumentDB, o Lambda gera a métrica IteratorAge quando a função termina de processar um lote de registros. Idade do iterador é a diferença entre o carimbo de data e hora do evento mais recente e o carimbo de data e hora atual. Essencialmente a métrica IteratorAge indica a idade do último registro processado no lote. Se a função atualmente estiver processando novos eventos, você poderá usar a idade do iterador para estimar a latência entre quando um registro é adicionado e quando a função o processa. Uma tendência crescente em IteratorAge pode indicar problemas com a função. Para ter mais informações, consulte Visualizar métricas das funções do Lambda.

Os fluxos de alterações do Amazon DocumentDB não são otimizados para processar grandes intervalos de tempo entre os eventos. Se sua origem de eventos do Amazon DocumentDB não receber nenhum evento por um longo período de tempo, o Lambda poderá desabilitar o mapeamento da origem do evento. A duração desse período pode variar de algumas semanas a alguns meses, dependendo do tamanho do cluster e de outras workloads.

O Lambda é compatível com cargas úteis de até 6 MB. Entretanto, os eventos de fluxo de alterações do Amazon DocumentDB podem ter até 16 MB. Se seu fluxo de alterações tentar enviar ao Lambda um evento de fluxo de alterações maior que 6 MB, o Lambda descartará a mensagem e emitirá a métrica OversizedRecordCount. O Lambda emite todas as métricas com base no melhor esforço.