Serverloses Rechnen basierend auf OpenWhisk, Teil 2


Dieser Artikel setzt die Reihe der übersetzten Notizen zu OpenWhisk von Priti Desai fort . Heute werden Beispiele für die Bereitstellung von GitHub-Webhooks, periodische Signale sowie die einfachste Anwendung zum Senden von Nachrichten an Slack vorgestellt.


Github Webhook


OpenWhisk-Funktionen können durch verschiedene Ereignisse (z. B. Push, Pull Request usw.) aus dem GitHub-Repository ausgelöst werden.


Schauen wir uns an, wie Sie mit wskdeploy eine Funktion zum Behandeln des GitHub-Webhooks bereitstellen können .


Erster Schritt


Erstellen Sie eine Manifestdatei:


Um Ereignisse mit GitHub zu verarbeiten, müssen Sie die Ereignisquelle /whisk.system/github/webhook als Bedingung für das Auslösen angeben:


 packages: helloworld: actions: helloworld: location: src/hello.js runtime: nodejs:6 inputs: name: type: string description: name of a person place: type: string description: location of a person outputs: payload: type: string description: a simple greeting message, Hello World! triggers: GitHubWebhookTrigger: feed: /whisk.system/github/webhook rules: helloworldOnWebhook: action: helloworld trigger: GitHubWebhookTrigger 

Zweiter Schritt


Wir erstellen eine Datei für die Bereitstellung, in der wir die Werte der Eingabeparameter username , repository , accessToken und events für die bedingte Verarbeitung der Ereignisquelle GitHubWebhookTrigger festlegen :


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: GitHubWebhookTrigger: inputs: username: pritidesai repository: pritidesai/helloworld accessToken: <accessToken> events: push 

Schritt drei


Erweitern Sie die Funktion:


 ./wskdeploy -p ~/SampleHelloWorldApp/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: helloworld bindings: * action: helloworld bindings: - name: name value: Amy - name: place value: Paris Triggers: * trigger: GitHubWebhookTrigger bindings: - name: accessToken value: **** - name: events value: push - name: username value: pritidesai - name: repository value: pritidesai/helloworld annotations: - name: feed value: /whisk.system/github/webhook Rules * rule: helloworldOnWebhook - trigger: GitHubWebhookTrigger - action: helloworld Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed GitHubWebhookTrigger ... Done! Deploying rule helloworldOnWebhook ... Done! Deployment completed successfully. 

Wir haben die Funktion " Hallo Welt" implementiert, die von GitHub jedes Mal aufgerufen wird, wenn wir den Code im GitHub-Repository aktualisieren. Dazu haben wir den Webhook verwendet:



Wir können die implementierte Funktion überprüfen, indem wir neue Codeänderungen im GitHub-Repository erstellen. In diesem Fall werden einfache Begrüßungsnachrichten zurückgegeben. Versuchen wir, die Payload zu verwenden, wenn der von GitHub über eine POST-Anfrage gesendete Code aktualisiert wird. Diese Daten stehen als Funktionsparameter zur Verfügung, zum Beispiel:


 function main(params) { console.log("GitHub repository is at ", params.repository.url); return {commits: params.commits}; } 

Hier ist ein Ausschnitt aus der Nutzlast, die durch die normale Bearbeitung von README.md erhalten wurde:


 "commits" : [ { "author" : { "name" : Priti Desai, "username" : pritidesai }, "timestamp" : 2017-03-20T12:54:41-07:00, "removed" : [ ], "modified" : [ README.md ], "added" : [ ], "message" : Update README.md, "committer" : { "name" : GitHub, "email" : noreply@github.com, "username" : web-flow } } ], 

Eine ausführliche Beschreibung der Funktionsweise von GitHub-Webhooks finden Sie hier.


Signale


OpenWhisk-Funktionen können periodisch durch ein internes Signal ausgelöst werden (so etwas wie Cron-Tasks). Versuchen wir, über wskdeploy einen bedingten Trigger für ein Signal wskdeploy .


Erster Schritt


Um Signale zu verarbeiten, müssen Sie die Ereignisquelle /whisk.system/alarms/alarm als Bedingung für die Auslösung im Manifest angeben:


 packages: helloworld: actions: helloworld: location: src/hello.js runtime: nodejs:6 inputs: name: type: string description: name of a person place: type: string description: location of a person outputs: payload: type: string description: a simple greeting message, Hello World! triggers: Every12Hours: feed: /whisk.system/alarms/alarm rules: hellowroldOnCron: action: helloworld trigger: Every12Hours 

Zweiter Schritt


Erstellen Sie eine Datei für die Bereitstellung, geben Sie cron als Eingabebedingung mit dem Wert Every12Hours an . Sie können auch beide Optionen verwenden, die in Cron (traditionell) und Enhanced (erweitert) verwendet werden:


 <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week>  <Minute> <Hour> <Day_of_the_Month> <Month_of_the_Year> <Day_of_the_Week> <Year> 

Inhalt der Datei deployment.yaml:


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: Every12Hours: inputs: cron: "0 */12 * * *" 

Es ist möglich, die beim Auslösen des Signals übertragene Nutzlast (die bei jedem Auslösen als Funktionsparameter übertragen wird) als trigger_payload- Parameter anzugeben :


 application: name: SampleHelloWorld namespace: _ packages: helloworld: actions: helloworld: inputs: name: Amy place: Paris triggers: Every12Hours: inputs: cron: "0 */12 * * * *" trigger_payload: "{\"name\":\"Mark\", \"place\":\"Barcelona\"}" 

Schritt drei


Erweitern Sie die Funktion:


 ./wskdeploy -p ~/SampleHelloWorldApp/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: helloworld bindings: * action: helloworld bindings: - name: name value: Amy - name: place value: Paris Triggers: * trigger: Every12Hours bindings: - name: cron value: 0 */12 * * * * annotations: - name: feed value: /whisk.system/alarms/alarm Rules * rule: helloworldEvery12Hours - trigger: Every12Hours - action: helloworld Do you really want to deploy this? (y/N): y Deploying package helloworld ... Done! Deploying action helloworld/helloworld ... Done! Deploying trigger feed Every12Hours ... Done! Deploying rule helloworldEvery12Hours ... Done! Deployment completed successfully. 

Von nun an hat ac eine Hallo-Welt- Funktion, die alle 12 Stunden ausgeführt wird. Wir können dies überprüfen, indem wir die Bedingung wie oben gezeigt aktivieren


Paket für Slack


Um Nachrichten an Slack zu senden, wird ein Paket für Slack angeboten. Schauen wir uns die wskdeploy mit wskdeploy .


Erster Schritt


Erstellen Sie eine Manifestdatei mit einer Paketbindung für Slack. /whisk.system/slack Sie dies als Abhängigkeit an und setzen Sie den Standortwert auf /whisk.system/slack :


 packages: SlackPackage: dependencies: slack-package-to-post-messages: location: /whisk.system/slack inputs: username: $SLACK_USERNAME url: $SLACK_URL channel: $SLACK_CHANNEL 

Zunächst müssen wir die Unterstützung für den eingehenden Webhook in unserer Slack-Arbeitsumgebung konfigurieren. Mit dieser schrittweisen Anleitung können Sie einen neuen Webhook konfigurieren, um Nachrichten an den Slack-Kanal zu senden.


Jetzt fügen wir unserer Anwendung das Paket für Slack hinzu, um stündlich Nachrichten an den Slack-Kanal zu senden.


 packages: SlackPackage: dependencies: slack-package-to-post-messages: location: /whisk.system/slack inputs: username: $SLACK_USERNAME url: $SLACK_URL channel: $SLACK_CHANNEL actions: post-to-slack: function: actions/post-to-slack.js runtime: nodejs:6 inputs: message: type: string description: message to post on slack slack_package: type: string description: slack package name triggers: everyhour: feed: /whisk.system/alarms/alarm rules: post-to-slack-every-hour: action: post-to-slack trigger: everyhour 

Der Inhalt der Funktion post-to-slack.js kann hier eingesehen werden .


Zweiter Schritt


Erstellen Sie eine Datei für die Bereitstellung:


 application: name: AppToPostToSlack packages: SlackPackage: actions: post-to-slack: inputs: message: "Hello from WskDeploy!" slack_package: slack-package-to-post-messages triggers: everyhour: inputs: cron: "0 */1 * * *" 

Schritt drei


Erweitern Sie die Funktion:


 ./wskdeploy -p ~/AppToPostToSlack/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \ __\/ |_| Packages: Name: SlackPackage bindings: * dependency: slack-package-to-post-messages location: /whisk.system/slack * action: post-to-slack bindings: - message : "Hello from WskDeploy!" - slack_package : "slack-package-to-post-messages" annotations: Triggers: * trigger: everyhour bindings: - cron : "0 */1 * * *" annotations: - name: feed value: /whisk.system/alarms/alarm Rules * rule: post-to-slack-every-hour - trigger: everyhour - action: SlackPackage/post-to-slack Do you really want to deploy this? (y/N): y Deployment completed successfully. 

In diesem Schritt haben wir bereits eine Post-to-Slack-Funktion, die 1 Mal pro Stunde ausgeführt wird. Sie können dies überprüfen, indem Sie die Bedingung wie oben gezeigt aktivieren. Nach der Aktivierung sollten wir eine neue Nachricht auf dem Slack-Kanal erhalten:


 Activation: post-to-slack (9909dd5229e84526bff9902a2cd860df) [ "2017-09-12T23:05:17.17872899Z stdout: Hello from WskDeploy!", "2017-09-12T23:05:17.549177677Z stdout: Posted message to slack" ] 

Andere Fahrradartikel


Serverloses Rechnen basierend auf OpenWhisk, Teil 1
Serverloses Rechnen basierend auf OpenWhisk, Teil 2
Serverloses Rechnen basierend auf OpenWhisk, Teil 3
Serverloses Rechnen basierend auf OpenWhisk, Teil 4

Source: https://habr.com/ru/post/de477628/


All Articles