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).
Der BOT-Austausch ist so.
Es hat die folgenden Funktionen.
Ereignisregistrierungsfunktion
Sie können das Ereignis, an das Sie erinnern möchten, registrieren, indem Sie den Titel und die Uhrzeit des Ereignisses eingeben.
Die Registrierung wird durch Drücken der Schaltfläche "Ereignisregistrierung" gestartet.
Ereignisreferenzfunktion
Sie können sich auf die registrierte Veranstaltung beziehen.
Sie können auf das Ereignis verweisen, indem Sie auf die Schaltfläche "Ereignis durchsuchen" klicken.
Ereignisbenachrichtigungsfunktion --BOT benachrichtigt Sie, wenn sich Datum und Uhrzeit der registrierten Veranstaltung nähern.
Dieses Mal habe ich über das Menü für feste Gespräche eine Schaltfläche auf dem BOT platziert.
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.
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}
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