Neste post, irei falar sobre como fazer uma Integração no Slack com AWS Lambda.

REQUISITOS NECESSÁRIOS

Ferramentas necessárias para criar seu próprio WebHook:

  • Java 8 (caso deseje alterar o código fonte e utilizar como quiser)
  • Maven 3
  • Alguma IDE ou editor de texto para modificar o código fonte e enviar um webhook para o seu próprio canal no Slack
  • Uma API KEY do NewsApi (no código fonte, deixo a minha exposta, mas irei alterar por fins de segurança)

sobre o slack

O Slack é uma ferramenta de comunicação em times, amplamente utilizada no ambiente corporativo. Além de ser muito completo para comunicações entre usuários, o Slack fornece uma rica API REST para que possamos enviar mensagens automáticas (chat bots) para um determinado channel. Estes chat bots podem enviar o tipo de mensagem que você desejar: informações sobre os eventos da empresa, notícias, redirecionamento de chamadas e muitas outras coisas interessantes. Neste post, criaremos um chat bot para enviar as notícias mais lidas sobre Ciência e Tecnologia para um determinado channel, em uma abordagem completamente serverless, onde você não precisará se preocupar com infraestrutura. Interessante, né?
Para dar início, iremos configurar uma função Lambda na AWS. Mas primeiro, o que é uma Função AWS Lambda?

O QUE É AWS lambda?

AWS Lambda é uma função executada pela infraestrutura da Amazon que gerencia automaticamente os recursos necessários para você. Você não precisa configurar um Web Server para rodar esta função, a AWS cuidará de tudo para nós. 
No momento em que escrevo este post, as linguagens disponíveis para codificar uma função Lambda são: Java, C#, Python e NodeJS, sendo que estas duas útlimas são as linguagens que requerem menos recursos para serem executadas, mas iremos de Java neste post por dois motivos: é a linguagem que eu mais gosto e é a linguagem que tem menos material na Internet para trabalhar com AWS Lambda.

em que cenários eu devo utilizar uma arquitetura serverless?

Quando você precisar executar um job, realizar algum cálculo pesado, fazer redimensionamento de imagens, executar ações assíncronas e muito mais. É possível configurar a quantidade de memória RAM para as suas funções, portanto, se precisar de algo que exija muito processamento, fique a vontade para mudar as configurações da sua função.
Esta função Lambda será responsável por executar o nosso código quando quisermos (no nosso caso, usaremos uma Trigger no CloudWatch, também da AWS, para disparar a nossa função). A AWS Lambda está elegível para o Free Tier da Amazon, ou seja, se sua conta tem 01 ano ou menos, você pode utilizar este recurso sem custos. Após este período, qualquer usuário tem direito a 1 milhão de requests por mês gratuitos e paga U$ 0,20 por cada milhão de requests adicional (U$0,0000002 por request). Para concluir este tutorial, é necessário uma conta na AWS. Caso deseje somente ler este artigo, uma conta AWS não é necessária.

SLACK WEBHOOK

Antes de mais nada, vamos configurar uma URL para realizarmos requests POST no nosso Slack.
Para dar início, criei um channel no Slack e configurei um webhook. Para tal, veja https://api.slack.com/incoming-webhooks. Após criado, o Slack fornecerá uma URL que aceitará requests POST. Você pode escolher o channel, um emoji (como o nosso caso será um Bot, alterei o ícone para um robô) e até configurar um nome de exibição do nosso bot, que chamaremos de TopNews
integration settings aws lambda

TESTANDO O NOSSO WEBHOOK COM CURL

Com isso, já conseguimos enviar mensagens para o Slack. Usarei o curl para realizar um teste:
curl aws lambda
Podemos ver que o Slack nos respondeu com um HTTP 200 OK. Vamos ver se nossa request, de fato, gerou alguma coisa no channel que criamos.
slack hello world aws lambda
Sim, nosso canal foi notificado através da nossa request!

CRIANDO A NOSSA FUNÇÃO LAMBDA

Tudo que resta agora, é criamos nossa função Lambda e delegar a ela a execução da request para notificar o nosso canal no Slack.
Para continuarmos, vamos criar uma função Lambda na AWS . Basta seguir os passos a seguir:
1 – Navegue até https://console.aws.amazon.com, vá em Services, procure por Lambda e clique no link.
2 – Selecione a opção Create a Lambda Function e escolha uma Blank Function para continuar.

CONFIGURANDO UM EVENTO NO CLOUDWATCH

3 – Na próxima tela, clique no ícone tracejado conforme imagem a seguir e escolha CloudWatch Events – Schedule:

configure triggers aws lambda
Configure triggers

4 – Dê um nome para esta Rule. No nosso caso, ela se chamará DailySlackNotification. A Rule Description é opcional e você pode deixar em branco se quiser. Em Schedule Expression, escolha Cron (se você não é familiar com Cron, navegue até https://crontab.guru/ e faça alguns testes para ver como uma expressão funciona) e substitua os valores conforme imagem a seguir e, finalmente, habilite a Trigger selecionando o checkbox de Enable Trigger. Isto fará com que nossa função Lambda seja executada todos os dias as 10:00:00 GMT. Fique a vontade para configurar esta função como quiser.
configure trigger aws lambda
5 – Clique em Next
6 – Na tela a seguir, dê uma nome para a sua função. Irei chamá-la de LambdaSlackNotification. A Description pode ficar vazia, mas fique a vontade para popular este campo. O Runtime será Java 8. Faça o download do código no Github aqui. Navegue até a pasta do projeto e rode mvn package. Este comando irá gerar uma pasta target, abra a mesma, selecione o arquivo lambda-slack-notification-1.0-SNAPSHOT.jar e faça o Upload para a AWS.

ADICIONANDO A FUNÇÃO QUE SERÁ EXECUTADA PELA NOSSA TRIGGER

7 – No campo Handler, necessitamos colocar o full qualified name da nossa classe junto com o nome do método que invocará a nossa função Lambda. Preencha este campo com o seguinte valor: br.com.bluesoft.handler.SlackNotification::handleRequest
Este valor é exatamente onde nossa classe está localizada no projeto. O método handleRequest é o método que somos obrigados a implementar, caso contrário, não é possível invocar a nossa função através dos ambientes AWS.
8 – No campo Role, selecione “create custom role”, use os valores default e prossiga. Os outros dados podem permanecer como estão.
9 – Clique em Next.
aws lambda review
10 – Basta clicar em Create function e estamos prontos para testá-la.
11 – Navegue até a sua função e clique em Actions -> Configure Test Event e passe uma String vazia*, como na imagem a seguir:
aws lambda test
*Por limitações da AWS e até onde meu conhecimento me permite ir, não é possível passar um parâmetro para esta função a partir do CloudWatch, portanto, passamos uma String vazia para que a função funcione. Ao ser executada pelo CloudWatch, a função também receberá uma String vazia, portanto, conseguimos garantir que nossa função no cenário de testes é executada igualmente pelo CloudWatch.

HORA DE TESTAR A NOSSA FUNÇÃO

12 – Clique em Save and Test e pronto, tudo deve funcionar perfeitamente. Como combinamos, o nosso código busca as notícias mais lidas de TI no último dia e dispara uma ação para nosso channel no Slack. Veja a imagem a seguir para visualizar o que acabamos de fazer:
aws lambda response
Para realizar um post para o seu próprio WebHook, basta baixar o código fonte, abrir a classe HttpPostClient e modificar a constante SLACK_ENDPOINT
Parabéns por ter chegado até aqui, agora você tem uma função na AWS que integra com o Slack e você nem sequer precisa se preocupar com o servidor.
O mais legal é que você pode configurar sua função para rodar quando você quiser: as possibilidades são infinitas.
Ficou com alguma dúvida? Tem algo que gostaria de sugerir, criticar ou elogiar? Fique a vontade para utilizar os comentários abaixo.
Muito obrigado e até a próxima,
Um abraço!
Thales
Powered by http://NewsAPI.org

Autor

Wende Mendes é desenvolver na Bluesoft há mais de 13 anos. Atualmente, ele lidera uma grande equipe de desenvolvedores que atua no módulo de Comercial e Operações do software da Bluesoft.

Deixe aqui o seu comentário