
Partager:
Polyglot hacker and lifelong student trying a little bit of everything and documenting the experience.
Envoi de SMS depuis Python avec Google Cloud Functions
Temps de lecture : 7 minutes
Le tutoriel ci-dessous montre comment déployer une fonction sur Google Cloud Platform en utilisant Python 3.7.
Cette fonction utilise l'API SMS de Vonage pour envoyer un message texte à un utilisateur. Le cas d'utilisation est d'envoyer un message invitant l'utilisateur à télécharger une application. Cette fonction peut ensuite être appelée à partir d'un front-end JavaScript. Il est possible de faire des choses plus sophistiquées avec une fonction Google Cloud, mais il s'agit ici d'une simple démonstration de la manière d'obtenir une fonction simple et fonctionnelle.
Pourquoi faire cela ?
Vous avez peut-être entendu parler des "fonctions en tant que service" ou de la construction d'applications "sans serveur" : la tendance à déployer des fonctions individuelles chez un fournisseur de services cloud comme Google, Amazon ou Microsoft ne cesse de croître. L'avantage de ce type d'architecture est qu'il permet de décomposer les applications en éléments aussi petits que possible - des fonctions individuelles - et de les construire de manière rapide et évolutive, sans avoir à gérer des serveurs ou à payer pour des services que vous n'utilisez pas.
Ce type de déploiement est particulièrement utile pour ajouter un tout petit bout de code back-end à un site web essentiellement statique. Vous pouvez ensuite héberger un site construit à l'aide d'un générateur de site statique sur une plateforme comme GitHub Pages ou Netlifysans avoir à gérer un serveur web complet pour une seule fonction.
S'installer sur Google
Pour commencer à utiliser Google Cloud Platform, rendez-vous à l'adresse suivante cloud.google.com et inscrivez-vous. Vous aurez besoin d'un compte Google : si vous utilisez déjà un compte Google pour Gmail, Android ou d'autres services Google, vous pouvez l'utiliser.
Si vous n'avez jamais utilisé Google Cloud Platform, l'entreprise vous offre un crédit généreux de 300 $ (ou l'équivalent dans votre devise locale) à utiliser au cours de votre première année. À moins que votre site ne devienne extrêmement populaire et que les internautes le consultent en permanence, vous n'utiliserez probablement pas plus que ce que permet le niveau gratuit.
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.
Mise en place des conditions préalables
Google Cloud Functions peut être écrit pour fonctionner avec Node.js ou Python 3. Si vous utilisez Node.js, Google utilise le protocole Express tandis que pour Python, c'est la bibliothèque Flask est utilisée pour gérer les demandes et les réponses. Chaque demande qui arrive est transmise à votre fonction sous la forme d'un fichier flask.Request et votre fonction doit renvoyer une réponse de la même manière qu'elle le ferait dans une application Flask.
L'une des choses que vous devrez gérer est le partage de ressources entre origines (CORS). Nous pouvons résoudre ce problème en incluant Flask-CORS.
La première étape de la création de notre fonction consiste à cliquer sur "Create a function" (Créer une fonction) dans la section Cloud Functions de la console Google Cloud Platform. Vous serez alors invité à donner un nom à votre fonction et à choisir certaines options.
Create a Google Cloud Function
Passons-les rapidement en revue :
Le nom de votre fonction est également utilisé dans l'URL utilisée pour appeler la fonction.
La mémoire allouée à votre fonction est la quantité maximale de mémoire qui peut être utilisée : si vous créez une fonction gourmande en mémoire (si elle traite des fichiers audio/vidéo, par exemple), vous devrez lui attribuer plus de mémoire - laissez ce paramètre à 256 Mo.
Le déclencheur est la manière dont votre fonction est invoquée. Comme notre fonction sera appelée à partir d'un formulaire sur une page web, nous devrions la laisser réglée sur HTTP, mais vous pourriez la régler pour qu'elle agisse en fonction d'autres actions.
Le code source indique où se trouve le code : pour ce tutoriel, nous utiliserons l'éditeur en ligne, mais cela peut être modifié pour correspondre à la façon dont vous développez le code - il peut être déployé à partir d'un fichier ZIP que vous téléchargez dans le navigateur, d'un fichier ZIP que vous déployez dans le stockage en nuage, ou d'un référentiel.
Le moteur d'exécution doit être défini : par défaut, il s'agit de Node.js, mais nous utiliserons Python pour ce tutoriel.
Sous l'éditeur de code, un certain nombre d'options avancées méritent d'être examinées :
La région : elle est définie par défaut sur us-central1 (Iowa, États-Unis), mais si la majorité de vos visiteurs viennent d'Europe ou d'Asie, vous pouvez la définir sur europe-west1 (Belgique) ou asia-northeast1 (Tokyo), selon le cas. La modification de ce paramètre entraînera une modification de l'URL.
Le délai d'attente est fixé à 60 secondes : cela devrait convenir à nos besoins, mais vous pouvez l'ajuster. N'oubliez pas que votre utilisation de Cloud Functions est facturée à la milliseconde.
Les variables d'environnement : vous devez définir deux variables d'environnement : VONAGE_API_KEY et VONAGE_API_SECRET.
Créer notre fonction
C'est à vous de décider ce que fait votre fonction individuelle. J'ai écrit un exemple simple que vous pouvez voir sur Gist ou lire ci-dessous. Il prend deux arguments :
phone: le numéro de téléphone auquel nous allons envoyer le message. Vonage exige que le numéro soit au format E.164.platformle système d'exploitation de l'appareil de l'utilisateur - il s'agit d'ios ou d'android. Cela déterminera s'il reçoit un message le renvoyant à l'Apple App Store ou au Google Play Store.
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)Une fois que vous avez écrit votre fonction, le moyen le plus simple de la déployer est de la copier et de la coller dans l'éditeur de code sur le site Web de Google Cloud Functions. Sous l'éditeur de code, vous devez définir le nom de la fonction à exécuter, ce qui indique à Cloud Functions la fonction à appeler dans votre fichier. Dans la section Avancé, vous devez également définir les variables d'environnement, VONAGE_API_KEY et VONAGE_API_SECRET.
Set environment variables
Une fois que vous avez terminé, cliquez sur "Enregistrer", attendez quelques instants que les robots magiques de Google déploient la fonction, puis vous pourrez la tester.
A titre de démonstration, voici ce qui est renvoyé par l'API SMS API:
{
"message-count": "1",
"messages": [
{
"status": "0",
"network": "23410",
"remaining-balance": "10.00000000",
"to": "447700900000",
"message-price": "0.03330000",
"message-id": "1500000000000AA1"
}
]
}(Il est fortement recommandé de filtrer les informations telles que l'identifiant du message plutôt que de les renvoyer au front-end).
Intégration frontale
Une fois la fonction écrite, l'étape suivante consiste à intégrer cet appel de fonction dans un front-end. Pour un frontal basé sur JavaScript, vous devrez vous assurer que toutes les fonctions du nuage que vous appelez renvoient l'attribut Partage de ressources inter-origines (CORS) pour les domaines à partir desquels elles sont appelées.
Tout code que vous écrivez et utilisez en production devra être un peu plus sophistiqué que l'exemple fourni ici : vous devrez vous assurer de mettre en place des contrôles pour vous assurer que vous n'envoyez pas trop de messages. Ce n'est pas parce que votre code est "sans serveur" que vous ne devez pas penser à la sécurité. Vos fonctions sont petites et autonomes, ce qui signifie qu'elles ne peuvent pas affecter d'autres codes, mais vous devez tout de même vous assurer de valider les données qui entrent dans votre fonction et de veiller à ce que les API appelées à partir de votre fonction (y compris les API de Vonage) soient appelées en toute sécurité.
Et ensuite ?
Les fonctions cloud de Google, tout comme les fonctions Azure de Microsoft et les fonctions Lambda d'Amazon Web Services, vous permettent de créer des API très simples que vous ne payez qu'au moment de l'exécution. Elles sont parfaites pour l'intégration dans des sites statiques, dans des frontaux JavaScript ou dans des applications mobiles.
Elles peuvent être utilisées comme un moyen de coller ensemble des services fournis par plusieurs fournisseurs d'API. Par exemple, vous pouvez utiliser les fonctions cloud pour :
répondre aux événements webhook des services Voice de Vonage
recevoir des notifications de GitHub ou de votre service d'intégration continue, puis déclencher un message texte si une condition est remplie
rassembler des informations provenant de votre système de commerce électronique et de votre prestataire de paiement pour envoyer un message de remerciement à un client lorsque sa commande est expédiée.
stocker les données analytiques de votre application mobile dans une base de données comme Firestore
Une fois que vous avez construit votre première fonction, vous commencez à réaliser comment elles peuvent résoudre toutes sortes de problèmes sur lesquels vous travaillez.
