Disparando Lambda através do Kinesis localmente com AWS SAM
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.
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
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:
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.”.
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.
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
.
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.