[AWS] LINEWORKS에서 미리 알림 BOT를 만들어 보았습니다.

Advent Calendar 7일째입니다.

이번에는 AWS 환경에서 미리 알림 BOT을 만들려고했습니다.
Cloudformation 템플릿도 게재되므로 관심이 있으시면 자세히 알아보세요.

Lambda의 구현 기사는 여기

완성된 BOT



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을 만들려고했습니다.

    다음에 람다 함수의 구현에 대해 소개하고 싶습니다.
    실장편의 링크처

    좋은 웹페이지 즐겨찾기