使用 Terraform + Slack + Cloud Function 快速建立簡易通知系統
前言
要設計一個通知系統, 一般都會需要考慮到前端, 後端, 以及後續部署維運相關的問題, 但其實想要快速建立通知系統並不難, 只要善用雲端資源, 十分鐘也能建立一個簡易的通知系統
以下示範, 如何使用 Slack 作為訊息輸出的前端, 以及整合 Cloud PubSub 和 Cloud Function 作為訊息處理的後端, 最後再以 Terraform 將所有元件的部署流程自動化, 使日後維運更加輕鬆簡易
前端
整合 Slack 時, 需要先取得 Webhook Token
有了 token 就能透過 Slack 的 API 將訊息打到指定的 Channel 中, 使用以下方式來測試 Webhook token 有沒有作用
測試
andy@host: curl -X POST --data-urlencode "payload={\"channel\": \"#etl_job\", \"username\": \"webhookbot\", \"text\": \"This is posted to #etl_job and comes from a bot named webhookbot.\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/T02G1HSTG/AAA4M9NN095/1VDjE3453234292ZTF4IRDEv
ok
後端
後端的部分會整合 Cloud PubSub 作為觸發 Cloud Function 以習訊息輸入的來源
Source Code
const { IncomingWebhook } = require('@slack/webhook');
exports.handler= async (message, context) => {
const messageData = message.data
? Buffer.from(message.data, 'base64').toString()
: 'World';
const obj=JSON.parse(Buffer.from(message.data, 'base64').toString())
const endpoint = "https://hooks.slack.com/services/T02G1HSTG/AAA4M9NN095/1VDjE3453234292ZTF4IRDEv"
const hook = new IncomingWebhook(e, {username: "Cloud Composer"});
hook.send(obj);
};
部署
會需要部署的有 Cloud Pub/Sub Topic, Cloud Functions Service Account, Cloud Function
為了將來管理方便, 所有資源會被定義在 _modules/func-v2 裏面, 若之後想要建立新的通知系統, r就能重複使用之前定義過的資源 yaml 來部署
provider "google" {
version = ">3.5.0"
project = "repo"
}
module "my-functions" {
source = "./_modules/func-v2"
function_pb = "login-msg-notify-pb"
project_id = "repo"
region = "us-central1"
env_name = "login-msg-notify"
resource_tag = {
deploy_repo = "login-msg-notify"
}
}
module "my-functions-v2" {
source = "./_modules/func-v2"
function_pb = "v2-login-msg-notify-pb"
project_id = "repo"
region = "us-central1"
env_name = "v2-login-msg-notify"
resource_tag = {
deploy_repo = "v2-login-msg-notify"
}
}
部署. yaml 檔中會需要以下參數
function_pb: 觸發 Cloud Function 的 Cloud Pub/Sub 名稱
project_id: 欲部署的專案
env_name: Cloud Function 的名稱
resource_tag: 打 tag 方便日後管理
完整範例
https://gitlab.com/sysapp2/tf-module-cloud-function.git
留言
張貼留言