SRE - DevOps

API para envio de SMS com SNS, Métricas no Prometheus e Log estruturado na AWS.

Olá, desenvolvedores, DevOps e SREs! Neste artigo, vou explicar de forma didática e clara como enviar um SMS utilizando o serviço SNS da AWS com uma API, quem leu o artigo anterior fizemos algo parecido utilizando o serviço de lambda, nela teremos toda estrutura para export de métricas para o prometheus a fim de observar seu funcionamento, usando um grafana e criando aqueles lindos gráficos, também teremos todo o seu log estruturado em JSON para fins de necessidade de exportar para qualquer ferramenta de logs tais como, Splunk, Elasticsearch com Kibana, Graylog, Datadog e outros...

Essa estratégia é útil para notificar equipes sobre eventos ou situações diversas que possam ocorrer em suas contas AWS, como um login inesperado ou um container offline.

Ao enviar um SMS, é mais provável que alguém da equipe tome conhecimento do incidente, especialmente quando comparado ao e-mail, que nem sempre é verificado com frequência. Além disso, essa abordagem pode ser adaptada para outros serviços e situações, expandindo as possibilidades de uso.

Em resumo, vamos aprender como:

  1. Utilizar o serviço SNS da AWS para enviar SMS;
  2. Integrar o prometheus para disparar monitoria e métricas;
  3. Aplicar essa estratégia em diferentes cenários e serviços para disparar notificação.

Lembre-se: as possibilidades são amplas, e o céu é o limite para o uso dessa abordagem!

Neste artigo, vamos criar usar o mesmo código da lambda, fazendo algumas modificações para que ele se torne uma API pronta para rodar em serviços como ElasticBeanStack, ECS, EKS, e outros, todo o codigo estará na mesma linguagem de programação Go, também conhecida como Golang, e integrá-la aos serviços de SMS e SNS da AWS para disparar mensagens. Ao longo deste texto, não entraremos em detalhes sobre o funcionamento do SNS ou do serviço de SMS da AWS, pois os utilizaremos de forma abstrata.

Em vez disso, focaremos no uso do SDK da AWS, que permitirá a comunicação com esses serviços por meio de nosso código.

O repositorio do código, com os arquivos como:

main.go / go.mod / go.sum

https://github.com/diillson/lambdaGo-AWS-SMSToSNS/tree/api-sms-to-sns

O código da API é o seguinte:

Explanando um pouco do código:

Neste artigo, você aprenderá sobre a implementação de um código que utiliza uma biblioteca específica para gerar logs no formato JSON. A escolha desse formato permite exportar os logs do CloudWatch e integrá-los com diversas ferramentas, como Splunk, Elasticsearch com Kibana e Graylog, Datadog e outros.

O código é desenvolvido de forma enxuta e inclui o AwsRequestID, permitindo rastrear chamadas com o Xray na AWS, caso este recurso seja habilitado na sua api.

Além disso, incluímos informações como nome da aplicação, arquivo executado, função/método e linha de execução para facilitar a rastreabilidade em caso de problemas. Com isso, os logs se tornam claros e fáceis de serem analisados durante um processo de solução de problemas.

Como framework Web usamos o Gin, pensando em performance, agilidade no desenvolvimento da api ele se destaca em N fatores.

Usamos uma lib do prometheus para implementar as métricas do prometheus server e usamos uma go routine para exportar as métricas em modo de concorrência ao lado da execução da api.

Criamos a API instrumentada com o Prometheus onde coletará métricas sobre solicitações HTTP, tempo de resposta, taxa de erros, latência, uso de CPU, uso de memória e tráfego de rede.

Para coletar as métricas no servidor Prometheus é necessário que esteja configurado para coletar métricas do seu aplicativo Go, adicionando um novo scrape config no arquivo de configuração do Prometheus.

prometheus.yml:

scrape_configs:
 - job_name: 'my_app'
   static_configs:
     - targets: ['<your_app_ip>:8080']

Para controlar o StatusCode de saída e o conteúdo apresentado ao usuário, seja em casos de erro ou sucesso, criamos uma estrutura específica.

Ao iniciar a sessão com o serviço SNS, optamos por utilizar o parâmetro "session.NewSession()" em vez de "must". Isso evita um possível Panic na aplicação e permite um tratamento de erros mais adequado.

O código recebe na rota "/sms" como entrada o tipo JSON com número de telefone e a mensagem a ser enviada, ambos fornecidos pelo usuário ou serviço.

Esses parâmetros são totalmente personalizáveis, com uma pequena mudança no codigo, você pode passar uma lista de telefones ou utilizar o serviços do Amazon SNS para subscrição e encaminhar para varios numeros simultâneamente apenas com o publicsh no ARN do SNS criado, fica livre a modificação.

{

   "phone_number":"+5511999999999",

   "message":"Olá teste"

}

Caso algum dos campos esteja em branco, o código gera uma exceção e retorna o erro para quem fez a chamada. Dessa forma, garantimos a integridade das informações fornecidas e a eficácia na comunicação.

Criando o serviço na aws, não se esqueça de criar a role/policy com as permissões necessárias de acesso ao SNS para publish das mensagens e uso do serviço, no artigo anterior falo sobre a criação delas.

https://www.edilsonfreitas.com/blog/envio-de-sms-na-aws-usando-lambda-sns

com isso você tera uma API exuta para envio de sms, com todas as métricas, log estruturado e caso use o Xray da AWS, com poucas modificações sendo possivel fazer o trace de suas requisições, se tiverem duvidas como adicionar o xray com go na aws deixa um comentario no formulario de contato que faço um artigo especifico para este fim.

É isso pessoal, grande abraço e bons estudos, até a próxima.