透過 Google Cloud Functions 部署一隻成本極低且 Serverless 架構的 Line bot

之前有寫過一篇如何透過 ngrok 快速部署一隻看起來有模有樣的 Line 機器人,如還沒試過 chatbot 開發的朋友,透過 ngrok 可以讓你很快掌握 Line bot 的流程及原理,即便是未來自己架 server 後用ngrok 來做 webhook 的測試都相當便利。

而今天要介紹的主角 Google Cloud Functions 對開發 chatbot 來說最大的特點是它是 Serverless 架構! 簡單列幾個優點

在 Scalability 及價錢方面的好處是

  • 不需要為了服務一隻初始流量低,且未來流量難預測的機器人而 host 一台機器 ( 人少太浪費,人多又要煩惱如何加開機器 )。對於自己做 lab 時更是方便,不必將機器開開關關,臨時遇到想 demo 馬上就可來
  • 因為當有人來 request 時, Google 才會幫你找機器執行你的程式,所以計價方式就是 pay by use ,以 request 量計價 ( 變動成本 ),有興趣可參考這張 Google Cloud Functions Pricing ,成本比起自己 host ( 固定成本 ) 應該可以省很多。
  • 當 Request 量大到 Google 一開始幫你準備的機器不夠服務時,它會幫你處理 Scale 的問題,自動找多台機器幫你服務

在 Operation 上的好處更是顯而易見

  • 因為是由 Google 幫你 host,所以可以比較不用擔心服務會不會因為流量過大或是其他因素掛了 ( 雖然也有人不喜歡把服務交由別人 host ,因為自己的機器比較好 debug 、掌握度高之類的,這個就視個人需求而定囉 )
  • 其它就是如果有使用 Google Cloud Platform 上的其他服務的話 ( 像是 Storage or Database ) ,Service 之間的傳輸流量可以打折甚至免費等等。( 這點如果是自己架機器在 Google 也可以達到同樣效果 )

關於 Serverless 架構的優缺點及設計概念,前些日子參加了由 Code & Beer 舉辦的 淺談 serverless 架構設計  ,主講者 Yang Young 大大分享的 Serverless ,除了講題內容外,投影片也蠻有料的 ( 內容主要是什麼是 serverless ? / 與 microservices 有什麼不同? / 與 microservices 有什麼相同之處? / 對於 architecture 設計來說,serverless 有哪些要注意的地方?) ,有興趣者可以拜讀拜讀 m(_ _)m

好,回到主題,那該如何快速使用 Serverless 架構製作一隻簡易 Line Bot 呢?

  1. 一樣,先來個流程圖 ( 架構應該單純到完全不需要解釋吧,哈哈,如果還看不懂得可以先看這篇說明,基本上了解 LINE 及 webhook service 的關係後再看這張圖就會秒懂惹 )overview
  2. 看完 Overview 圖後,首先必須先去註冊一個 LINE 機器人帳號,需要知道步驟的話可參考 不必真的架站也能 5 分鐘實機體驗 LINE bot – 教學 ( by node.js & ngrok ) 的第一部分,有 Step by Step 說明。
  3. 再來請到 Google Cloud Functions Console 選擇建立函式,進入函式編輯後應該會看到如下這張圖 :
    o1
  • 請先為您的函式命名 ( 本例為 justReply )
  • 觸發條件請選 HTTP 觸發條件 ( 因為會由 LINE 的 Server 發 HTTP Request 給你的 Cloud Function )
  • 要執行的函式請改為 justReply ( 因為接下來的範例程式是命名為 justReply )
  • 匯整 Bucket,目前看它的用途是當你每次更新新的程式碼上去後,它都會將程式碼打包成一份 zip 檔備份在這個地方,應該還可以有其他用途。這是必填欄位,所以也請為你的 Cloud Functions 建立一個吧,如下圖
    o2
  • 部署過幾次後,匯整 Bucket 的內容大概會長這樣bucket

接下來就可以開始來貼程式碼了!

我已經將我用來測試的超簡易 line 機器人原始碼放到這裡 https://github.com/simonhsu/line-bot-google-cloud-functions-example ,他的功能很簡單,基本上就是你打什麼他回什麼。

接下來只要再做幾件事,就能完成 Google Cloud Functions 這邊的設定:

  1. 將 上述連結 內的這兩個檔案內容 ( index.js 及 package.json ) 分別貼到 Google Cloud Function 內嵌編輯器 所對應的一樣檔名的兩個檔案
  2. 到 https://developers.line.me ,複製您要套用的 Line 機器人 Channel Access Token ( 下圖這個 )accesstoken
  3. 將內嵌編輯器的 index.js 內的 %ChannelAccessToken% 用上一步驟從 Line 複製的 Channel Access Token 取代掉 ( 在下圖位置 )ScreenClip
  4. 存檔 Google Cloud Functions ,會看到部署中的畫面。待部署完畢後,進入 Function 內的觸發條件,可以看到 Google Cloud Functions 已經為您準備好網址啦!只要針對這個網址發 Request ,Google 就會幫你執行你所建立的這則 Cloud Function。ScreenClip
  5. 這個 Cloud Function 預期會收到的 Input 就是 Line 傳來的訊息,那該如何讓 Line 找到我們的這個 HTTP 觸發條件呢?打開 https://developers.line.me ,看到下面畫面的 webhook URL ,將上個步驟的網址複製起來貼過去就對了。設定完之後,所有發到 justReply 這隻機器人的訊息將會被轉發到 webhook URL 上所設定的網址,你的 Cloud Function 從此就能被 Line 找到啦!webhook url
  6. 由於我們已經在內嵌編輯器的 index.js 檔案內設定好當我們收到訊息後所要做的行為 ( 就是原封不動地將文字訊息,透過 Line Messaging API 發回去給使用者 ) 所以接下來,就是見證 Magic 的時候了,任何你所傳到這個 Channel ( justReply ) 的文字,都被 Line 轉發給 Cloud Functions ,而在 Cloud Function 內又將收到的文字原封不動地透過 Line Messaging API 發回去。就可以得到像我這張圖下的結果拉!
    ScreenClip
  7. 大功告成,一個 Serverless 架構的 Line Bot 就此完成。而且以量計價,部署好之後隨時想 demo 都很方便,不用時不關也不會多浪費錢。未來有儲存檔案/資料庫的需求更可大方直接用同個 Cloud Service 下的服務,流量享折扣。未來 Serverless 架構的世界,的確很令人嚮往阿! ( 不過牽扯到資料庫的存取等等又是需要從長計議了,哈哈 ,不信?先看看這投影片..

提醒:

目前 Google Cloud Functions 才剛進入 Beta 階段不久,所以沒有 SLA 確保服務穩定度等等 ,所以建議先拿來做 Lab 就好,部署正式上線的環境還是等 GA 後比較適當。而 AWS 所提供的類似服務 : AWS Lambda 則已經 GA  一段時間,原理與 AWS Lambda 類似,應該可以依樣畫葫蘆,考慮以 Serverless 架構部署正式環境的可以試試 ( 或是有空在寫一篇? 😀
廣告

對「透過 Google Cloud Functions 部署一隻成本極低且 Serverless 架構的 Line bot」的一則回應

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s