Disparando Lambda através do Kinesis localmente com AWS SAM

Gustavo Oliveira
4 min readFeb 11, 2021

--

Ícones do AWS SAM, Lambda e Kinesis Data Stream

SAM (AWS Serverless Application Model) é um framework open-source construído com base no serviço de infraestrutura como código (IaC) da AWS, Cloudformation, específico para aplicações serverless. Uma de suas vantagens é permitir rodar aplicações serverless localmente para debug e testes sem custos. Neste tutorial eu vou demonstrar como utilizar o SAM para disparar uma função Lambda através de um evento do Kinesis Data Stream localmente.

Template SAM

SAM utiliza um arquivo de template chamado template.yaml para definir os recursos da aplicação. Segue um template básico com uma função Lambda.

Template SAM

Neste template estou especificando um recurso MyLambda de tipo AWS::Serverless::Function que se refere a uma função Lambda. Este recurso possui diversas propriedades que definem seu comportamento. Neste caso um arquivo main no caminho bin, escrito em Go, com 128 Mb de memória.

Código da Função Lambda

Código da função Lambda

O código acima é a função Lambda utilizado como exemplo neste tutorial. Ela basicamente recebe um evento Kinesis e imprime o dado do registro no console. O repositório completo pode ser encontrado aqui.

Rodando a Função Lambda Localmente

Para rodar uma função Lambda definida em um template SAM localmente, instale o SAM e utilize o comando abaixo.

sam local invoke MyLambda

Este comando roda a função sem um evento. Para adicionar um evento de disparo é necessário especificar o caminho para um arquivo JSON com o evento para o parâmetro --event (-e).

sam local invoke MyLambda -e event.json

Cada fonte de evento para funções Lambda (Kinesis, SQS, SNS…) possui sua própria estrutura. Você pode consultar a documentação para descobrir a estrutura específica de cada evento ou gerar uma amostra de evento.

Gerando Eventos

Para gerar uma estrutura de evento em JSON utilize o comando sam local generate-event. Neste tutorial será utilizado um evento do Kinesis Data Stream.

sam local generate-event kinesis get-records

Que retorna a seguinte estrutura JSON:

Saída do comando generate-event

Este evento pode conter diversos Records onde o conteúdo é armazenado na propriedade data como uma string codificada em base64 (https://docs.aws.amazon.com/kinesis/latest/APIReference/API_Record.html). Essa saída pode ser enviada diretamente para a função invoke.

sam local generate-event kinesis get-records | sam local invoke -e — MyLambda

O valor - no parâmetro -e insere JSON via stdin

Abaixo, podemos ver a saída do comando no console com o valor padrão decodificado da propriedade data “Hello, this is a test 123.”.

Retorno da função Lambda com conteúdo padrão

Gerando Eventos com Dados Customizados

Você pode alterar o valor da propriedade data no arquivo JSON (utilizando uma string base64) e rodar sam local invoke novamente, mas é mais fácil gerar um novo evento com conteúdo customizado através do parâmetro --data que recebe um texto normal.

sam local generate-event kinesis get-records --data “My custom content”

Geralmente o conteúdo é uma string JSON, porém, utilizar este formato na linha de comando não é produtivo. Minha solução é minimizar e converter em string o conteúdo do arquivo JSON de evento utilizando o popular processador de JSON em linha de comando jq e passar a saída para o parâmetro --data.

sam local generate-event kinesis get-records --data “$(jq -c < event.json)” | sam local invoke -e - MyLambda

Dessa forma você pode fazer alterações no arquivo JSON rapidamente e rodar o comando novamente com o evento atualizado. A seguir, podemos ver a saída do comando no console com a string JSON decodificada.

Retorno da função Lambda com JSON customizado

Extra

Uma prática comum em aplicações Go é utilizar o Makefile, que é um arquivo que contém definições de tarefas que podem ser executadas. Eu gosto de adicionar um target invoke para invocar a função Lambda localmente com a última versão do código compilado. Dessa maneira basta rodar make invoke.

Código do Makefile

Conclusão

É possível utilizar o SAM para testar e debugar aplicações serverless localmente sem custos e rapidamente gerar dados customizados para integrações entre recursos.

--

--

Gustavo Oliveira
Gustavo Oliveira

Responses (1)