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:
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
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.