AWS Lambda
Guia do desenvolvedor

Tutorial: como usar o AWS Lambda com o fluxo 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 o código de amostra em outras linguagens, consulte Código da função de amostra.

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 nodejs8.10 \ --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.

Crie uma tabela do DynamoDB com um fluxo 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 fluxos, consulte Captura de atividades de tabelas com os fluxos 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 (indicando que o AWS Lambda não iniciou a sondagem ou que não há registros no stream) e OK (indicando que o AWS Lambda foi bem-sucedido na leitura dos registros do stream 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 ou 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.