[Serverless][Part-3] Phần 3: Subscribe vào event bằng Slack

Spread the love

Mình lại tiếp tục series liên quan đến chatbot slack sử dụng serverless. Phần này sẽ đề cập tổng thể đến
* Cách chúng ta thiết lập serverless framework để có thể listen được events của slack
* Verify token từ Slack gửi sang
* Get thông tin team từ DynamoDB
* Check mention ở channels
* Nếu có mention thực hiện gọi action (convert giá tiền)

Bài này mình sẽ đề cập đến “Cách chúng ta thiết lập serverless framework để có thể listen được event của slack”

Flow tổng thể

Chúng ta sẽ viết hàm events nhiệm vụ của hàm này sẽ là : * Nhận request từ slack gửi đến (đây là request mà slack dùng để validate API của chúng ta) * Gửi response lại cho slack (theo như nội dung mà slack đã request (nằm trong request . Event do slack gửi đến sẽ có type là url_verification

Events Functions

Chúng ta cần phải cho Slack subscribe vào events theo flow bên dưới.

Tạo endpoint để cho slack kiểm tra endpoint

Theo như document của slack, thì khi tạo một slack-bot, slack sẽ tđỡpolling endpoint để xem endpoint có còn sống không. Slack yêu cầu chúng ta trả về 2 thứ: đầu tiên là response 200, và body sẽ là nội dung của slack gửi cho chúng ta.

Tạo file events.js để response test events của slack

Mở serverless framework lên, ta sẽ tạo ra file mới gọi là events.js

touch events.js

Chúng ta sẽ đi có đoạn code bên dưới

/* eslint-disable no-console */
// Get JUST the Slack event.
const getSlackEvent = event => ({ slack: JSON.parse(event.body) });

// responding to the event.
const respond = callback => (event) => {
  const response = { statusCode: 200 };
  if (event.slack.type === 'url_verification') {
    response.body = event.slack.challenge;
  }
  callback(null, response);
  return event;
};

module.exports.handler = (event, context, callback) =>
  Promise.resolve(event) // Start the promise chain
    .then(getSlackEvent) // Get just the Slack event payload
    .then(respond(callback)) // Respond OK to Slack
    .catch(callback);

Đây chính là đoạn code chúng ta dùng để response lại request validate của slack.

Deploy lên lambda

Để có thể deploy lên AWS Lambda chúng ta cần phải chỉnh lại serverless.yml như bên dưới

....
functions:
  events:
    handler: events.handler
    events:
      - http:
          path: events
          method: post
....

Sau khi chỉnh lại file serverless.yml chúng ta sẽ chạy câu lệnh sls deploy để bắt đầu thực hiện deploy source code lên AWS Lambda

vagrant@homestead:~/forex_blog$ sls deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (1.7 KB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
............................
Serverless: Stack update finished...
Serverless: Removing old service versions...
Service Information
service: forex
stage: dev
region: us-east-1
api keys:
  None
endpoints:
  GET - https://iysgpfjepb.execute-api.us-east-1.amazonaws.com/dev/install
  POST - https://iysgpfjepb.execute-api.us-east-1.amazonaws.com/dev/events
functions:
  forex-dev-install
  forex-dev-events

Để ý chúng ta sẽ có endpoint sau khi deploy lên AWS Lambda

https://iysgpfjepb.execute-api.us-east-1.amazonaws.com/dev/events

Subscription event vào slack

Sau khi có được endpoint như ở trên ta có thể thiết lập để slack gọi vào endpoint trên. Các bạn login vào slack và truy cập vào URL dạng

https://api.slack.com/apps/{slack_app_id}/event-subscriptions?

Trong đó slack_app_id là id của applications mà bạn đã tạo

Ngay khi chúng ta vừa thay đổi endpoint URL, slack sẽ thực hiện một POST request đến endpoint vừa được thiết lập để thực hiện Verified. Nếu ổn các bạn sẽ thấy có một cái mark màu xanh.

Vậy là chúng ta để có thể thiết lập để app của mình listen được events của slack. Phần tiếp theo chúng ta sẽ code xử lý
* Verify token từ Slack gửi sang
* Get thông tin team từ DynamoDB
* Check mention ở channels
* Nếu có mention thực hiện gọi action (convert giá tiền)

Series Navigation<< [Serverless][Part-2] Phần 2: Cài đặt Slackbot và lưu access_token vào DynamoDB[Serverless][Part-3] Phần 3: Verify token của slack và lấy thông tin team >>

Leave a Reply

Your email address will not be published. Required fields are marked *