[PYTHON] [AWS] Ich habe BOT mit LINE WORKS daran erinnert

Es ist der 7. Tag des Adventskalenders.

Dieses Mal habe ich einen Erinnerungs-BOT in der AWS-Umgebung erstellt. Cloudformation-Vorlagen werden ebenfalls veröffentlicht. Wenn Sie interessiert sind, schauen Sie bitte vorbei.

Klicken Sie hier, um einen Artikel zur Implementierung in Lambda zu lesen (https://qiita.com/peyryo/items/ff5a2a693d47ce13fa18).

BOT abgeschlossen

Der BOT-Austausch ist so. iOS の画像.png

Es hat die folgenden Funktionen.

Dieses Mal habe ich über das Menü für feste Gespräche eine Schaltfläche auf dem BOT platziert.

Gesamtstruktur

overview.png

AWS wurde verwendet, um das BOT-Backend zu erstellen. Dieses Mal habe ich versucht, es ohne Server zu erstellen, um es so einfach wie möglich zu machen.

API Gateway und Lambda sind für die Interaktion mit dem BOT verantwortlich, und DynamoDB wird zum Verwalten des Gesprächsstatus verwendet.

Nachrichten an LINEWORKS-> AWS werden von Lambda über API Gateway verarbeitet. Daher wird die API-Gateway-URL in der LINE WORKS BOT-Rückruf-URL festgelegt.

Die Nachrichtenbenachrichtigung an AWS-> LINEWORKS erfolgt durch Lambda zum Senden über SQS. Das zum Senden einer Nachricht erforderliche Zugriffstoken und der Authentifizierungsschlüssel werden von S3 verwaltet.

Erinnerungsbenachrichtigungen nutzen das CloudWatch-Ereignis, um Lambda regelmäßig zu starten Dies wird durch Abfragen der Ereignisse in DynamoDB erreicht.

Vorlage

Cloudformation wird zum Erstellen von AWS-Ressourcen verwendet. Dieses Mal habe ich AWS SAM verwendet, das einfach zu schreiben ist, da ich Lambda und API Gateway verwende.

Die Namen und Einstellungswerte verschiedener Ressourcen werden entsprechend festgelegt. Wenn Sie sie also verwenden möchten, ändern Sie sie entsprechend.

template.yaml

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

#Legen Sie Vorlagenparameter fest, um die erforderlichen Anmeldeinformationen an den LINEWORKS BOT zu übergeben
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

#Eigenschaften, die auf alle Lambda-Funktionen angewendet werden
Globals:
  Function:
    AutoPublishAlias: live
    Timeout: 10
    #Eigenschaften, die auf Lambda-Funktionen angewendet werden
    Environment:
      Variables:
        BOT_NO: !Ref BotNo
        API_ID: !Ref ApiId
        SERVER_LIST_ID: !Ref ServerListId 
        SERVER_API_CONSUMER_KEY: !Ref ServerApiConsumerKey

Resources:

  # AWS ->Lambdas Funktion, die für die Benachrichtigung von LINE WORKS verantwortlich ist
  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:
        #Definieren Sie hier SQS-Trigger
        SQS1:
          Type: SQS
          Properties:
            Queue:
              Fn::GetAtt:
                - MessageQueue
                - Arn
            BatchSize: 10

  # LINEWORKS ->Lambdas Funktion, die für den Empfang von AWS verantwortlich ist
  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

  #Lambda-Funktion zum Registrieren des Ereignisses von 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:
        #Hier definiertes CloudWatch-Ereignis
        Schedule:
          Type: Schedule
          Properties:
            #Das Abfrageintervall beträgt 5 Minuten
            Schedule: rate(5 minutes)

  #Lambda-Funktionsbehörde (süß)
  #Gilt vorerst für alle Lambda-Funktionen
  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: "*"

  #Definition von 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
      #Stellen Sie "Ablaufzeit" auf TTL
      #Elemente können automatisch durch Einstellen von TTL gelöscht werden
      TimeToLiveSpecification:
        AttributeName: ExpireTime
        Enabled: true
      Tags:
        - Key: key
          Value: value

  #Definition von SQS
  MessageQueue:
    Type: 'AWS::SQS::Queue'
    Properties:
      QueueName: lineworks-message-queue

Bei der Bereitstellung habe ich das folgende Skript verwendet. Der Stapelname ist ebenfalls angemessen.

build.sh

###Ändern Sie hier je nach Umgebung
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}

Zusammenfassung

Ich habe versucht, einen Erinnerungs-BOT in einer Umgebung ohne Server unter AWS zu erstellen.

Das nächste Mal möchte ich die Implementierung von Lambda-Funktionen vorstellen. Link zur Implementierung

Recommended Posts

[AWS] Ich habe BOT mit LINE WORKS daran erinnert
[AWS] Ich habe BOT mit LINE WORKS (Implementierung) in Erinnerung gerufen.
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe mit LINE Bot ein Haushaltsbuch für Bot erstellt
Ich habe versucht, LINE BOT mit Python und Heroku zu machen
Erstellen Sie mit Amazon Lex einen LINE WORKS-Bot
Mattermost Bot mit Python gemacht (+ Flask)
Ich habe einen Zwietrachtbot gemacht
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe mit Python einen Daemon erstellt
Bis Django etwas mit einem Linienbot zurückgibt!
Ich habe einen harten Pomodoro-Timer entwickelt, der mit CUI funktioniert
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe einen neuen AWS S3-Eimer hergestellt
Ich habe mit Python einen Zeichenzähler erstellt
Ich habe einen Twitter-Bot mit Go x Qiita API x Lambda erstellt
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Ich habe einen Slack-Bot geschrieben, der Verzögerungsinformationen mit AWS Lambda benachrichtigt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe meinen Hund "Monaka Bot" mit Line Bot gemacht
Erstellen Sie mit Minette für Python einen LINE BOT
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
LINE BOT mit Python + AWS Lambda + API Gateway
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Serverloser LINE-Bot mit IBM Cloud-Funktionen
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Ich habe mit Python ein Bin-Picking-Spiel gemacht
〇✕ Ich habe ein Spiel gemacht
Ich habe einen Bot erstellt, um ihn auf Twitter zu posten, indem ich mit AWS Lambda eine dynamische Site im Internet abgekratzt habe (Fortsetzung).
Ich habe einen LINE BOT erstellt, der mithilfe der Flickr-API ein Bild von Reis-Terroristen zurückgibt
Ich habe einen Zeilenbot erstellt, der Python verwendet, um ungelesene E-Mails aus Google Mail abzurufen!
Ich habe einen LINE-Bot erstellt, der jeden Tag pünktlich empfohlene Bilder sendet
[Python] Ich habe einen LINE-Bot erstellt, der Gesichter erkennt und Mosaikverarbeitungen durchführt.
[Für Anfänger] Ich habe mit Raspberry Pi einen menschlichen Sensor erstellt und LINE benachrichtigt!
In Python habe ich einen LINE-Bot erstellt, der Polleninformationen aus Standortinformationen sendet.
Machen Sie mit LINE + Flask einen morphologischen Analyse-Bot
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht
Ich habe mit Tkinter ein Fenster für die Protokollausgabe erstellt
Ich habe mit Python eine App für die Benachrichtigung über Netznachrichten erstellt
Lassen Sie einen Papagei LINE Bot mit AWS Cloud9 zurückgeben
Ich habe eine Python3-Umgebung unter Ubuntu mit direnv erstellt.
[Valentine Spezialprojekt] Ich habe eine LINE-Kompatibilitätsdiagnose gestellt!
Vorgehensweise zum Erstellen eines Linienbot in AWS Lambda