https://d226lax1qjow5r.cloudfront.net/blog/blogposts/building-sms-google-sheets-application-aws-lambda-dr/aws-lambda.jpg

Creación de una aplicación de SMS a Google Sheets con AWS Lambda

Publicado el May 13, 2021

Tiempo de lectura: 12 minutos

En este tutorial, le mostraremos cómo puede capturar mensajes SMS enviados a su propio número Nexmo y registrarlos en una hoja de cálculo de Google utilizando un AWS Lambda escrito en Python. Esto se puede usar para capturar comentarios, registrarse para obtener más información, registrar votos o cualquier forma de recopilación de datos. Lo bueno de esto es que usted no necesita su propio servidor dedicado, sólo un pequeño trozo de código alojado en AWS Lambda y una cuenta de Nexmo.

Vonage API Account

To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.

This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.

Cubriremos:

Si sólo quieres sumergirte, siempre puedes coger el código¡!

¿Por qué Lambda?

Las tecnologías sin servidor son una tendencia emergente. Estrechamente relacionadas con el concepto de microservicios, la idea es que en lugar de construir una aplicación monolítica que haga todo lo que su negocio quiere, usted construya una serie de pequeñas aplicaciones discretas que cada una haga una sola función y luego las una.

Uno de los retos de construir estos microservicios es que la sobrecarga de ejecutar una pila de servidores completa (sistema operativo, servidor web, base de datos, aplicaciones, etc.) puede añadir una gran cantidad de trabajo y costes. Aquí es donde estamos viendo una nueva tendencia en la computación en nube hacia las tecnologías sin servidor, una de las más interesantes es AWS Lambda de Amazon. Ahora puedes escribir una función simple en Python, Java o Javascript y hacer que sea invocada por una llamada a una API externa o por otra parte de AWS, como un archivo que se carga en S3.

Además de eliminar la necesidad de disponer de servidores propios, también se reducen los costes: sólo se cobra por el tiempo que se ejecuta el código, en intervalos de 100ms. Esto significa que para las funciones simples que manejan pequeñas cantidades de datos con tráfico muy ráfaga puede funcionar bastante asequible mientras que todavía tiene la capacidad para manejar los picos de tráfico. Este modelo hace de Lambda una plataforma ideal para crear una aplicación de recepción de mensajes SMS.

Registro de SMS entrantes con AWS Lambda

Para nuestra demostración, escribiremos la aplicación en Python. Lambda le permite utilizar cualquier biblioteca de terceros que desee como parte de su paquete de aplicaciones. Para la primera versión, simplemente vamos a recibir un SMS enviado a un número Nexmo y registrar ese mensaje en los registros de Lambda. El vídeo a continuación le guiará a través de la creación de su primera aplicación Lambda y su configuración para recibir \ [webhooks](https://docs.nexmo.com/messaging/setup-callbacks) de la API Nexmo. También necesitará una cuenta Nexmo (${CUSTOMER_DASHBOARD_URL}/sign-up?icid=tryitfree_api-developer-adp_nexmodashbdfreetrialsignup_nav) y usted tendrá que comprar un número para esto.

Puede obtener más información sobre cómo comenzar a utilizar AWS Lambda en su guía de introducción.

Aquí tienes un resumen de los puntos clave del Video:

import json

print('Loading function')

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

Lambda está configurado para llamar a una función llamada lambda_handler y le pasa un objeto llamado event. Este evento contiene los parámetros que vamos a mapear a través de la API Gateway Integrations Request

{
"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')"
}

El lambda_handler simplemente tomará esos datos de evento y los imprimirá en el registro como un objeto JSON, luego devolverá una OK que pasará a través de la pasarela API y se devolverá a Nexmo.

Configuración de Google Sheets

El ejemplo anterior es bastante básico, todo lo que estamos haciendo es registrar el mensaje en los archivos de registro de Lambda, para un ejemplo del mundo real necesitamos hacer algo un poco más útil.

Imaginemos un evento en el que se desea que los asistentes puedan enviar sus comentarios rápidamente por SMS. Una buena forma de almacenar y compartir esa información es en Hojas de cálculo de Google y por suerte para nosotros existe una API que nos permitirá escribir directamente en la hoja.

En el Video anterior, comenzamos en la consola de desarrolladores de Google (obtenga una cuenta aquí) donde necesitas crear un nuevo proyecto, habilitar la API de Drive para ese proyecto y luego configurar una Service Account Key. Este tipo de acceso está diseñado para aplicaciones de servidor a servidor. Esto es lo que vamos a utilizar ya que la aplicación Lambda se conectará a Google Docs.

Una vez creada esa clave de cuenta de servicio, se le proporcionará un conjunto de credenciales descargadas en un archivo JSON. Uno de los parámetros que contiene se llama client_emailen forma de dirección de correo electrónico. Tome nota de esta dirección.

Inicie sesión en Google Drive y crea una nueva hoja de cálculo llamada nexmosms. Tienes que compartirla con la dirección relacionada con la Clave de Cuenta de Servicio y dar permisos de edición. Ahora Lambda actúa como otro usuario que está colaborando en el documento contigo.

Añadir mensajes SMS a una hoja de Google

Ahora que estamos trabajando con algunas API externas, nuestro código Lambda tiene que ser un poco más complejo. Ahora vamos a utilizar algunas bibliotecas de terceros, lo que significa que ya no podemos simplemente escribir nuestro código en el navegador. En lugar de eso necesitamos crear un paquete comprimido de nuestro código y las bibliotecas adicionales que estamos utilizando.

Nos saltamos el Video para estos pasos de codificación. En su lugar, los pasos detallados están a continuación. Comenzaremos con un directorio vacío y crearemos un archivo llamado lambda_function.py

mkdir nexmosms cd nexmosms touch lambda_function.py

Podemos instalar las bibliotecas que vamos a utilizar en nuestro paquete desde la línea de comandos utilizando el gestor de paquetes pip. Tenemos que instalarlos en la carpeta local en lugar de la ruta normal del sistema utilizando la bandera -t y podemos especificar el directorio actual pwd en backticks. Para añadir la biblioteca nexmo librería al paquete usa el comando

pip install nexmo -t `pwd`

Tendremos que repetir ese comando para las demás bibliotecas que queramos utilizar:

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

Ahora que tenemos una carpeta con nuestras librerías, sólo tenemos que usarlas en nuestro archivo lambda_function.py archivo:

Nuestro código de función lambda es ahora un poco más detallado:

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

La primera parte importa las librerías que necesitamos, pero también notarás que hay algunas cosas como time que no incluimos en nuestro bundle con pip. Esto es porque Lambda provee todo desde Python 2.7 runtime estándar.

A continuación tenemos que configurar el acceso a Google Sheets y también poner nuestro Nexmo API Key y API Secret en el archivo. En el siguiente código sustituye las X por tus datos en el siguiente ejemplo.

# 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"

El archivo de credenciales que descargaste al configurar la clave de la cuenta de servicio de Google debe renombrarse a creds.json e incluirlo en el paquete.

Y añadimos una función llamada addrow a nuestro bundle que nos permita añadir una fila a nuestra Google Sheet:

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])

A esta función se le pasan 2 valores sender que será el número de móvil (MSISDN) que envió el mensaje y text que es el cuerpo del mensaje. La función crea un objeto gc para representar la conexión con Google Sheets, un objeto sheet objeto que abrirá un documento en esa Account llamado nexmosms y seleccionará la hoja llamada Sheet1. Finalmente añadimos una nueva fila a esa hoja añadiendo un timestamp como primera columna, seguida del remitente y el texto del mensaje.

A continuación, podemos actualizar nuestro controlador Lambda original para hacer uso de nuestra nueva función:

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"

En el código anterior seguimos imprimiendo los datos recibidos en el registro para ayudar con la depuración, pero ahora también invocamos la función addrow que acabamos de crear.

A continuación, utilizamos la biblioteca oficial Nexmo Python (que lanzamos justo a tiempo para PyCon 2016) para devolver una respuesta al emisor del mensaje desde la función Lambda. Creamos una nexmo.Client y llamamos a client.send_message estableciendo nuestro from number para que sea el número de Nexmo al que el usuario envió el mensaje. El 'to' es el número de teléfono del usuario desde el que envió el mensaje (MSISDN) y el cuerpo del mensaje text sólo dice Thanks for your feedback!. Finalmente devolvemos un "OK" a la API de Nexmo para borrar la solicitud.

Ya está. Ahora puede enviar un SMS a un número registrado en Nexmo y hacer que ese mensaje de texto se envíe a una función de AWS Lambda a través de un webhook de Nexmo. Lambda registrará el contenido del mensaje en una hoja de Google y enviará una respuesta.

El siguiente Video muestra la carga del paquete y una demostración del código en acción:

Consigue el código

Usted puede descargar un paquete de todo el código de mi GitHub. Por favor, hágamelo saber lo que piensa, estoy @sammachin en Twitter.

Compartir:

https://a.storyblok.com/f/270183/384x384/7fbbc7293b/sammachin.png
Sam MachinAntiguos alumnos de Vonage