[PYTHON] [AWS] J'ai créé un BOT de rappel avec LINE WORKS

C'est le 7ème jour du calendrier de l'Avent.

Cette fois, j'ai créé un BOT de rappel dans l'environnement AWS. Des modèles Cloudformation seront également publiés, alors jetez un œil si vous êtes intéressé.

Cliquez ici pour consulter un article sur la mise en œuvre dans Lambda (https://qiita.com/peyryo/items/ff5a2a693d47ce13fa18)

BOT terminé

L'échange BOT est comme ça. iOS の画像.png

Il a les fonctions suivantes.

--Fonction d'enregistrement d'événement

--Fonction de référence d'événement

--Fonction de notification d'événement --BOT vous informera lorsque la date et l'heure de l'événement enregistré approchent.

Cette fois, j'ai placé un bouton sur le BOT en utilisant un menu de conversation fixe.

structure globale

overview.png

AWS a été utilisé pour créer le backend BOT. Cette fois, j'ai essayé de le construire sans serveur afin de le rendre aussi simple que possible.

API Gateway et Lambda sont responsables de l'interaction avec le BOT, et DynamoDB est utilisé pour gérer l'état de la conversation.

Les messages envoyés à LINEWORKS-> AWS sont traités par lambda via API Gateway. Par conséquent, l'URL de la passerelle API est définie dans l'URL de rappel LINE WORKS BOT.

La notification de message à AWS-> LINEWORKS est effectuée par Lambda pour l'envoi via SQS. Le jeton d'accès et la clé d'authentification requis pour envoyer un message sont gérés par S3.

Les notifications de rappel tirent parti de CloudWatch Event pour lancer Lambda régulièrement Ceci est réalisé en interrogeant les événements dans DynamoDB.

modèle

Cloudformation est utilisé pour créer des ressources AWS. Cette fois, j'ai utilisé AWS SAM, qui est facile à écrire car j'utilise Lambda et API Gateway.

Les noms et les valeurs de paramétrage des différentes ressources sont définis de manière appropriée, donc si vous souhaitez les utiliser, modifiez-les en conséquence.

template.yaml

AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31

#Définissez les paramètres du modèle pour transmettre les informations d'identification requises au LINEWORKS BOT
Parameters:
  BotNo:
    Description: LINEWORKS bot number
    Type: String
  ApiId:
    Description: LINEWORKS api id
    Type: String
  ServerListId:
    Description: LINEWORKS server list id
    Type: String
  ServerApiConsumerKey:
    Description: LINEWORKS server api consumer key
    Type: String

#Propriétés appliquées à toutes les fonctions Lambda
Globals:
  Function:
    AutoPublishAlias: live
    Timeout: 10
    #Propriétés appliquées aux fonctions Lambda
    Environment:
      Variables:
        BOT_NO: !Ref BotNo
        API_ID: !Ref ApiId
        SERVER_LIST_ID: !Ref ServerListId 
        SERVER_API_CONSUMER_KEY: !Ref ServerApiConsumerKey

Resources:

  # AWS ->Fonction Lambda chargée de notifier LINE WORKS
  SendLambda:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: 'send-lineworks-message'
      Handler: index.handler
      Runtime: python3.7
      CodeUri: lambda/send-message
      Role:
        Fn::GetAtt:
        - LambdaExecutionRole
        - Arn
      Events:
        #Définissez les déclencheurs SQS ici
        SQS1:
          Type: SQS
          Properties:
            Queue:
              Fn::GetAtt:
                - MessageQueue
                - Arn
            BatchSize: 10

  # LINEWORKS ->Fonction de Lambda chargée de recevoir AWS
  RecieveMessage:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: 'recieve-lineworks-message'
      Handler: index.handler
      Runtime: python3.7
      CodeUri: lambda/recieve-message
      Role:
        Fn::GetAtt:
        - LambdaExecutionRole
        - Arn
      Events:
        PostEvent:
          Type: Api
          Properties:
            Path: /callback
            Method: post

  #Fonction Lambda pour enregistrer l'événement à partir de DynamoDB
  GetEvents:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: 'get-events'
      Handler: index.handler
      Runtime: python3.7
      CodeUri: lambda/get-events
      Role:
        Fn::GetAtt:
        - LambdaExecutionRole
        - Arn
      Events:
        #Événement CloudWatch défini ici
        Schedule:
          Type: Schedule
          Properties:
            #L'intervalle d'interrogation est de 5 minutes
            Schedule: rate(5 minutes)

  #Autorité de fonction Lambda (douce)
  #Pour le moment, appliquer à toutes les fonctions Lambda
  LambdaExecutionRole:
    Description: Creating service role in IAM for AWS Lambda
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub 'LineWorksLambdaExecution'
      AssumeRolePolicyDocument:
        Statement:
        - Effect: Allow
          Principal:
            Service: [lambda.amazonaws.com]
          Action: sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - !Sub 'arn:${AWS::Partition}:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
      Policies:
        - 
         PolicyName: lineworks-lambda-execution-role
         PolicyDocument:
           Version: "2012-10-17"
           Statement:
              - 
                Effect: "Allow"
                Action: "sqs:*"
                Resource: "*"
              - 
                Effect: "Allow"
                Action: "dynamodb:*"
                Resource: "*"

  #Définition de DynamoDB
  LineWorksDB:
    Type: AWS::DynamoDB::Table
    Properties:
      AttributeDefinitions: 
        - 
          AttributeName: "Hash"
          AttributeType: "S"
        - 
          AttributeName: "Range"
          AttributeType: "S"
      KeySchema: 
        - 
          AttributeName: "Hash"
          KeyType: "HASH"
        - 
          AttributeName: "Range"
          KeyType: "RANGE"
      ProvisionedThroughput:
        ReadCapacityUnits: "1"
        WriteCapacityUnits: "1"
      TableName: lineworks-sample-table
      #Définissez "Expire Time" sur TTL
      #Les éléments peuvent être supprimés automatiquement en définissant TTL
      TimeToLiveSpecification:
        AttributeName: ExpireTime
        Enabled: true
      Tags:
        - Key: key
          Value: value

  #Définition de SQS
  MessageQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: lineworks-message-queue

Lors du déploiement, j'ai utilisé le script suivant. Le nom de la pile est également approprié.

build.sh

###Modifiez ici en fonction de chaque environnement
BOT_NO="xxx"
API_ID="yyy"
SERVER_LIST_ID="zzz"
SERVER_API_CONSUMER_KEY="aaa"
DEPLOY_S3_BUCKET = "bbb"
###

aws cloudformation package --template template.yml --s3-bucket ${DEPLOY_S3_BUCKET} --output-template template-export.yml

aws cloudformation deploy \
    --template-file template-export.yml \
    --stack-name lineworks-sample-stack \
    --capabilities CAPABILITY_NAMED_IAM \
    --parameter-overrides BotNo=${BOT_NO} ApiId=${API_ID} ServerListId=${SERVER_LIST_ID} ServerApiConsumerKey=${SERVER_API_CONSUMER_KEY}

Résumé

J'ai essayé de créer un BOT de rappel dans un environnement sans serveur sur AWS.

La prochaine fois, j'aimerais vous présenter l'implémentation des fonctions Lambda. Lien pour la mise en œuvre

Recommended Posts

[AWS] J'ai créé un BOT de rappel avec LINE WORKS
[AWS] J'ai créé un BOT de rappel avec LINE WORKS (implémentation)
J'ai fait un robot de remplacement de tampon avec une ligne
J'ai créé un Bot LINE avec Serverless Framework!
J'ai créé un bot de livre de compte de ménage avec LINE Bot
J'ai essayé de faire LINE BOT avec Python et Heroku
Créer un bot LINE WORKS avec Amazon Lex
Made Mattermost Bot avec Python (+ Flask)
J'ai fait un robot discord
J'ai fait un Twitter BOT avec GAE (python) (avec une référence)
J'ai fait un wikipedia gacha bot
J'ai fait une loterie avec Python.
J'ai créé un démon avec Python
Jusqu'à ce que Django retourne quelque chose avec un robot de ligne!
J'ai fait une minuterie pomodoro dure qui fonctionne avec CUI
J'ai créé un nouveau compartiment AWS S3
J'ai fait un compteur de caractères avec Python
J'ai créé un bot Twitter avec Go x Qiita API x Lambda
J'ai fait une carte hexadécimale avec Python
J'ai fait un jeu de vie avec Numpy
J'ai fait un générateur Hanko avec GAN
J'ai fait un jeu rogue-like avec Python
J'ai fait un simple blackjack avec Python
J'ai créé un fichier de configuration avec Python
J'ai fait une application WEB avec Django
J'ai fait un simulateur de neurones avec Python
J'ai essayé de créer un LINE BOT "Sakurai-san" avec API Gateway + Lambda
J'ai écrit un bot Slack qui notifie les informations de retard avec AWS Lambda
J'ai fait une prévision météo de type bot avec Python.
J'ai créé une application graphique avec Python + PyQt5
J'ai fait mon chien "Monaka Bot" avec Line Bot
Créer un LINE BOT avec Minette pour Python
J'ai essayé de créer un bloqueur de filles pourries sur Twitter avec Python ①
[Python] J'ai créé un téléchargeur Youtube avec Tkinter.
LINE BOT avec Python + AWS Lambda + API Gateway
J'ai fait un simple portefeuille de Bitcoin avec pycoin
Bot LINE sans serveur conçu avec IBM Cloud Functions
J'ai fait un graphique de nombres aléatoires avec Numpy
J'ai fait un jeu de cueillette avec Python
〇✕ J'ai fait un jeu
J'ai créé un robot pour publier sur Twitter en grattant sur le Web un site dynamique avec AWS Lambda (suite)
J'ai créé un LINE BOT qui renvoie une image de riz terroriste en utilisant l'API Flickr
J'ai créé un Line Bot qui utilise Python pour récupérer les e-mails non lus de Gmail!
J'ai créé un robot LINE qui envoie des images recommandées tous les jours à l'heure
[Python] J'ai créé un LINE Bot qui détecte les visages et effectue le traitement de la mosaïque.
[Pour les débutants] J'ai fait un capteur humain avec Raspberry Pi et notifié LINE!
En Python, j'ai créé un LINE Bot qui envoie des informations sur le pollen à partir des informations de localisation.
Faire un bot d'analyse morphologique de manière lâche avec LINE + Flask
J'ai créé un serveur syslog prêt à l'emploi avec Play with Docker
J'ai fait un jeu d'éclairage de sapin de Noël avec Python
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
J'ai créé une application de notification de nouvelles en ligne avec Python
Créer un robot LINE de retour de perroquet avec AWS Cloud9
J'ai créé un environnement Python3 sur Ubuntu avec direnv.
[Projet spécial Valentine] J'ai fait un diagnostic de compatibilité LINE!
Procédure de création d'un Line Bot sur AWS Lambda