https://d226lax1qjow5r.cloudfront.net/blog/blogposts/sending-sms-from-python-with-google-cloud-functions-dr/Blog_Google-Cloud_SMS_1200x600-1.png

Envío de SMS desde Python con Google Cloud Functions

Publicado el November 9, 2020

Tiempo de lectura: 7 minutos

El siguiente tutorial muestra cómo desplegar una función en Google Cloud Platform utilizando Python 3.7.

La función utiliza la API de SMS de Vonage para enviar un mensaje de texto a un usuario. El caso de uso es enviar un mensaje invitando al usuario a descargar una aplicación. Esta función se puede llamar desde un front-end JavaScript. Puedes hacer cosas más sofisticadas con una función de Google Cloud, pero esta es una simple demostración de cómo llegar a una función simple de trabajo.

Por qué hacer esto

Es posible que hayas oído hablar de las "funciones como servicio" o de la creación de aplicaciones "sin servidor": la tendencia de implementar funciones individuales en un proveedor de servicios en la nube como Google, Amazon o Microsoft ha ido creciendo. La ventaja de este tipo de arquitectura es que permite dividir las aplicaciones en las piezas más pequeñas posibles -funciones individuales- y crearlas de forma rápida y escalable, sin tener que gestionar servidores ni pagar por servicios que no se utilizan.

Este tipo de despliegue es especialmente útil para añadir una pequeña cantidad de código back-end a un sitio web principalmente estático. Puedes alojar un sitio creado con un generador de sitios estáticos en una plataforma como Páginas de GitHub o Netlifysin la molestia o el gasto de ejecutar un servidor web completo sólo para una función.

Configuración en Google

Para empezar a utilizar Google Cloud Platform, visite cloud.google.com y regístrate. Necesitarás una cuenta de Google: si ya utilizas una cuenta de Google para Gmail, Android u otros servicios de Google, puedes usarla.

Si no has usado Google Cloud Platform antes, te dan un generoso crédito de 300 dólares (o el equivalente en tu moneda local) para usar en tu primer año. A menos que tu sitio sea extremadamente popular y la gente lo visite constantemente, es probable que no utilices más de lo que permite el nivel gratuito.

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.

Establecimiento de requisitos previos

Google Cloud Functions puede escribirse para ejecutarse en Node.js o en Python 3. Si se utiliza Node.js, Google utiliza el módulo Express mientras que para Python utiliza la biblioteca Flask para gestionar las solicitudes y las respuestas. Cada solicitud que entra se entrega a su función como un flask.Request y tu función necesita devolver una respuesta de la misma manera que lo haría en una aplicación Flask.

Una cosa que tendrá que manejar es Cross-Origin Resource Sharing (CORS). Podemos resolver esto incluyendo Flask-CORS.

El primer paso para crear nuestra función es hacer clic en "Crear una función" en la sección Funciones en la nube de la consola de Google Cloud Platform. A continuación, se te pedirá que establezcas un nombre para tu función y que elijas algunas opciones.

Create a Google Cloud FunctionCreate a Google Cloud Function

Vamos a repasarlas rápidamente:

  • El nombre de su función también se utiliza en la URL utilizada para llamar a la función.

  • La memoria asignada a su función es la cantidad máxima de memoria que se puede utilizar: si estuviera construyendo una función que requiriera mucha memoria (si estuviera manejando archivos de audio/vídeo, quizás), necesitaría asignarle más memoria-deje esto establecido en 256 MB.

  • El disparador es cómo se invoca tu función. Debido a que nuestra función va a ser llamada desde un formulario en una página web, debemos dejarlo establecido en HTTP, pero se podría establecer para actuar sobre la base de otras acciones.

  • El código fuente especifica dónde se encuentra el código: para este tutorial, utilizaremos el editor en línea, pero esto se puede cambiar para que coincida con la forma en que desarrollas el código: podría ser desplegado desde un archivo ZIP que subes en el navegador, un archivo ZIP que despliegas en Cloud Storage, o desde un repositorio.

  • Es necesario configurar el tiempo de ejecución: por defecto es Node.js, pero usaremos Python para este tutorial.

Debajo del editor de código, hay una serie de opciones avanzadas que merece la pena consultar:

  • La región: por defecto está configurada como us-central1 (Iowa, EE.UU.), pero si la mayoría de tus visitantes son de Europa o Asia, quizá quieras configurarla como europe-west1 (Bélgica) o asia-northeast1 (Tokio), según convenga. Al cambiar esto, cambiará la URL.

  • El tiempo de espera está establecido en 60 segundos: esto debería estar bien para nuestros propósitos, pero puede ajustarlo. Recuerde que el uso de Cloud Functions se factura por milisegundos.

  • Las variables de entorno: tendrá que establecer dos variables de entorno: VONAGE_API_KEY y VONAGE_API_SECRET.

Crear nuestra función

Lo que haga tu función individual depende de ti. He escrito un ejemplo sencillo que puedes ver en Gist o leer más abajo. Toma dos argumentos:

  • phone: el número de teléfono al que vamos a enviar el mensaje. Vonage requiere el número en formato E.164.

  • platformel sistema operativo del dispositivo del usuario, que puede ser iOS o Android. Esto determinará si reciben un mensaje que les vincula a la App Store de Apple o a la Play Store de Google.

import vonage
from flask import jsonify

def send_sms(request):
    data = request.get_json()

    # VONAGE_API_KEY and VONAGE_API_SECRET are in env vars
    # which are set in the Google Cloud function
    client = vonage.Client()

    # you may prefer to use link shorteners to see how many clickthroughs happen
    ios_msg = "Download our iOS app from https://example.org/apple"
    android_msg = "Download our Android app from https://example.org/android"

    if data['platform'] == "ios":
        msg = ios_msg
    elif data['platform'] == "android":
        msg = android_msg

    # you need some more data checking here. just an example...
    args = {
        'from': 'MyApp',
        'to': data['phone'],
        'text': msg
    }
    response = client.send_message(args)
    return jsonify(response)

Una vez escrita la función, la forma más sencilla de implementarla es copiarla y pegarla en el editor de código del sitio web de Google Cloud Functions. Debajo del editor de código, debe establecer el nombre de la función que se va a ejecutar; esto indica a Cloud Functions a qué función de su archivo debe llamar. En la sección Avanzadas, también debe establecer las variables de entorno, VONAGE_API_KEY y VONAGE_API_SECRET.

Set environment variablesSet environment variables

Una vez hecho esto, pulsa "Guardar", espera unos instantes a que los robots mágicos de Google desplieguen la función y ya puedes probarla.

curl -X "POST" "https://us-central1-youraccountname.cloudfunctions.net/app-sms" \ -H 'Content-Type: application/json; charset=utf-8' \ -d $'{ "phone": " 447700900000 ", "platform": "ios" }'

A modo de demostración, esto es lo que se devuelve desde la SMS API:

{
  "message-count": "1",
  "messages": [
    {
      "status": "0",
      "network": "23410",
      "remaining-balance": "10.00000000",
      "to": "447700900000",
      "message-price": "0.03330000",
      "message-id": "1500000000000AA1"
    }
  ]
}

(Se recomienda encarecidamente filtrar información como el identificador de mensaje en lugar de enviarla de vuelta al front-end).

Integración de front-end

Una vez escrita la función, el siguiente paso es integrar esa llamada a la función en un front-end. En el caso de una interfaz basada en JavaScript, deberá asegurarse de que todas las funciones en la nube a las que llame devuelvan la propiedad compartición de recursos entre orígenes (CORS) de los dominios desde los que se llaman.

Cualquier código que escribas y utilices en producción tendrá que ser un poco más sofisticado que el ejemplo proporcionado aquí: querrás asegurarte de poner controles para asegurarte de que no estás enviando demasiados mensajes. El hecho de que tu código sea "sin servidor" no significa que no tengas que pensar en la seguridad. Tus funciones son pequeñas y autónomas, lo que significa que no pueden afectar a otro código, pero aún así debes pensar en asegurarte de validar los datos que ingresan a tu función y de que las API a las que se llama desde tu función (incluidas las API de Vonage) se llamen de manera segura.

¿Qué sigue?

Las funciones en la nube de Google, al igual que las funciones Azure de Microsoft y las funciones Lambda de Amazon Web Services, permiten crear API muy sencillas por las que solo se paga en el momento de la ejecución. Son perfectas para integrarlas en sitios estáticos, en interfaces JavaScript o en aplicaciones móviles.

Pueden utilizarse para unir servicios prestados por varios proveedores de API. Por ejemplo, puede utilizar Cloud Functions para:

  • responder a eventos webhook de los servicios Voice de Vonage

  • recibir notificaciones de GitHub o de su servicio de integración continua y, a continuación, enviar un mensaje de texto si se cumple alguna condición

  • reunir información de su sistema de comercio electrónico y de su proveedor de pagos para enviar un mensaje de agradecimiento a un cliente cuando se envía su pedido

  • almacenar datos analíticos de su aplicación móvil en una base de datos como Firestore

Una vez que has construido tu primera función, empiezas a darte cuenta de cómo pueden resolver todo tipo de problemas en los que estás trabajando.

Compartir:

https://a.storyblok.com/f/270183/384x384/cd91b5afd9/tom.png
Tom Morris

Polyglot hacker and lifelong student trying a little bit of everything and documenting the experience.