Criando um serviço de monitoramento de sites altamente escalável em meia hora usando AWS Lambda

As funções da Lambda são um incrível tipo de tecnologia, se você não leu sobre a minha teoria de que o AWS Lambdas, sem servidor e, mais especificamente, vai conquistar o mundo em 2018 e depois verificá-lo aqui:

Como a computação sem servidor mudará o mundo em 2018
A computação sem servidor é um conceito bastante novo que já explodiu em termos de popularidade. Isso é em parte devido a … hackernoon.com

Ele conseguiu alguns leitores e, de alguma forma, foi marcado como um dos artigos médios mais lidos no dia 1 de janeiro … deve ter sido um dia de notícias lentas, eu acho.

O que o Serverless realmente pode fazer?

Está tudo muito bem, eu evangelizando essas tecnologias sem servidor, mas não mostra o verdadeiro potencial da tecnologia.

Então, em uma tentativa de mostrar o que é verdadeiramente possível com a Lambda's, pensei que eu iria reunir isso como guiar e mostrar o que poderia realmente ser feito com a tecnologia!

Apresentando UpTimeGirl – My Latest Million Dollar Startup

Neste artigo, vou construir um monitor de tempo de atividade do site que permitirá que as pessoas preencham um formulário e criará uma nova função lambda automaticamente para você, que verificará a saúde do seu site a cada 15 minutos e enviará um email se um desses sites morrer. Eu vou me concentrar mais nos conceitos orientados para Lambda e escovar coisas como o IAM e a criação de papéis.

Toda boa inicialização precisa de um nome cativante, então vamos chamar isso do serviço de monitoramento do site UpTimeGirl como um pouco de homenagem a Billy Joel?

Disclaimer: Se você fizer um milhão de dólares com essa idéia, espero pelo menos uma cerveja !!

Requisitos

Como este é um projeto de software, ele precisa de um conjunto de requisitos, caso contrário, como seremos capazes de definir qualquer forma de sucesso de nosso projeto? Como eu quero construir uma solução de monitoramento de vários milhões de dólares de classe mundial para todos os meus sites, eu quero que ele tenha os seguintes requisitos:

  • Nunca deve descer.
  • Deve ser barato para correr. Precisamos maximizar os lucros, é claro.
  • DEVE avisar-me sempre que um site desça, seja por texto ou por email
  • Deve escalar para centenas, se não milhares de sites.

Um conjunto bastante razoável de requisitos para um projeto que vamos montar em menos de meia hora, acho que você concordará.

O Frontend

O Frontend será um simples aplicativo VueJS que contará com uma caixa de entrada que levará novos sites a monitorar e uma lista de telhas mostrando os sites já registrados.

Por que VueJS? – Atualmente estou tentando aprender e achou por que não?

Este será apenas um frontend muito simples que ficará assim:

Se você quiser o código-fonte para isso, você poderá encontrá-lo no meu github repo aqui: https://github.com/elliotforbes/uptimegirl

Atualmente, estou usando apenas uma solicitação HTTP GET muito simples para ativar a API Python que constrói as funções lambda.

A API

A API será escrita em Python e usará o SDK Boto3 AWS para me permitir interagir com as várias APIs da AWS. Esta API terá essencialmente um URL e o time_period e gerará dinamicamente e criará uma nova função Lambda com base nesses parâmetros.

Disclaimer: posso garantir que esta não esteja preparada para produção.

Neste pedaço de código, criamos uma simples API de RESTAURo aiohttp no Python 3.6. Isso incluirá 2 pontos finais principais, um ponto final get_functions e um ponto final create_lambda_function que pode ser acessado através /funcs e /create respectivamente.

Na função get_functions() , simplesmente retornamos uma resposta do json contendo todas as funções atualmente registradas no nosso Serviço Lambda.

A função create_lambda_function() é onde fica interessante. Nisto criamos um objeto de dicionário de todas as variáveis ??de ambiente que desejamos passar. Neste caso, estamos apenas passando o URL que desejamos monitorar. Para garantir um pouco os nomes únicos das funções, criamos um nome de função alfanumérico a partir do URL com um pouco de magia regex.

Depois de fazer isso, criamos nosso objeto de dicionário de Code que simplesmente passará no nosso arquivo lambda.zip como bytes. Em seguida, passamos tanto o env dict como o code dict na função de função create_function da AWS e isso deve, esperamos, criar nossa função lambda para nós.

Depois disso, tentamos anexar um evento do evento CloudWatch à nossa função lambda recém-criada, usando a função put_targets() e passando o nome da regra de 15 minutos que já definimos no console AWS e na lista de destinos , neste caso um único alvo.

Uma vez que isso tenha acontecido felizmente, retornamos uma resposta simples não-json (eu sei … desculpe).

No github repo, incluí um arquivo docker que pode ser executado e implantado no ECS da AWS, se você deseja seguir essa rota, por agora estou mantendo tudo em localhost porque ainda há muito mais trabalho de desenvolvimento para ser feito.

Os Lambdas

As funções da Lambda que estaremos criando dinamicamente tentarão essencialmente pegar qualquer URL que passemos nela usando uma simples solicitação GET . Em seguida, executaremos isso a cada 15 minutos com base na regra do evento CloudWatch que estamos usando para desencadear todas as funções.

Se algum desses pedidos agendados falhar, então ele publicará automaticamente um evento para o SNS, que irá então soltar um email e enviar uma mensagem de texto para quem está inscrito nesse SNS.

O código

O código para nossa função lambda é incrivelmente simples. Tudo o que faz é tentar enviar um pedido GET para um URL que ele pega de uma variável de ambiente que é configurada quando criamos dinamicamente a função. Se essa solicitação falhar, ela lança uma exceção.

Se quisermos que nosso sistema nos avisasse por qualquer erro, poderíamos fazer isso de duas formas diferentes. Poderíamos estender nossa função Lambda e adicionar o código necessário para publicar em um tópico SNS ou podemos configurar um alerta no CloudWatch sempre que um erro for denunciado por uma das nossas funções Lambda lança um erro.

Por razões de simplicidade, iremos para o último:

E boom! Nós temos um sistema de alerta que nos enviará um e-mail sempre que nosso sistema estiver desativado.

A lista de pessoas subscritas a este tópico do SNS pode ser modificada dinamicamente pelo frontend, mas precisamos deixar algum trabalho para que possamos fazer uma vez que passemos a primeira rodada de financiamento para a nossa inicialização.

Estamos em produção!

Em menos de meia hora, conseguimos construir com sucesso uma solução de monitoramento completa usando uma série de funções lambda agora atualizadas e em produção.

Não é apenas incrivelmente resiliente, também aumenta potencialmente milhares de sites e o custo para isso é mínimo devido à natureza muito pequena dos lambdas que estamos criando.

O frontend e a API orquestando a adição de novos sites através da criação de novos lambdas não foram implantados no ECS neste artigo, pois senti que está um pouco fora do escopo, mas há um Dockerfile, se você quiser começar . Se você se sentisse realmente meta, você poderia servir totalmente o aplicativo frontend a partir de uma função Lambda e frente ele usando o gateway da API e, em seguida, destilar a API Python em uma série de pontos de extremidade Lambda, mas deixarei isso como uma tarefa de acompanhamento para o leitor!

Ainda há um monte de coisas que podem ser feitas para melhorar isso, mas espero que esse exemplo simples ajude a destacar o poder incrível das funções Lambda e como elas podem ser usadas. Em um aplicativo tradicional, você teria que escrever apenas um código muito mais, você teria que implantá-lo em várias zonas de disponibilidade. Todos eles representam uma complexidade extra que levaria muito mais tempo para construir e liberar.

Conclusão

Espero que você tenha achado esse artigo sensacional e agradável! Se você precisar de mais assistência para configurar essas funções lambda, então, sinta-se à vontade para deixar um comentário na seção de comentários abaixo ou tweet-me: Elliot Forbes

Eu também estou no LinkedIn se você deseja se conectar!

Para aqueles que estão me seguindo regularmente e curtindo meu estilo de escrita, estou publicando meu segundo livro através do LeanPub intitulado: Introdução ao desenvolvimento da nuvem através da história! Se você gosta de apoiar tanto eu quanto o EFF, confira!

Uma Introdução ao Desenvolvimento da Nuvem
Este livro fornece uma introdução gentil ao mundo do desenvolvimento da nuvem. Vamos dar uma olhada em profundidade em … leanpub.com