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)
L'échange BOT est comme ça.
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.
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.
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}
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