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
Tópicos
- Exemplo de evento do Amazon DocumentDB
- Pré-requisitos e permissões
- Configuração da segurança de rede
- Criar um mapeamento da origem do evento do Amazon DocumentDB (console)
- Criar um mapeamento da origem do evento do Amazon DocumentDB (SDK ou CLI)
- Posições iniciais de sondagem e fluxo
- Monitorar a origem do evento do Amazon DocumentDB
- Tutorial: uso do AWS Lambda com o Amazon DocumentDB Streams
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
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 da segurança 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 comandocreate-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 da segurança de rede
Para conceder ao Lambda acesso total ao Amazon DocumentDB por meio do mapeamento da origem do evento, seu cluster deve usar um endpoint público (endereço IP público) ou você deve fornecer acesso à Amazon VPC na qual o cluster foi criado.
Ao usar o Amazon DocumentDB com o Lambda, recomendamos a criação de endpoints de VPC do AWS PrivateLink para conceder acesso da sua função aos recursos na sua Amazon VPC.
nota
Os endpoints de VPC do AWS PrivateLink são necessários para funções com mapeamentos da origem de eventos que usam o modo padrão (sob demanda) para pesquisadores de eventos. Se o mapeamento da origem do evento usa o modo provisionado, você não precisa configurar endpoints de VPC do AWS PrivateLink.
Crie um endpoint para fornecer acesso aos seguintes recursos:
-
Lambda: crie um endpoint para a entidade principal de serviço do Lambda.
-
AWS STS: crie um endpoint para o AWS STS com a finalidade de possibilitar que uma entidade principal de serviço assuma um perfil em seu nome.
-
Secrets Manager: caso o seu cluster use o Secrets Manager para armazenar credenciais, crie um endpoint específico para o Secrets Manager.
Como alternativa, configure um gateway NAT em cada sub-rede pública da Amazon VPC. Para ter mais informações, consulte Habilitar o acesso à Internet para funções do Lambda conectadas à VPC.
Ao criar um mapeamento da origem do evento para o 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 configurados para a Amazon VPC. 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. A configuração de VPC da sua função não afetará o mapeamento da origem do evento. Somente a configuração de rede da origem dos eventos determina como o Lambda estabelece conexão com a origem dos eventos.
Configure os grupos de segurança para a Amazon VPC que contém o cluster. Por padrão, o Amazon DocumentDB faz uso das seguintes portas: 27017
.
-
Regras de entrada: permitem todo o tráfego na porta padrão do cluster para o grupo de segurança associado à origem dos eventos.
-
Regras de saída: permitir todo o tráfego na porta
443
para todos os destinos. Além disso, permitem todo o tráfego na porta padrão do cluster para o grupo de segurança associado à origem dos eventos. -
Regras de entrada para o endpoint da Amazon VPC: caso você esteja usando um endpoint da Amazon VPC, o grupo de segurança associado ao endpoint da Amazon VPC deve permitir o tráfego de entrada na porta
443
usando o grupo de segurança do cluster.
Caso o cluster use autenticação, é possível restringir a política de endpoint 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.
exemplo Política de endpoint da VPC: endpoint do Secrets Manager
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws::iam::123456789012:role/
my-role
" ] }, "Resource": "arn:aws::secretsmanager:us-west-2
:123456789012:secret:my-secret
" } ] }
Quando você usa os endpoints da Amazon VPC, a AWS roteia suas chamadas de API para invocar sua função usando a interface de rede elástica (ENI) do endpoint. A entidade principal do serviço Lambda precisa chamar lambda:InvokeFunction
para quaisquer perfis e funções que usem essas ENIs.
Por padrão, os endpoints da Amazon VPC têm políticas do IAM abertas que permitem amplo acesso aos recursos. A prática recomendada é restringir essas políticas para executar 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 sts:AssumeRole
e lambda:InvokeFunction
. A restrição de suas políticas de endpoint da VPC para permitir apenas chamadas de API originadas em sua organização impedirá o funcionamento adequado do mapeamento da origem do evento; portanto, "Resource": "*"
é necessário nessas políticas.
O seguinte exemplo de políticas de endpoint da VPC mostra como conceder o acesso necessário à entidade principal do serviço Lambda para os endpoints do AWS STS e Lambda.
exemplo Política de endpoint da VPC: endpoint do AWS STS
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
exemplo Política de endpoint da VPC: endpoint do Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
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)
Abra a página Funções
do console do Lambda. -
Escolha o nome de uma função.
-
Em Visão geral da função, escolha Adicionar gatilho.
-
Em Configuração do acionador, na lista suspensa, escolha DocumentDB.
-
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 FullDocumentna 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
Para criar o mapeamento de origem de eventos com a AWS CLI, use o comando create-event-source-mapping
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
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 Uso de métricas do CloudWatch com o 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.