https://a.storyblok.com/f/270183/24385/6ab64d60f5/aws-lambda.jpg

Criação de uma aplicação de envio de SMS para o Google Sheets com o AWS Lambda

Publicado em May 13, 2021

Tempo de leitura: 12 minutos

Neste tutorial, vamos mostrar como você pode capturar mensagens SMS enviadas para o seu próprio número Nexmo e registrá-las em uma planilha do Google usando um AWS Lambda escrito em Python. Isso pode ser usado para coletar feedback, inscrições para obter mais informações, registrar votos ou qualquer outra forma de coleta de dados. O melhor disso tudo é que você não precisa de um servidor dedicado, basta um pequeno trecho de código hospedado no AWS Lambda e uma conta Nexmo.

Vamos abordar:

Se você quiser simplesmente começar, pode sempre Pegar o código!

Por que o Lambda?

As tecnologias sem servidor são uma tendência que vem ganhando força rapidamente. Intimamente relacionada ao conceito de microsserviços, a ideia é que, em vez de desenvolver um aplicativo monolítico que faça tudo o que sua empresa precisa, você crie vários aplicativos menores e independentes, cada um desempenhando uma única função, e depois os integre.

Um dos desafios na criação desses microsserviços é que a sobrecarga de manter uma pilha completa de servidores (SO, servidor web, banco de dados, Applications etc.) pode acarretar uma grande quantidade de trabalho e custos. É nesse contexto que observamos uma nova tendência na computação em nuvem em direção às tecnologias sem servidor; uma das mais interessantes delas é o AWS Lambda da Amazon. Agora é possível escrever uma função simples em Python, Java ou JavaScript e fazer com que ela seja invocada por uma chamada de API externa ou por outra parte da AWS, como um arquivo sendo enviado para o S3.

Além de eliminar a necessidade de manter seus próprios servidores, você também pode manter os custos baixos; você só é cobrado pelo tempo em que seu código está em execução, em intervalos de 100 ms. Isso significa que, para funções simples que processam pequenas quantidades de dados com tráfego muito intermitente, a solução pode ser bastante acessível, sem deixar de oferecer capacidade para lidar com picos de tráfego. Esse modelo torna o Lambda uma plataforma ideal para desenvolver um aplicativo destinado a receber mensagens SMS.

Registrando SMS recebidas com o AWS Lambda

Para nossa demonstração, vamos escrever o aplicativo em Python. O Lambda permite que você use quaisquer bibliotecas de terceiros que desejar como parte do pacote do seu aplicativo. Na primeira versão, vamos simplesmente receber um SMS enviado para um número da Nexmo e registrar essa mensagem nos logs do Lambda. O vídeo abaixo irá guiá-lo na criação de sua primeira aplicação Lambda e na configuração para receber \[webhooks](https://docs.nexmo.com/messaging/setup-callbacks) da API da Nexmo. Você também precisará de um \[Account Nexmo](${CUSTOMER_DASHBOARD_URL}/sign-up?icid=tryitfree_api-developer-adp_nexmodashbdfreetrialsignup_nav) e precisará adquirir um número para isso.

Você pode saber mais sobre como começar a usar o AWS Lambda no guia de introdução.

Aqui está um resumo dos pontos principais do Video:

import json

print('Loading function')

def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
return "OK"

O Lambda está configurado para chamar uma função chamada lambda_handler e passa a ela um objeto chamado event. Esse evento contém os parâmetros que iremos mapear na solicitação de integrações do API Gateway

{
"type" : "$input.params('type')",
"to" : "$input.params('to')",
"msisdn" : "$input.params('msisdn')",
"messageId" : "$input.params('messageId')",
"message-timestamp" : "$input.params('message-timestamp')",
"text" : "$input.params('text')"
}

O lambda_handler simplesmente pegará esses dados do evento e os registrará no log como um objeto JSON; em seguida, retornará uma OK string que passará pelo API Gateway e será devolvida à Nexmo.

Configurando o Google Sheets

O exemplo acima é bem básico; tudo o que estamos fazendo é registrar a mensagem nos arquivos de log do Lambda. Para um exemplo prático, precisamos fazer algo um pouco mais útil.

Vamos imaginar um cenário em que você queira que os participantes possam enviar comentários rapidamente por SMS. Uma ótima maneira de armazenar e compartilhar essas informações é no Google Sheets e, para nossa sorte, existe uma API que nos permite gravar diretamente na planilha.

No vídeo anterior, começamos na Consola de Desenvolvedores do Google (crie um Account aqui), onde você precisa criar um novo projeto, habilitar a API do Drive para esse projeto e, em seguida, configurar uma chave de conta de serviço. Esse tipo de acesso foi projetado para aplicativos de servidor para servidor. É isso que vamos usar, já que o aplicativo Lambda se conectará ao Google Docs.

Assim que a chave da conta de serviço for criada, você receberá um conjunto de credenciais baixadas em um arquivo JSON. Um dos parâmetros nesse arquivo é chamado client_email, que terá o formato de um endereço de e-mail. Anote esse endereço.

Faça login no seu Google Drive e crie uma nova planilha chamada nexmosms. Você precisa compartilhá-la com o endereço associado à chave da conta de serviço e conceder permissões de edição. Agora, o Lambda está agindo como se fosse outro usuário que está colaborando no documento com você.

Como adicionar mensagens SMS a uma planilha do Google Sheets

Agora que estamos trabalhando com algumas APIs externas, nosso código Lambda precisa ser um pouco mais complexo. Passaremos a usar algumas bibliotecas de terceiros, o que significa que não podemos mais simplesmente escrever nosso código no navegador. Em vez disso, precisamos criar um pacote compactado com nosso código e as bibliotecas adicionais que estamos usando.

Vamos pular o Video para essas etapas de programação. Em vez disso, as etapas detalhadas estão abaixo. Vamos começar com um diretório vazio e criar um arquivo nele chamado lambda_function.py

mkdir nexmosms cd nexmosms touch lambda_function.py

Podemos instalar as bibliotecas que vamos usar em nosso bundle a partir da linha de comando, utilizando o gerenciador de pacotes pip. Precisamos instalá-las na pasta local, em vez do caminho padrão do sistema, usando o -t opção e podemos especificar o diretório atual pwd entre crases. Portanto, para adicionar a nexmo biblioteca ao pacote, use o comando:

pip install nexmo -t `pwd`

Precisaremos repetir esse comando para as outras bibliotecas que quisermos usar:

pip install oauth2client -t `pwd` pip install gspread -t `pwd` pip install nexmo -t `pwd`

Agora que temos uma pasta com nossas bibliotecas, só precisamos usá-las em nosso lambda_function.py arquivo:

Nosso código da função lambda agora está um pouco mais detalhado:

import json
import requests
from time import strftime as timestamp
from oauth2client.service_account import ServiceAccountCredentials
import gspread
import nexmo
from creds import *

A primeira parte importa as bibliotecas de que precisamos, mas você também vai notar que há alguns elementos ali, como time que não incluímos em nosso pacote com o pip. Isso ocorre porque o Lambda fornece tudo a partir do o ambiente de execução padrão do Python 2.7.

Em seguida, precisamos configurar o acesso ao Google Sheets e também inserir nossa chave de API e nosso segredo de API do Nexmo no arquivo. No código abaixo, substitua os “X” pelos seus dados, conforme mostrado no exemplo a seguir.

# Setup access to Google sheets
scopes = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scopes=scopes)
#Nexmo Credentials
nexmo_key = 'XXXXXX'
nexmo_secret = 'XXXXXX"

O arquivo de credenciais que você baixou ao configurar a chave da Conta de Serviço do Google deve ser renomeado para creds.json e incluído no pacote.

E adicione uma função chamada addrow ao nosso pacote que nos permita adicionar uma linha à nossa planilha do Google Sheets:

def addrow(sender, text):
gc = gspread.authorize(credentials)
sheet = gc.open('nexmosms').worksheet("Sheet1")
sheet.append_row([timestamp('%Y-%m-%d %H:%M:%S'), sender, text])

Essa função recebe dois valores, sender que serão o número de celular (MSISDN) que enviou a mensagem e text o corpo da mensagem. A função cria um gc objeto para representar a conexão com o Google Sheets, um sheet objeto que abrirá um documento nesse Account chamado nexmosms e seleciona a planilha chamada Sheet1. Por fim, acrescentamos uma nova linha à planilha, inserindo um timestamp como primeira coluna, seguida pelo remetente e pelo texto da mensagem.

Podemos, então, atualizar nosso handler Lambda original para utilizar nossa nova função:

def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
addrow(event['msisdn'], event['text'])
client = nexmo.Client(key=nexmo_key, secret=nexmo_secret)
client.send_message({'from': event['to'], 'to': event['msisdn'], 'text': 'Thanks for your feedback!'})
return "OK"

No código acima, continuamos exibindo os dados recebidos no log para facilitar a depuração, mas agora também chamamos a addrow função que acabamos de criar.

Em seguida, utilizamos a biblioteca oficial biblioteca oficial do Nexmo para Python (que lançamos bem a tempo para a PyCon 2016) para enviar uma resposta ao remetente da mensagem a partir da função Lambda. Criamos uma nexmo.Client instância e chamamos client.send_message definindo nosso from número como o número da Nexmo para o qual o usuário enviou a mensagem. O campo “para” é o número de telefone do usuário de onde a mensagem foi enviada (MSISDN) e o corpo da mensagem text apenas diz Thanks for your feedback!. Por fim, retornamos uma "OK" à API da Nexmo para encerrar a solicitação.

É isso aí! Agora você pode enviar um SMS para um número registrado na Nexmo e fazer com que essa mensagem de texto seja encaminhada para uma função do AWS Lambda por meio de um webhook da Nexmo. O Lambda registrará o conteúdo da mensagem em uma planilha do Google Sheets e enviará uma resposta.

O video a seguir mostra o processo de envio do pacote e uma demonstração do código em ação:

Pegue o código!

Você pode baixar um pacote com todo o código do meu GitHub. Por favor, me diga o que você achou; estou no @sammachin no Twitter.

Compartilhar:

https://a.storyblok.com/f/270183/384x384/7fbbc7293b/sammachin.png
Sam MachinEx-funcionários da Vonage