[AWS] LINEWORKS에서 미리 알림 BOT를 만들어 보았습니다.
17046 단어 파이썬LINEWORKSserverlessAWS
이번에는 AWS 환경에서 미리 알림 BOT을 만들려고했습니다.
Cloudformation 템플릿도 게재되므로 관심이 있으시면 자세히 알아보세요.
Lambda의 구현 기사는 여기
완성된 BOT
BOT의 교환은 이런 느낌입니다.
다음 기능이 있습니다.
이벤트 등록 기능
이벤트 참조 기능
이벤트 알림 기능
이번에는 BOT에 토크 고정 메뉴를 사용하여 버튼을 배치했습니다.
전체 구성
BOT의 백엔드 구축은 AWS를 활용했습니다.
이번에는 가능한 한 손쉽게 만들기 위해 서버리스로 구축해 보았습니다.
BOT와의 상호 작용은 API Gateway와 Lambda가 담당하며 토크 상태 관리에 DynamoDB를 사용합니다.
LINEWORKS -> AWS에 대한 메시지는 API Gateway를 통해 lambda에서 처리됩니다.
따라서 LINEWORKS BOT의 callback URL은 API Gateway URL을 설정합니다.
AWS->LINEWORKS에 대한 메시지 알림은 SQS를 통해 전송을 위해 Lambda가 수행합니다.
메시지 전송에 필요한 액세스 토큰 및 인증 키는 S3에서 관리합니다.
알림 알림은 CloudWatch Event를 사용하여 Lambda를 정기적으로 시작하고,
DynamoDB 내에 있는 이벤트를 폴링하여 실현하고 있습니다.
템플릿
AWS 리소스를 생성하려면 Cloudformation을 사용합니다.
이번에는 Lambda와 API Gateway를 사용하기 때문에 작성하기 쉬운 AWS SAM을 사용했습니다.
각종 자원의 명칭과 설정값은 적당하게 설정되어 있으므로, 사용하는 경우는 적절히 바꾸어 주십시오.
template.yaml
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
# テンプレートのパラメータに 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
# 全Lambda関数に適用されるプロパティ
Globals:
Function:
AutoPublishAlias: live
Timeout: 10
# Lambdaの関数に適用されるプロパティ
Environment:
Variables:
BOT_NO: !Ref BotNo
API_ID: !Ref ApiId
SERVER_LIST_ID: !Ref ServerListId
SERVER_API_CONSUMER_KEY: !Ref ServerApiConsumerKey
Resources:
# AWS -> LINEWORKSへの通知を担うLambdaの関数
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:
# SQS のトリガーをここで定義
SQS1:
Type: SQS
Properties:
Queue:
Fn::GetAtt:
- MessageQueue
- Arn
BatchSize: 10
# LINEWORKS -> AWS の受信処理を担うLambdaの関数
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
# DynamoDBから登録されているEventを取得するLambda関数
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:
# CloudWatch Eventをここで定義
Schedule:
Type: Schedule
Properties:
# ポーリング間隔は5分
Schedule: rate(5 minutes)
# Lambda関数 の権限(甘め)
# とりあえず、全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: "*"
# 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
# 「ExpireTime」をTTLに設定
# TTLを設定することでアイテムの自動削除が可能
TimeToLiveSpecification:
AttributeName: ExpireTime
Enabled: true
Tags:
- Key: key
Value: value
# SQSの定義
MessageQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: lineworks-message-queue
배포할 때 다음 스크립트를 사용했습니다.
스택 이름도 적당합니다.
build.sh
### ここは適宜それぞれの環境に合わせて変更
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}
요약
AWS에서 서버리스 환경에서 미리 알림 BOT을 만들려고했습니다.
다음에 람다 함수의 구현에 대해 소개하고 싶습니다.
실장편의 링크처
Reference
이 문제에 관하여([AWS] LINEWORKS에서 미리 알림 BOT를 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/peyryo/items/05c1b7e6c7e1ebdb550e
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
AWSTemplateFormatVersion: 2010-09-09
Transform:
- AWS::Serverless-2016-10-31
# テンプレートのパラメータに 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
# 全Lambda関数に適用されるプロパティ
Globals:
Function:
AutoPublishAlias: live
Timeout: 10
# Lambdaの関数に適用されるプロパティ
Environment:
Variables:
BOT_NO: !Ref BotNo
API_ID: !Ref ApiId
SERVER_LIST_ID: !Ref ServerListId
SERVER_API_CONSUMER_KEY: !Ref ServerApiConsumerKey
Resources:
# AWS -> LINEWORKSへの通知を担うLambdaの関数
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:
# SQS のトリガーをここで定義
SQS1:
Type: SQS
Properties:
Queue:
Fn::GetAtt:
- MessageQueue
- Arn
BatchSize: 10
# LINEWORKS -> AWS の受信処理を担うLambdaの関数
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
# DynamoDBから登録されているEventを取得するLambda関数
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:
# CloudWatch Eventをここで定義
Schedule:
Type: Schedule
Properties:
# ポーリング間隔は5分
Schedule: rate(5 minutes)
# Lambda関数 の権限(甘め)
# とりあえず、全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: "*"
# 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
# 「ExpireTime」をTTLに設定
# TTLを設定することでアイテムの自動削除が可能
TimeToLiveSpecification:
AttributeName: ExpireTime
Enabled: true
Tags:
- Key: key
Value: value
# SQSの定義
MessageQueue:
Type: 'AWS::SQS::Queue'
Properties:
QueueName: lineworks-message-queue
### ここは適宜それぞれの環境に合わせて変更
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}
Reference
이 문제에 관하여([AWS] LINEWORKS에서 미리 알림 BOT를 만들어 보았습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/peyryo/items/05c1b7e6c7e1ebdb550e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)