前言
此篇文章為 2023/12/09 DevFest Taichung Serverless workshop 步驟文章,如果有需要透過 GCP Pub/Sub 將訊息轉打給訂閱的 Cloud Run endpoint,並且同步推送到 LINE 群組(非社群) 通知群組裡的親朋好友,可以參考看看這篇 文章喔!
前置準備
- 需要有 GCP 的帳戶,有綁信用卡可開啟服務,且需要開啟個專案
- 需要有 LINE 帳號,且要能登入 LINE Developer Console
- 要能開啟一個 Provider + Channel
本地開發參考以下步驟
git clone git@github.com:gcp-serverless-workshop/notifier-line.git
cd notifier-line/
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
服務使用介紹
首先到 GCP 上的 Pub/Sub 服務中按下建立主題,這邊很貼心的下方也有加上晚點會使用到的 topic name
進到 Topic 頁面,往下滑找到建立訂閱項目,建立一個項目 ID,稍候測試與設定會需要用它
部署 Cloud Run
接著來到工作坊的專案 gcp-serverless-workshop/notifier-line-bot 下,按下下方的部署按鈕,接下來會進入 Cloud Shell 的部分
Cloud Shell 有上限:https://cloud.google.com/shell/docs/quotas-limits
跟 cloud build 有關皆需要以下權限 (URL)
- Cloud Build Editor role
- Artifact Registry Admin role
- Storage Admin role
- Cloud Run Admin role
- Service Account User role
LINE Bot 建立與設定 Cloud Run 環境變數
接著是建立官方帳號,詳細步驟請參考 LINE Developers 官方文件,主要我們要做到可以設定 webhook URL 這個部分,把剛剛佈署完的 Cloud Run 網址複製到 Webhook 欄位上: https://CLOUD_RUN_URL/webhooks/line
(如果是使用這個範例專案)
- 需要到 Official Account Manager將 LINE Bot 群組功能打開,以供測試使用
- 將 LINE Bot 的 ACCESS—TOKEN 以及 SECRET 放入 Cloud Run 環境變數中
- LINE_CHANNEL_ACCESS_TOKEN=your_line_channel_access_token
- LINE_CHANNEL_SECRET=your_line_channel_secret
- 把 Event 當中的 LINE 群組 ID 存下來放在 Cloud Run 環境變數中
- LINE_GROUP_ID=
回到 GCP Pub/Sub 上
這部份把 Cloud Run 的 Domain 設定到 訂閱項目 ID(Subscribe Topic ID)上,進入到上圖的畫面,按下編輯
把傳送類型從 提取 -> 推送,並且把**端點網址(Endpoint)**換成 Cloud Run 的 Domain,並加上 /sub
(專案設定的路徑)
寫一個 pub.py 來試試看
參考 gcp-serverless-workshop/notifier-line,我們可以針對線上環境去 pub data 去 topic,其中有些需要注意的:
- 需到 GCP Service Accounts 中拿取一把金鑰,
放到本專案當中
,是 JSON 格式,並且把路徑置換- 第 9 行:
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'YOUR_GCP_CA_PATH'
- 開啟終端機,執行
pwd
,並且把檔案名字加在路徑後方
- 開啟終端機,執行
- 第 9 行:
- 第 12 行:project_id = "換成你 GCP Project ID"
- 第 13 行:topic_id = "你剛剛建立的 TOPIC ID"
測試看看
接著可以在本地端 python pub.py
來把消息疼過 GCP CRED 打上去 Pub/Sub,接下來看一下訊息有沒有轉打到 Cloud Run,這邊推上去時中文會變成 ASCII。
如果測試發現有任何環節看不到,可以先在本地端把 API Server 起起來,然後用 ngrok 之類代理本地服務去測試,並且把 Pub/Sub 服務的網址先換掉來 debug,接著再看看 pub.py 是否有東西沒準備好
ngrok 可以參考這篇文章 - Day 20 GCP 公有雲_雲端事件消息傳遞服務實戰 - Pub/Sub 組建測試之路
結論
由於這次工作坊中的範例專案是先以 LINE 群組推播為主(Push Message),因此在環境變數中會先有一個 LINE_GROUP_ID 來指定推送,如果有其他需求可以把 Flex Message 以及 Push Message 換成你想要的內容喔!