Erstellen eines SMS-Benachrichtigungsdienstes mit Serverless

November 24, 2020
Autor:in:
Prüfer:in:

Erstellen eines SMS-Benachrichtigungsdienstes mit Serverless


Hallo und Danke fürs Lesen! Dieser Blogpost ist eine Übersetzung von Building an SMS notification service with Serverless. Während wir unsere Übersetzungsprozesse verbessern, würden wir uns über Dein Feedback an help@twilio.com freuen, solltest Du etwas bemerken, was falsch übersetzt wurde. Wir bedanken uns für hilfreiche Beiträge mit Twilio Swag :)

Ethereum ist eine Blockchain mit einer Kryptowährung. Wie bei Bitcoin müssen Benutzer die Kosten tragen, wenn sie über Ethereum Transaktionen senden oder mit einem Smart Contract (Programm, das auf der Blockchain ausgeführt wird) interagieren. Diese Transaktionskosten werden bei Ethereum als Gaspreise bezeichnet, und der Preis kann je nach Auslastung variieren. Wenn sich viele Benutzer auf dem Netzwerk tümmeln, können die Gaspreise enorm steigen. Weitere Informationen zu Gaspreisen und wie sie diesen Sommer geradezu explodierten, findest du hier. Versierte Benutzer warten daher, bis die Gaspreise sinken, bevor sie mit Smart Contracts auf Ethereum interagieren. Die SMS-API von Twilio ist das ideale Tool, um sich über die Gaspreise auf dem Laufenden zu halten.  In diesem Blog zeige ich, wie wir eine Serverless-Anwendung schreiben, die eine SMS-Benachrichtigung sendet, wenn die Gaspreise unter ein bestimmtes Niveau sinken.

Wenn du kein Interesse an Gaspreisen hast, kann der Ablauf in diesem Tutorial auch verwendet werden, um jede HTTPS-REST-API über Serverless mit der SMS-API von Twilio zu verbinden und Abfragen zu stellen.

Technische Voraussetzungen

Für dieses Tutorial benötigen wir Folgendes:

  • Ein kostenloses Twilio-Konto. Wenn du dich über diesen Link registrierst, erhältst du ein Guthaben von 10 $ bei einem Upgrade auf ein kostenpflichtiges Konto.
  • Ein Serverless-Konto
  • Installiertes Node.js und npm

Fangen wir an.

Erstellen einer Serverless-Anwendung

Wir verwenden das Serverless-Framework, um unsere Anwendung zu schreiben. Serverless eignet sich ideal zum Erstellen von serverlosen Funktionen, die auf AWS Lambda gehostet werden. Serverless abstrahiert die AWS-Schnittstelle für uns, d. h., wir können über die Benutzeroberfläche von Serverless arbeiten und müssen nur minimalen Gebrauch der AWS-Konsole machen. Wir lösen unsere Funktionen nur zu bestimmten Zeitintervallen aus, deshalb benötigen wir keinen Server, der rund um die Uhr ausgeführt wird. Für dieses Tutorial nutzen wir die kostenlose Stufe von Serverless, damit uns keine Kosten entstehen.

Wir installieren die Severless-CLI als globales npm-Modul.

npm install -g serverless

Dann erstellen wir ein neues Verzeichnis und führen den folgenden Befehl aus, um eine serverlose Anwendung zu erzeugen.

serverless create --template aws-nodejs

Nachdem wir unser Konto erstellt haben, wählen wir in der Benutzeroberfläche von Serverless.com die Option „Create app“ und anschließend „Serverless Framework“ aus. 

Wir wählen „Create app“ aus

Auswahl von Serverless framework in der UI

Wir öffnen die neu erstellte servless.yml und fügen die org hinzu (wie in der Benutzeroberfläche dargestellt). Außerdem heben wir in der serverless.yml die Auskommentierung auf und aktualisieren den Pfad wie folgt:

   events:
     - http:
         path: gas
         method: get

Dadurch wird ein Endpunkt für die Auslösung unserer serverlosen Funktion erzeugt. Später ersetzen wir diesen durch einen geplanten Timer für eine Auslösung zu bestimmten Zeitintervallen.

Wir melden uns an und führen die Bereitstellung in der CLI mit folgendem Befehl durch:

serverless login
serverless // only required for first time using serverless to setup AWS credentials see http://slss.io/aws-creds-setup
serverless deploy

Wir sollten jetzt unsere Anwendung im Dashboard von Severless.com sehen. Die Serverless-Benutzeroberfläche und die Konsolenausgabe zeigen uns auch den URL-Endpunkt an. Wir testen in unserem Browser, ob die Funktion richtig bereitgestellt wurde.

Abfragen der DeFi Pulse-API

Die Gaspreise fragen wir über die Gas Station-API ab. Dazu senden wir eine GET-Anfrage an die folgende URL:

https://data-api.defipulse.com/api/v1/egs/api/ethgasAPI.json

Wenn wir das in unserem Browser, in Postman oder über curl testen, erhalten wir ein Objekt mit den Gaspreisdaten zurück. Wir fügen diese Anfrage der handler.js-Funktion hinzu:

const axios = require("axios");

module.exports.hello = async (event) => {
 const gasData = await axios
   .get("https://data-api.defipulse.com/api/v1/egs/api/ethgasAPI.json") 
     .catch((err) => {
     console.error(err.response);
     return err.response;
   });

 if (gasData.status != 200) {
   return {
     statusCode: gasData.statusCode,
     body: JSON.stringify(gasData.statusText),
   };
 }

 return { statusCode: 200, body: JSON.stringify(gasData.data) };
};

Hier haben wir Axios verwendet, um unsere HTTPS-Anfrage zu stellen. Weitere Informationen zum Stellen von Anfragen findest du hier. Wir installieren Axios mit dem Befehl npm install axios. Dann führen wir unsere serverlose Funktion lokal aus, um zu sehen, ob sie auch funktioniert. Um die Funktion lokal auszuführen, installieren wir das Plug-in „serverless-offline“ mit dem Befehl npm install serverless-offline --save-dev und fügen es unserer YML-Datei hinzu:

plugins:
  - serverless-offline

Anschließend führen wir Folgendes aus:

serverless offline

Wenn wir jetzt im Browser http://localhost:3000/dev/users/create aufrufen, sollten wir ein JSON-Objekt mit den erforderlichen Gaspreisdaten sehen. Im Terminal werden die Protokolle angezeigt, wenn wir lokal arbeiten. Sobald das funktioniert, können wir mit dem Befehl serverless deploy eine Remote-Bereitstellung durchführen, um das Gleiche unter der bereitgestellten URL zu sehen.

Hinzufügen von Twilio

Wir verfügen nun über die erforderlichen Daten. Im nächsten Schritt müssen wir unsere Funktion mit Twilio verbinden und eine SMS senden. Falls wir noch keine Telefonnummer haben, müssen wir zuerst eine kaufen. Wir melden uns hierzu an der Twilio-Konsole an und navigieren zu „Phone Numbers“ > „Buy a Number“. Wir suchen nach einer Nummer, die für SMS aktiviert ist, und kaufen sie.

Nummer kaufen

Wir öffnen unsere serverless.yml und fügen ihr Folgendes als Umgebungsvariablen hinzu:

   environment:
     TWILIO_SID: YOUR_TWILIO_SID
     TWILIO_AUTH: YOU_TWILIO_AUTH_TOKEN
     FROM: YOUR_TWILIO_NUMBER  # for number use this format '+15017122661'
     TO: RECIPIENT_NUMBER

Unsere Twilio ACCOUNT_SID und das Twilio AUTH TOKEN finden wir im Konsolen-Dashboard.

Als Nächstes installieren wir mit npm die Twilio-Hilfebibliothek für unsere Funktion. Dann importieren wir sie und übergeben unsere Anmeldeinformationen, um einen Twilio-Client zu erstellen.

const client = require("twilio")(
 process.env.TWILIO_SID,
 process.env.TWILIO_AUTH
);

Innerhalb unserer Funktion können wir nach der if-Anweisung, die Fehler aufgreift, Folgendes hinzufügen:

 // if (gasData.data.safeLow < 40) {
   const message = await client.messages.create({
     body: `🦉 Gas Prices are low.
             Currently
               fast: ${gasData.data.fast},
               fastest: ${gasData.data.fastest},
               safeLow: ${gasData.data.safeLow},
               average: ${gasData.data.average},`,
     from: process.env.FROM,
     to: process.env.TO,
   });
 // }

Wir führen einen weiteren lokalen Test durch. Wenn lokal Fehler auflaufen, schreiben wir Protokolle und prüfen die Fehler im Terminal, um sie zu beheben. Wenn alles richtig funktioniert, heben wir die Auskommentierung der if-Anweisung auf, damit Benachrichtigungen nur gesendet werden, wenn die Gaspreise niedrig sind. Wir können die Parameter der if-Anweisung auf jede gewünschte Stufe anpassen.

Planen von Triggern

Wir haben unsere Funktion zum Laufen gebracht. Jetzt können wir unseren Trigger von einem Endpunkt-Trigger in einen geplanten Trigger ändern. Diesen Vorgang führen wir wiederum in unserer serverless.yml aus. Wir suchen den Abschnitt events und entfernen das HTTP-Attribut. Wir heben die Auskommentierung des Werts „schedule“ auf und ersetzen ihn durch ein Zeitintervall unserer Wahl.

   events:
        - schedule: rate(2 hours)

Wir führen ein letztes Mal serverless deploy aus. Gut gemacht! Jetzt haben wir ein serverloses SMS-Benachrichtigungssystem, das uns bei niedrigen Gaspreisen benachrichtigt.

Fazit

In diesem Tutorial haben wir gesehen, wie wir ein SMS-Benachrichtigungssystem für Ethereum-Gaspreise erstellen. Weitere Anregungen zu Blockchains und Twilio findest du in folgenden Blogs: Tägliches Abrufen und Senden von aktuellen Bitcoin-Kursen mit CEX.io, Twilio-SMS und PHP und Konvertieren von Bitcoin in lokale Währungen mit PHP. Wenn du an einer Entwicklung mit Blockchain und Twilio arbeitest, würde ich gern davon erfahren. Kontaktiere mich auf Twitter oder sende eine E-Mail an rblack@twilo.com.

Wir können den Gas Station-API-Aufruf natürlich auch durch jede andere REST-API ersetzen, die wir lieber verwenden oder auf die wir Zugriff haben. Serverless und Twilio sind ein tolles Team zum Erstellen dieser Art von Diensten, mit denen wir uns selbst oder unseren Benutzern unterwegs Benachrichtigungen senden können.