Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.

1. Übersicht über Cisco Spark Bot

Cisco Spark verfügt über eine Bot-Funktion. Anstatt eine Person zu erwähnen und mit ihr zu sprechen, versteht der Bot, wenn Sie einen Bot erwähnen und mit ihm sprechen, ihn als Befehl, verarbeitet ihn und gibt die resultierende Nachricht zurück (tatsächlich leitet der Bot nur weiter und die eigentliche Verarbeitung ist abgeschlossen. Ein anderes Programm tut).

Es hängt von der Idee ab, welche Art von Verarbeitung durchgeführt wird und welche Art von Ergebnis zurückgegeben wird. Der einfachste Vorgang besteht darin, einen Bot zu erstellen, der auf die Nachricht Ping mit Pong reagiert. Für den eigentlichen Verarbeitungsteil wird das AWS Lambda + Amazon API-Gateway verwendet.

1-1 Übersicht über die Verarbeitung

  1. Erwähne den Bot und poste eine Nachricht
  2. Bot sendet (Relais) im folgenden Format an die Ziel-URL:
  1. Es ist die Rolle von API Gateway, die Ziel-URL zu haben
  2. Lambda startet den API-Gateway-Empfang als "Auslöser"
  3. Die Reaktion von Bot auf POST muss von Ihnen selbst in Lambda programmiert werden
CiscoSparkBot.png

Beachten Sie, dass die Nutzdaten ** nicht die Nachricht selbst enthalten, sondern nur die Nachrichten-ID **, wenn der Bot HTTP-POSTs an die Ziel-URL in 2. sendet. Um die Nachricht selbst zu erhalten, müssen Sie ein HTTP-GET von Lambda zu Cisco Spark durchführen, um die der ID entsprechende Nachricht zu erhalten. Bereiten Sie dieses Programm selbst vor (6 in der Abbildung). Sie müssen auch ein Programm (HTTP POST) vorbereiten, das die Ergebnisse in Cisco Spark anzeigt (7 in der Abbildung).

2. Einstellungsverfahren auf der Cisco Spark-Seite

2-1. Erstellen eines Bots

Sie müssen sich als echter Benutzer anmelden, um einen Bot zu erstellen. Weil Bot in Verbindung mit dem tatsächlichen Benutzer registriert ist.

Gehen Sie zur folgenden Site und klicken Sie auf "Bot erstellen": https://developer.ciscospark.com/add-app.html

image.png

Füllen Sie alle folgenden drei Punkte auf dem folgenden Bildschirm aus:

image.png

Wenn Sie es richtig eingeben, wird das Zugriffstoken für Bot angezeigt. Notieren Sie es sich. Es wird nicht ablaufen. Mit Vorsicht behandeln.

2-2. Bot zum Raum hinzufügen

Öffnen Sie Cisco Spark, gehen Sie zu einem beliebigen Raum und fügen Sie den Bot dem Raum auf die gleiche Weise hinzu, wie Sie eine Person zu einem Raum hinzufügen würden (suchen Sie nach dem Namen des Bots und fügen Sie ihn dann hinzu).

2-3 Über Webhook

Wenn Sie eine Nachricht an Cisco Spark senden, leitet der Bot sie weiter und leitet sie über HTTP POST an ein anderes Programm weiter. Es gibt verschiedene Möglichkeiten, das Programm zu verarbeiten. In der Regel wird das Ergebnis jedoch an den Bot zurückgegeben (sogenannter Rückruf) und auf Cisco Spark angezeigt. Der Mechanismus des Rückrufs über HTTP heißt Webhook.

Die Ziel-URL ist besonders wichtig für die Konfiguration von Webhooks. Der Bot ist das Ziel, um HTTP-POST an die angegebene URL zu senden, die im Internet vorhanden ist.

Die Ziel-URL und das Programm müssen vom Ersteller des Bots vorbereitet werden. Zu diesem Zweck können Sie beispielsweise die herkömmliche Methode verwenden, z. B. einen Server vorbereiten, das Betriebssystem installieren, den Webserver ausführen, eine IP-Adresse zuweisen und anschließend eine URL zuweisen. Da dies viel Zeit und Mühe kostet, bereiten wir hier die Ziel-URL mithilfe des API-Gateways vor und führen das eigentliche Programm auf Lambda aus.

Um die Ziel-URL zu ermitteln, müssen Sie zuerst das Lambda + API-Gateway konfigurieren. Richten Sie den Webhook für Cisco Spark in 4-1.1 ein.

3. Einstellungen für das AWS Lambda + Amazon API Gateway

3-1 Erstellen Sie ein Bereitstellungspaket für Python

Ein Bereitstellungspaket ist eine komprimierte Version der folgenden beiden als Zip-Datei:

Führen Sie die folgenden Schritte aus, um Folgendes zu erstellen:

  1. Melden Sie sich bei der AWS CLI an.
  2. Erstellen Sie ein Python-Programm für Lambda. Der Dateiname sollte mit dem Lambda-Funktionsnamen (LF4CiscoSpark) übereinstimmen. Erstellen Sie hier das folgende Beispielprogramm:
$ vi LF4CiscoSpark.py
---
from __future__ import print_function

import boto3
import json
import requests
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

access_code = ''        #Geben Sie den Bot-Zugangscode ein
botDisplayName = ''     #Geben Sie den Bot-Namen ein

def sendSparkGET(event):
    url = 'https://api.ciscospark.com/v1/messages/{0}'.format(event.get('data')['id'])
    headers = {
        'Authorization' : 'Bearer ' + access_code,
        'Content-Type' : 'application/json'
    }
    r1 = requests.get(url, headers = headers)
    return json.loads(r1.text)

def sendSparkPOST(event,message_detail):
    url = 'https://api.ciscospark.com/v1/messages/'
    headers = {
        'Authorization' : 'Bearer ' + access_code,
        'Content-Type' : 'application/json'
    }
    payload = {
      "roomId" : event.get('data')['roomId'],
      "text" : 'pong'
    }
    r1 = requests.post(url, headers = headers, data = json.dumps(payload))
    return True

def handler(event, context):
    print("Received event: " + json.dumps(event, indent=2))

    message_detail = sendSparkGET(event)
    bot_command = message_detail['text']
    
    bot_commands = {
        botDisplayName + 'ping' : lambda x, y : sendSparkPOST(x, y)
    }

    if bot_command in bot_commands:
        return bot_commands[bot_command](event,message_detail)
    else:
        raise ValueError('Unrecognized operation')
---
  1. Anforderungen werden in das obige Programm importiert, sind jedoch standardmäßig nicht in der Lambda-Ausführungsumgebung enthalten. Wenn Sie eine nicht standardmäßige Bibliothek verwenden möchten, müssen Sie die Datei der entsprechenden Bibliothek (Anforderungen) in das Bereitstellungspaket aufnehmen. Die entsprechenden Dateien sollten sich normalerweise in Site-Paketen befinden, also komprimieren Sie zuerst das Verzeichnis site-packages / request:
$ zip LF4CiscoSpark.zip -r /(path-to-site-packages)/site-packages/requests
  1. Fügen Sie als Nächstes die soeben erstellte Datei LF4CiscoSpark.py zur Zip-Datei hinzu:
$ zip -g LF4CiscoSpark.zip LF4CiscoSpark.py

Über das Programm

Erwähnen Sie den Bot und senden Sie eine "Ping" -Nachricht, und der Bot antwortet mit "Pong". Wenn Sie einen anderen Befehl als "ping" verwenden möchten, beschreiben Sie den Prozess in bot_commands.

3-2. Erstellen Sie eine IAM-Rolle

IAM ist ein Mechanismus, der steuert, auf welche AWS-Ressourcen Benutzer zugreifen können und wie sie verwendet werden können. Als allgemeine Einstellungsprozedur: 1) Erstellen einer Rolle, 2) Erstellen einer Richtlinie und 3) Anhängen einer Richtlinie an eine Rolle. Da die Richtlinie diesmal die Standardrichtlinie verwendet, ist es nicht erforderlich, 2) auszuführen. Wenn der Vorgang abgeschlossen ist, wird eine Zeichenfolge mit dem Namen Role ARN angezeigt. Dies ist erforderlich, um die Lambda-Funktion im nächsten Schritt zu erstellen.

  1. Melden Sie sich bei der IAM-Konsole an (https://console.aws.amazon.com/iam/).
  2. Klicken Sie auf "Rollen".
  3. Klicken Sie auf Neue Rolle erstellen.
  4. Stellen Sie sicher, dass die AWS-Servicerolle ausgewählt ist.
  5. Klicken Sie neben AWS Lambda auf Auswählen.
  6. Geben Sie Lambda in das Feld "Filter" ein.
  7. Überprüfen Sie die entsprechende Richtlinie anhand der angezeigten Standardrichtlinien. Wählen Sie hier AWSLambdaBasicExecutionRole aus. Hinweis) Es ist wichtig, eine geeignete Sicherheitsrichtlinie auszuwählen. Unter hier finden Sie eine Liste der AWS-Standardrichtlinien. Suchen Sie daher mit "AWSLambda" nach dem Richtliniennamen und wählen Sie den Namen aus, der für AWSLambdaBasicExecutionRole besser geeignet ist. Sie sollten auf "Aktion" achten und vergleichen.
  8. Der "Rollenname" ist Lambda-Gateway-Ausführungsrolle.
  9. Klicken Sie auf Rolle erstellen.
  10. Klicken Sie auf die soeben erstellte Lambda-Gateway-Ausführungsrolle (den Rollennamen, anstatt ihn zu überprüfen).
  11. Notieren Sie sich die Rolle ARN (Zeichenfolge beginnend mit arn :). Dies ist erforderlich, um die Lambda-Funktion im nächsten Schritt zu erstellen

3-3. Erstellen Sie die Lambda-Funktion

  1. Melden Sie sich bei der AWS CLI an.
  2. Erstellen Sie eine Lambda-Funktion mit dem folgenden Befehl. Geben Sie für arn: die im vorherigen Schritt erhaltene und für Region und Profil die entsprechenden an. Es scheint, dass der Name der Zip-Datei und der Name des Handlers mit dem Namen der Funktion identisch sein müssen.
$ aws lambda create-function --region us-west-2 \
--function-name LF4CiscoSpark \
--zip-file fileb://LF4CiscoSpark.zip \
--role arn:xxxxxxxxxxxxxxxxxx \
--handler LF4CiscoSpark.handler \
--runtime python3.6 \
--profile adminuser
$ aws lambda update-function-code \
--function-name LF4CiscoSpark \
--zip-file fileb://LF4CiscoSpark.zip

3-4 API-Gateway erstellen

Dieses Mal verwenden wir AWS CLI, um ein API-Gateway zu erstellen. Es gibt einige Schritte, aber es ist einfacher zu verstehen, ob Sie arbeiten, während Sie die Arbeitsergebnisse in der CLI einzeln auf der AWS-Konsole überprüfen.

3-4-1. Erstellen einer API

  1. Melden Sie sich bei der AWS CLI an.
  2. Erstellen Sie mit dem folgenden Befehl eine API mit dem Namen API4CiscoSpark. Wenn die Erstellung erfolgreich ist, wird eine API-ID generiert, um die API zu identifizieren.
$ aws apigateway create-rest-api \
--name API4CiscoSpark \
--region us-west-2 \
--profile adminuser
(Ausführungsergebnis unten)
{
    "name": "API4CiscoSpark",
    "createdDate": 1501839827,
    "id": ""				           # API ID
}

Ergebnis der AWS-Konsolenanzeige (API-Gateway):

API_Gateway_step1.png
  1. Ermitteln Sie die ID der Stammressource der API:
$ aws apigateway get-resources \
--rest-api-id (API ID)
(Ausführungsergebnis unten)
{
    "items": [
        {
            "path": "/",
            "id": ""			       # ROOT RESOURCE ID
        }
    ]
}

3-4-2. Erstellen von untergeordneten API-Ressourcen

  1. Erstellen Sie eine untergeordnete Ressource Resource4CiscoSpark der API4CiscoSpark-API mit dem folgenden Befehl:
$ aws apigateway create-resource \
--rest-api-id (API ID) \
--parent-id (ROOT RESOURCE ID) \
--path-part Resource4CiscoSpark
(Ausführungsergebnis unten)
{
    "pathPart": "Resource4CiscoSpark",
    "parentId": "",
    "path": "/Resource4CiscoSpark",
    "id": ""			                # RESOURCE ID
}

Ergebnis der AWS-Konsolenanzeige (API-Gateway):

API_Gateway_step2.png

3-4-3. Erstellen einer Methode

  1. Fügen Sie der Resource4CiscoSpark-Ressource mit dem folgenden Befehl eine POST-Methode hinzu:
$ aws apigateway put-method \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--authorization-type NONE

Ergebnis der AWS-Konsolenanzeige:

API_Gateway_step3.png

3-4-4. Legen Sie die Lambda-Funktion als Ziel der POST-Methode fest

  1. Legen Sie mit dem folgenden Befehl die Lambda-Funktion als Ziel der POST-Methode fest. Geben Sie unter (Kontonummer) die 12-stellige Nummer Ihrer AWS-Kontonummer ein:
$ aws apigateway put-integration \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--type AWS \
--integration-http-method POST \
--uri arn:aws:apigateway:(region):lambda:path/2015-03-31/functions/arn:aws:lambda:(region):(Kontonummer):function:LF4CiscoSpark/invocations

Ergebnis der AWS-Konsolenanzeige (API-Gateway):

API_Gateway_step4.png

3-4-5. Setzen Sie die Antwort der POST-Methode auf JSON

  1. Setzen Sie die Antwort der POST-Methode mit dem folgenden Befehl auf JSON. Diese Einstellung gibt den Antworttyp an, den die API-Methode zurückgibt.
$ aws apigateway put-method-response \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--status-code 200 \
--response-models "{\"application/json\": \"Empty\"}"

3-4-6. Setzen Sie die integrierte Antwort der POST-Methode auf JSON

  1. Setzen Sie die integrierte Antwort der POST-Methode mit dem folgenden Befehl auf JSON. Mit dieser Einstellung Gibt die Art der Antwort an, die von der Lambda-Funktion zurückgegeben wird.
$ aws apigateway put-integration-response \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--status-code 200 \
--response-templates "{\"application/json\": \"\"}"

Ergebnis der AWS-Konsolenanzeige (API-Gateway):

API_Gateway_step5.png

3-4-7. Stellen Sie die API bereit

  1. Stellen Sie die erstellte API mit dem folgenden Befehl auf der Stufe prod (Produktion = Produktionsumgebung) bereit:
$ aws apigateway create-deployment \
--rest-api-id (API ID) \
--stage-name prod

Ergebnis der AWS-Konsolenanzeige (API-Gateway):

API_Gateway_step6.png

Die rechts neben dem Aufrufen einer URL aufgeführte URL ist die Ziel-URL für die Webhooks von Cisco Spark.

3-4-8. Geben Sie API Gateway als Auslöser für Lambda an

$ aws lambda add-permission \
--function-name LF4CiscoSpark \
--statement-id apigateway \
--action lambda:InvokeFunction \
--principal apigateway.amazonaws.com \
--source-arn "arn:aws:execute-api:us-west-2:(Kontonummer):(API ID)/prod/POST/Resource4CiscoSpark"

Ergebnis der Anzeige der AWS-Konsole (* AWS Lambda *):

API_Gateway_step7.png

4. Abschluss der Einstellung und Funktionsprüfung

4-1. Einrichten eines Webhooks in Cisco Spark

Führen Sie HTTP PUT unter den folgenden Bedingungen aus, um einen Webhook einzurichten:

roomId kann von [hier] aus untersucht werden (https://developer.ciscospark.com/endpoint-rooms-roomId-get.html).

API_Gateway_step11.png
import requests

access_code = ''                       #Geben Sie hier den Zugangscode ein

url = 'https://api.ciscospark.com/v1/webhooks'
headers = {
    'Authorization' : 'Bearer ' + access_code,
    'Content-Type' : 'application/json'
}

r = requests.put(url, headers = headers)

{
  'name' : 'My Awesome Webhook',
  'targetUrl' : 'https://example.com/mywebhook',
  'resource' : 'messages',
  'event' : 'created',
  'filter' : 'roomId=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
}

4-2. Funktionsprüfung

Erwähnen Sie den Bot in Cisco Spark und geben Sie "ping" ein. Der Bot gibt dann "pong" zurück.

API_Gateway_step10.png

(Ergänzung) So generieren Sie ein API-Gateway-Protokoll

  1. Öffnen Sie den API-Gateway-Dienst in der AWS-Konsole.
  2. Klicken Sie auf API-Name (API4CiscoSpark)> Stage> prod, um die Registerkarte Einstellungen anzuzeigen.
  3. Aktivieren Sie "CloudWatch-Protokolle aktivieren". Stellen Sie die "Protokollstufe" ein.
  4. "Änderungen speichern"
API_Gateway_step8.png
  1. Sie können das Protokoll in CloudWatch überprüfen

Recommended Posts

Versuchen Sie, einen Cisco Spark Bot mit AWS Lambda + Amazon API Gateway (Python) zu implementieren.
LINE BOT mit Python + AWS Lambda + API Gateway
[AWS] Versuchen Sie, API Gateway + Lambda mit X-Ray zu verfolgen
Amazon API Gateway und AWS Lambda Python-Version
[AWS] API mit API Gateway + Lambda erstellen
Nehmen Sie schnell eine Abfragezeichenfolge mit API Gateway-> Lambda (Python)
Erstellen Sie mit AWS SAM schnell eine API mit Python, Lambda und API Gateway
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
[AWS SAM] Erstellen Sie eine API mit DynamoDB + Lambda + API Gateway
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
AWS CDK-Lambda + API-Gateway (Python)
[AWS] Versuchen Sie, die Python-Bibliothek mit SAM + Lambda (Python) zur Ebene hinzuzufügen.
"Inoffizielle Apple Refurbished Product Introduction" BOT mit LINE Messaging API (v2) + API Gateway + Lambda (Python)
Ich habe ein Skript geschrieben, um mit AWS Lambda + Python 2.7 schnell eine Entwicklungsumgebung für Twitter Bot zu erstellen
Benachrichtigen Sie HipChat mit AWS Lambda (Python)
Senden Sie mit ESP32-WROOM-32 aufgenommene Bilder an AWS (API Gateway → Lambda → S3).
Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Ich habe ChatOps mit Slack x API Gateway x Lambda (Python) x RDS ausprobiert
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
[AWS] Verwenden von INI-Dateien mit Lambda [Python]
Python ruft die Google Cloud Vision API von LINE BOT über AWS Lambda auf
[AWS] Erstellen Sie mit CodeStar eine Python Lambda-Umgebung und führen Sie Hello World aus
Holen Sie sich Lebensmitteldaten mit Amazon API (Python)
Versuchen Sie, XOR mit der Keras Functional API zu implementieren
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Stellen Sie mit AWS Lambda Python eine Verbindung zu s3 her
Versuchen Sie, eine Karte mit Python + Cartopy 0.18.0 zu zeichnen
Machen wir einen Twitter-Bot mit Python!
Einfache REST-API mit API Gateway / Lambda / DynamoDB
Versuchen Sie, Python: Lambda zuzuweisen oder zu wechseln
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt
Erstellen Sie mit AWS Lambda einen Bot, der Instanzen mit bestimmten Tags automatisch startet / stoppt
Führen Sie regelmäßig Python-Programme auf AWS Lambda aus
Machen Sie Twitter Trend Bot mit Heroku + Python
Versuchen Sie Tensorflow mit einer GPU-Instanz unter AWS
Zeigen Sie Bilder in S3 mit API Gateway + Lambda an
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Serverlose Anwendung mit AWS SAM! (APIGATEWAY + Lambda (Python))
Schritte zum Erstellen eines Twitter-Bots mit Python
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
Mattermost Bot mit Python gemacht (+ Flask)
Hinweis zur Verarbeitung von POST-Daten durch Herstellen einer Verbindung zu Lambda über das AWS API Gateway (HTTP API)
Versuchen Sie, Schedule auszuführen, um Instanzen in AWS Lambda (Python) zu starten und zu stoppen.
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Dynamische HTML-Seiten mit AWS Lambda und Python
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Probieren Sie einfach Amazon EMR / Cloud Dataproc mit Python aus [mrjob]
Spielen mit der benutzerlokalen API für künstliche Intelligenz in Python
Versuchen Sie, assoziativen Speicher durch Hop-Field-Netzwerk in Python zu implementieren
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
[Blender] Ergänzen Sie die Python-API von Blender mit einem Texteditor