Tutorial: usar o AWS Lambda com streams do Amazon DynamoDB - AWS Lambda

Tutorial: usar o AWS Lambda com streams do Amazon DynamoDB

Neste tutorial, você cria uma função do Lambda para consumir eventos de um fluxo do Amazon DynamoDB.

Pré-requisitos

Este tutorial pressupõe que você tenha algum conhecimento das operações básicas do Lambda e do console do Lambda. Caso ainda não tenha feito isso, siga as instruções em Conceitos básicos do AWS Lambda para criar sua primeira função do Lambda.

Para seguir os procedimentos neste manual, você precisa de um terminal de linha de comando ou de um shell para executar os comandos. Nas listagens, os comandos são mostrados precedidos por um símbolo de prompt ($) e pelo nome do diretório atual, quando apropriado:

~/lambda-project$ this is a command this is output

Para comandos longos, um caractere de escape (\) é usado para dividir um comando em várias linhas.

No Linux e no macOS, use seu gerenciador preferido de pacotes e de shell. No Windows 10, você pode instalar o Subsistema Windows para Linux para obter uma versão do Ubuntu integrada com o Windows e o Bash.

Criar a função de execução

Crie a função de execução que dá à sua função permissão para acessar recursos do AWS.

Para criar uma função de execução

  1. Abra a página Roles no console do IAM.

  2. Selecione Create role.

  3. Crie uma função com as seguintes propriedades.

    • Entidade confiável – Lambda.

    • Permissions (Permissões)AWSLambdaDynamoDBExecutionRole.

    • Nome da funçãolambda-dynamodb-role.

O AWSLambdaDynamoDBExecutionRole tem as permissões necessárias para a função ler itens do DynamoDB e gravar logs no CloudWatch Logs.

Criar a função

O código de amostra a seguir recebe uma entrada de evento DynamoDB e processa as mensagens que ela contém. Na ilustração, o código grava alguns dos dados de eventos de entrada no CloudWatch Logs.

nota

Para ver o código de exemplo em outras linguagens, consulte Código de exemplo da função.

exemplo index.js

console.log('Loading function'); exports.handler = function(event, context, callback) { console.log(JSON.stringify(event, null, 2)); event.Records.forEach(function(record) { console.log(record.eventID); console.log(record.eventName); console.log('DynamoDB Record: %j', record.dynamodb); }); callback(null, "message"); };

Para criar a função

  1. Copie o código de amostra em um arquivo chamado index.js.

  2. Crie um pacote de implantação.

    $ zip function.zip index.js
  3. Crie uma função do Lambda com o comando create-function.

    $ aws lambda create-function --function-name ProcessDynamoDBRecords \ --zip-file fileb://function.zip --handler index.handler --runtime nodejs12.x \ --role arn:aws:iam::123456789012:role/lambda-dynamodb-role

Testar a função do Lambda

Nesta etapa, você invoca sua função do Lambda manualmente usando o comando da CLI do invokeAWS Lambda e o seguinte exemplo de evento do DynamoDB.

exemplo input.txt

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

Execute o seguinte comando invoke.

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

A função retorna a string message no corpo da resposta.

Verifique a saída no arquivo outputfile.txt.

Criar uma tabela do DynamoDB com um stream habilitado

Crie uma tabela do Amazon DynamoDB com um fluxo habilitado.

Para criar uma tabela do DynamoDB

  1. Abra o console do DynamoDB.

  2. Escolha Create table.

  3. Crie uma tabela com as configurações a seguir.

    • Table name (Nome da tabela)lambda-dynamodb-stream

    • Primary key (Chave primária)id (string)

  4. Escolha Criar.

Como habilitar fluxos

  1. Abra o console do DynamoDB.

  2. Escolha Tables (Tabelas).

  3. Escolha a tabela lambda-dynamodb-stream.

  4. Em Overview (Visão geral), escolha Manage stream (Gerenciar fluxo).

  5. Escolha Habilitar.

Anote o ARN do fluxo. Você precisará dele na próxima etapa quando for associar o fluxo à função do Lambda. Para obter mais informações sobre como habilitar streams, consulte Capturar atividades de tabelas com os streams do DynamoDB.

Adicionar uma fonte de eventos no AWS Lambda

Crie um mapeamento da fonte do evento no AWS Lambda. Este mapeamento da fonte do evento associa o fluxo do DynamoDB à função do Lambda. Depois de criar esse mapeamento da fonte do evento, o AWS Lambda começa a sondar o fluxo.

Execute o seguinte comando AWS CLI da create-event-source-mapping. Após a execução do comando, anote o UUID. Você precisará deste UUID para se referir ao mapeamento da fonte do evento em todos os comandos, por exemplo, ao excluir o mapeamento da fonte do evento.

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

Isso cria um mapeamento entre o fluxo do DynamoDB especificado e a função do Lambda. Você pode associar um fluxo do DynamoDB a várias funções do Lambda e associar a mesma função do Lambda a vários fluxos. No entanto, as funções do Lambda compartilharão a taxa de transferência de leitura para os fluxos dos quais compartilham.

Você pode obter a lista de mapeamentos de fontes de eventos executando o comando a seguir.

$ aws lambda list-event-source-mappings

Esta lista retorna todos os mapeamentos de fontes de eventos que você criou, e para cada mapeamento mostra o LastProcessingResult, entre outras coisas. Este campo será usado para fornecer uma mensagem informativa, se houver problemas. Valores como No records processed (indicação de que o AWS Lambda não iniciou a sondagem ou de que não há registros no fluxo) e OK (indicação de que o AWS Lambda foi bem-sucedido na leitura dos registros do fluxo e invocou a função do Lambda) indicam que não há problemas. Se houver problemas, você receberá uma mensagem de erro.

Se você tiver muitos mapeamentos da fonte do evento, use o parâmetro de nome da função para refinar os resultados.

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

Testar a configuração

Teste a experiência completa. À medida que você executa atualizações nas tabelas, o DynamoDB grava registros de eventos no fluxo. Quando o AWS Lambda sonda o fluxo, ele detecta novos registros no fluxo e executa a função do Lambda em seu nome, passando os eventos para a função.

  1. No console do DynamoDB, adicione, atualize e exclua itens da tabela. O DynamoDB grava registros dessas ações no fluxo.

  2. O AWS Lambda sonda o fluxo e, ao detectar atualizações nele, invoca a função do Lambda passando os dados do evento que ele encontrar no fluxo.

  3. Sua função executa e cria registros de log no Amazon CloudWatch. Você pode verificar os logs relatados no console do Amazon CloudWatch.