Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)

1. Présentation de Cisco Spark Bot

Cisco Spark a une fonction Bot. Au lieu de mentionner et de parler à une personne, lorsque vous mentionnez et parlez à un Bot, le Bot le comprend comme une commande, le traite et renvoie le message résultant (en fait, le Bot ne fait que relayer et le traitement réel est effectué. Un autre programme fait).

Cela dépend de l'idée du type de traitement effectué et du type de résultat renvoyé. Le processus le plus simple ici consiste à créer un bot qui répond au message ping avec pong. Pour la partie de traitement proprement dite, la passerelle d'API AWS Lambda + Amazon sera utilisée.

1-1. Présentation du traitement

  1. Mentionnez le Bot et postez un message
  2. Le bot envoie (relais) à l'URL cible au format suivant:
  1. C'est le rôle d'API Gateway d'avoir l'URL cible
  2. Lambda lance la réception d'API Gateway en tant que "déclencheur"
  3. La réaction au POST de Bot doit être programmée par vous-même dans Lambda
CiscoSparkBot.png

Notez que lorsque le Bot HTTP POST à l'URL cible en 2., la charge utile ** ne contient pas le message lui-même, seulement l'ID de message **. Pour obtenir le message lui-même, vous devez effectuer un HTTP GET de Lambda à Cisco Spark pour obtenir le message correspondant à l'ID. Préparez vous-même ce programme (6 sur la figure). Vous devez également préparer un programme (HTTP POST) qui affiche les résultats dans Cisco Spark (7 sur la figure).

2. Procédure de configuration côté Cisco Spark

2-1. Créer un bot

Vous devez vous connecter en tant qu'utilisateur réel pour créer un bot. Parce que Bot est enregistré en association avec l'utilisateur réel.

Accédez au site suivant et cliquez sur "Créer un robot": https://developer.ciscospark.com/add-app.html

image.png

Remplissez les trois éléments suivants sur l'écran suivant:

image.png

Si vous le saisissez correctement, le jeton d'accès pour Bot sera affiché, alors notez-le. Il n'expirera pas. Manipuler avec soin.

2-2. Ajouter un bot à la pièce

Ouvrez Cisco Spark, accédez à n'importe quelle salle et ajoutez le bot à la salle de la même manière que vous ajouteriez une personne à une salle (recherchez par le nom du bot, puis ajoutez).

2-3. À propos de Webhook

Lorsque vous publiez un message sur Cisco Spark, le Bot le relaie et le transmet à un autre programme via HTTP POST. Il existe différentes manières de traiter le programme, mais le résultat est généralement renvoyé au Bot (appelé rappel) et affiché sur Cisco Spark. Le mécanisme de rappel par HTTP est appelé Webhook.

L'URL cible est particulièrement importante pour la configuration des webhooks. Le Bot est la destination pour lancer HTTP POST à l'URL spécifiée qui existe sur Internet.

L'URL cible et le programme doivent être préparés par le créateur du Bot. Pour cela, par exemple, vous pouvez utiliser la méthode conventionnelle telle que la préparation d'un serveur, l'installation du système d'exploitation, l'exécution du serveur Web, l'attribution d'une adresse IP, puis l'attribution d'une URL. Comme cela prend beaucoup de temps et d'efforts, nous préparons ici l'URL cible à l'aide d'API Gateway et exécutons le programme réel sur Lambda.

Pour déterminer l'URL cible, vous devez d'abord configurer Lambda + API Gateway. Configurez le webhook Cisco Spark dans 4-1.1.

3. Paramètres latéraux AWS Lambda + Amazon API Gateway

3-1. Créer un package de déploiement pour Python

Un package de déploiement est une version compressée des deux suivants sous forme de fichier zip:

Suivez les étapes ci-dessous pour créer:

  1. Connectez-vous à l'AWS CLI.
  2. Créez un programme Python pour Lambda. Le nom de fichier doit être le même que le nom de la fonction Lambda (LF4CiscoSpark). Ici, créez l'exemple de programme suivant:
$ 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 = ''        #Entrez le code d'accès au bot
botDisplayName = ''     #Entrez le nom du bot

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. Les requêtes sont importées dans le programme ci-dessus, mais elles ne sont pas incluses par défaut dans l'environnement d'exécution Lambda. Si vous souhaitez utiliser une bibliothèque non standard, vous devez inclure le fichier de la bibliothèque correspondante (requêtes) dans le package de déploiement. Les fichiers correspondants doivent normalement être dans site-packages, donc commencez par compresser le répertoire site-packages / requests:
$ zip LF4CiscoSpark.zip -r /(path-to-site-packages)/site-packages/requests
  1. Ensuite, ajoutez le LF4CiscoSpark.py que vous venez de créer au fichier zip:
$ zip -g LF4CiscoSpark.zip LF4CiscoSpark.py

À propos du programme

Mentionnez le Bot et envoyez un message "ping", et le Bot répondra "pong". Si vous souhaitez utiliser une commande autre que "ping", décrivez le processus dans bot_commands.

3-2. Créer un rôle IAM

IAM est un mécanisme qui contrôle les ressources AWS auxquelles les utilisateurs peuvent accéder et comment elles peuvent être utilisées. En tant que procédure de configuration générale, 1) créez un rôle, 2) créez une stratégie et 3) associez une stratégie à un rôle. Puisque la politique utilise la politique standard cette fois, il n'est pas nécessaire d'effectuer 2). Lorsque la procédure est terminée, vous verrez une chaîne appelée Role ARN. Cela est nécessaire pour créer la fonction Lambda à l'étape suivante.

  1. Connectez-vous à la console IAM (https://console.aws.amazon.com/iam/).
  2. Cliquez sur "Rouler".
  3. Cliquez sur Créer un nouveau rôle.
  4. Assurez-vous que le rôle de service AWS est sélectionné.
  5. Cliquez sur Sélectionner en regard d'AWS Lambda.
  6. Entrez lambda dans le champ intitulé "Filtre"
  7. Vérifiez la stratégie appropriée parmi les stratégies standard affichées. Ici, sélectionnez AWSLambdaBasicExecutionRole. Remarque) Il est important de sélectionner une stratégie appropriée pour la sécurité. Il existe une liste des stratégies standard AWS sur ici, recherchez donc le nom de la stratégie avec "AWSLambda" et sélectionnez celle qui est plus appropriée que AWSLambdaBasicExecutionRole. Vous devez faire attention à "Action" et comparer.
  8. Le "nom du rôle" est lambda-gateway-execution-role.
  9. Cliquez sur Créer un rôle.
  10. Cliquez sur le rôle d'exécution de passerelle lambda que vous venez de créer (le nom du rôle au lieu de le vérifier)
  11. Notez le rôle ARN (chaîne commençant par arn :). Ceci est nécessaire pour créer la fonction Lambda à l'étape suivante

3-3. Créer une fonction Lambda

  1. Connectez-vous à l'AWS CLI.
  2. Créez une fonction lambda avec la commande suivante. Pour arn:, spécifiez celui obtenu à l'étape précédente, et pour la région et le profil, spécifiez ceux qui conviennent. Il semble que le nom du fichier zip et le nom du gestionnaire doivent être les mêmes que le nom de la fonction.
$ 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. Créer une passerelle API

Cette fois, nous utiliserons l'AWS CLI pour créer API Gateway. Il y a quelques étapes, mais il est plus facile de comprendre si vous travaillez en vérifiant les résultats du travail dans la CLI un par un sur la console AWS.

3-4-1. Création d'une API

  1. Connectez-vous à l'AWS CLI.
  2. Créez une API nommée API4CiscoSpark avec la commande suivante. Si la création réussit, un ID d'API sera généré pour identifier l'API.
$ aws apigateway create-rest-api \
--name API4CiscoSpark \
--region us-west-2 \
--profile adminuser
(Résultat d'exécution ci-dessous)
{
    "name": "API4CiscoSpark",
    "createdDate": 1501839827,
    "id": ""				           # API ID
}

Résultat d'affichage de la console AWS (API Gateway):

API_Gateway_step1.png
  1. Découvrez l'ID de la ressource racine de l'API:
$ aws apigateway get-resources \
--rest-api-id (API ID)
(Résultat d'exécution ci-dessous)
{
    "items": [
        {
            "path": "/",
            "id": ""			       # ROOT RESOURCE ID
        }
    ]
}

3-4-2. Création de ressources enfants API

  1. Créez une ressource enfant Resource4CiscoSpark de l'API API4CiscoSpark avec la commande suivante:
$ aws apigateway create-resource \
--rest-api-id (API ID) \
--parent-id (ROOT RESOURCE ID) \
--path-part Resource4CiscoSpark
(Résultat d'exécution ci-dessous)
{
    "pathPart": "Resource4CiscoSpark",
    "parentId": "",
    "path": "/Resource4CiscoSpark",
    "id": ""			                # RESOURCE ID
}

Résultat d'affichage de la console AWS (API Gateway):

API_Gateway_step2.png

3-4-3. Création d'une méthode

  1. Ajoutez une méthode POST à la ressource Resource4CiscoSpark avec la commande suivante:
$ aws apigateway put-method \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--authorization-type NONE

Résultat d'affichage de la console AWS:

API_Gateway_step3.png

3-4-4. Définir la fonction Lambda comme destination de la méthode POST

  1. Définissez la fonction Lambda comme destination de la méthode POST à l'aide de la commande suivante. Entrez le numéro à 12 chiffres de votre numéro de compte AWS dans (Numéro de compte):
$ 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):(Numéro de compte):function:LF4CiscoSpark/invocations

Résultat d'affichage de la console AWS (API Gateway):

API_Gateway_step4.png

3-4-5. Définissez la réponse de la méthode POST sur JSON

  1. Définissez la réponse de la méthode POST sur JSON avec la commande suivante. Ce paramètre spécifie le type de réponse renvoyé par la méthode API.
$ 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. Définissez la réponse intégrée de la méthode POST sur JSON

  1. Définissez la réponse intégrée de la méthode POST sur JSON avec la commande suivante. Avec ce paramètre Spécifie le type de réponse renvoyé par la fonction Lambda.
$ aws apigateway put-integration-response \
--rest-api-id (API ID) \
--resource-id (RESOURCE ID) \
--http-method POST \
--status-code 200 \
--response-templates "{\"application/json\": \"\"}"

Résultat d'affichage de la console AWS (API Gateway):

API_Gateway_step5.png

3-4-7. Déployer l'API

  1. Déployez l'API créée à l'étape appelée prod (production = environnement de production) avec la commande suivante:
$ aws apigateway create-deployment \
--rest-api-id (API ID) \
--stage-name prod

Résultat d'affichage de la console AWS (API Gateway):

API_Gateway_step6.png

L'URL répertoriée à droite de Appel d'une URL est l'URL cible des webhooks Cisco Spark.

3-4-8. Spécifier API Gateway comme déclencheur pour Lambda

$ 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:(Numéro de compte):(API ID)/prod/POST/Resource4CiscoSpark"

Résultat d'affichage de la console AWS (* AWS Lambda *):

API_Gateway_step7.png

4. Achèvement du réglage et du contrôle de fonctionnement

4-1. Configuration d'un webhook dans Cisco Spark

Pour configurer un webhook, exécutez HTTP PUT dans les conditions suivantes:

roomId peut être étudié depuis ici.

API_Gateway_step11.png
import requests

access_code = ''                       #Entrez le code d'accès ici

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. Contrôle de fonctionnement

Mentionnez le Bot dans Cisco Spark et tapez "ping" et le Bot retournera "pong".

API_Gateway_step10.png

(Supplément) Pour générer le journal API Gateway

  1. Ouvrez le service API Gateway dans la console AWS.
  2. Cliquez sur Nom d'API (API4CiscoSpark)> Étape> prod pour afficher l'onglet Paramètres.
  3. Cochez «Activer les journaux CloudWatch». Définissez le "niveau de journalisation".
  4. "Enregistrer les modifications"
API_Gateway_step8.png
  1. Vous pouvez vérifier le journal sur CloudWatch

Recommended Posts

Essayez d'implémenter un robot Cisco Spark avec AWS Lambda + Amazon API Gateway (Python)
LINE BOT avec Python + AWS Lambda + API Gateway
[AWS] Essayez de tracer API Gateway + Lambda avec X-Ray
Version Amazon API Gateway et AWS Lambda Python
[AWS] Créer une API avec API Gateway + Lambda
Prenez rapidement une chaîne de requête avec API Gateway-> Lambda (Python)
Créez rapidement une API avec Python, lambda et API Gateway à l'aide d'AWS SAM
[Python] J'ai écrit une API REST en utilisant AWS API Gateway et Lambda.
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
[AWS SAM] Créer une API avec DynamoDB + Lambda + API Gateway
Créer une couche pour AWS Lambda Python dans Docker
AWS CDK-Lambda + API Gateway (Python)
[AWS] Essayez d'ajouter la bibliothèque Python à la couche avec SAM + Lambda (Python)
Création d'un BOT «Présentation non officielle du produit remis à neuf par Apple» avec l'API de messagerie LINE (v2) + API Gateway + lambda (python)
J'ai écrit un script pour créer rapidement un environnement de développement pour Twitter Bot avec AWS Lambda + Python 2.7
Notifier HipChat avec AWS Lambda (Python)
Envoyer les images prises avec ESP32-WROOM-32 vers AWS (API Gateway → Lambda → S3)
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
[LINE Messaging API] Créez un BOT qui se connecte à quelqu'un avec Python
J'ai essayé ChatOps avec Slack x API Gateway x Lambda (Python) x RDS
Comment créer une API de machine learning sans serveur avec AWS Lambda
[AWS] Utilisation de fichiers ini avec Lambda [Python]
Python appelant l'API Google Cloud Vision depuis LINE BOT via AWS Lambda
[AWS] Créez un environnement Python Lambda avec CodeStar et faites Hello World
Obtenez des données alimentaires avec l'API Amazon (Python)
Essayez d'implémenter XOR avec l'API fonctionnelle Keras
Essayez le scraping HTML avec la bibliothèque Python
Connectez-vous à s3 avec AWS Lambda Python
Essayez de dessiner une carte avec python + cartopy 0.18.0
Faisons un bot Twitter avec Python!
API REST facile avec API Gateway / Lambda / DynamoDB
Essayez d'attribuer ou de changer avec Python: lambda
J'ai écrit un bot Slack qui notifie les informations de retard avec AWS Lambda
Créez un bot avec AWS Lambda qui démarre / arrête automatiquement les instances avec des balises spécifiques
Exécutez régulièrement des programmes Python sur AWS Lambda
Créer un bot Twitter Trend avec heroku + Python
Essayez Tensorflow avec une instance GPU sur AWS
Afficher les images sur S3 avec API Gateway + Lambda
Essayez de dessiner une courbe de vie avec python
Essayez de créer un code de "décryptage" en Python
Application sans serveur avec AWS SAM! (APIGATEWAY + Lambda (Python))
Étapes pour créer un bot Twitter avec Python
Essayez de créer un groupe de dièdre avec Python
Créer un bot LINE WORKS avec Amazon Lex
Made Mattermost Bot avec Python (+ Flask)
Remarque pour le traitement des données POST en se connectant à Lambda via la passerelle API d'AWS (API HTTP)
Essayez d'exécuter Schedule pour démarrer et arrêter des instances dans AWS Lambda (Python)
[AWS] J'ai créé un BOT de rappel avec LINE WORKS
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
Pages HTML dynamiques créées avec AWS Lambda et Python
Faisons un outil de veille de commande avec python
Essayez facilement Amazon EMR / Cloud Dataproc avec Python [mrjob]
Jouer avec l'API d'intelligence artificielle locale de l'utilisateur en Python
Essayez d'implémenter la mémoire associative par hop field network en Python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
[Blender] Complétez l'API Python de Blender avec un éditeur de texte