文章

使用 ES6+ 語法 Node.js 於 AWS Lambda

如果你有某種偏執狂,就是想要用最新版本的 Javascript ,無論是 ES6 ( ES2015 ) ES7 ( ES2016) 寫 node.js,而且計畫寫 Serverless 並且部署到  AWS Lambda  (例如: webhook),那希望這篇文章對你有些幫助。

Step 1: 安裝 node-lambda 執行以下指令,安裝 node-lambda

npm install -g node-lambda

node-lambda 是一套 CLI (command line tool) 工具,可以讓開發者在本地端執行及測試 AWS Lambda 的 node.js 應用程式,並可將其部署到  Amazon Lambda 上 詳細請參考 https://www.npmjs.com/package/node-lambda

Step 2: 下載 node-lambda-babel-template

已經有善心人士把  webpack 及 Babel  加入進了 @motdotla’s node-lambda-template 所做的 node.js 程式模板,讓我們可以使用最新版本的 Javascript 撰寫 node.js 跑在Amazon Lambda 上 執行以下指令,下載 node-lambda-babel-template

curl -o- https://ribjyr1g9l.execute-api.us-east-1.amazonaws.com/nodelambdababeltemplate/latest | bash

將 node-lambda-babel-template 改為自己的專案名 (例:node-lambda-babel-hello-world)

mv node-lambda-babel-template node-lambda-babel-hello-world cd node-lambda-babel-hello-world

 

Step 3: 修改 package.json

先開啟 package.json,將與專案名稱相關的內容,改為自己的專案名。再來由於 node-lambda v0.8 有一個小bug,所以需要將 package.json 中
node-lambda 設定,將版本改為 ^0.11.7

 "node-lambda": "^0.11.7", 

Step 4: 完成 node-lamba setup 執行以下指令

npm install

npm install 會執行 node-lambda setup,下載相關的node_modules並自動產生以下檔案context.json, event.json, .env, and deploy.env 可以參考 https://github.com/motdotla/node-lambda#setup 了解更多內容 打開 .env 檔,修改以下的欄位
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_ROLE_ARN=
AWS_REGION=
並且將  .env 檔中 AWS_DLQ_TARGET_ARN= 這行移除(否則會出問題)

Note: AWS_ENVIRONMENT 與 AWS_HANDLER 定義在 package.json 中的 npm script,並不是在 .env 中定義,所以記得要是要改 handler name (預設是 default) 要去 package.json 中改 關於 AWS Role 的設定可參考 https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-create-iam-role.html

Step 5: 編寫程式

接下來就可以開始撰寫程式,預設的啟動程式是 index.js,所以開啟 index.js 加入你自己的程式 (當然是使用 ES6/ES7 語法) webpack 會將 index.js 編譯轉碼至 dist/index.js

npm start

可以修改 webpack.config.js 及 .babelrc ,加入額外你需要的 plugins 及  presets. 使用下面指令,測試你的程式

npm test

修改 event.json 加入你要模擬的 event 事件

Step 6: 佈建至 AWS Lambda 使用下面指令,佈建你的程式至 AWS Lambda

npm run deploy

參考: https://github.com/motdotla/node-lambda https://github.com/motdotla/node-lambda-template https://www.npmjs.com/package/node-lambda-babel-template

10分鐘完成你的第一支 Watson Workspace bot

IBM Watson Workspace 是一個類似 Slack or Microsoft Team 的「團隊溝通平台」+「即時通訊軟體」。它的底層稱為 Watson Works Services,已經內建IBM Watson  NLU (Natural Language Understanding 自然語言理解) 及 IBM Watson NLC  (Natual Language Classfier 自然語言分類)。簡單來說,在 Watson Workspace 的每句對話的背後,到底這句話是一個命令動作 (ex: 你需要於星期五前完成這個專案),或是是個問句 (ex: 你知道哪裡可以找到簡報檔嗎?),或是這句話裡面有談到關於地域、食物、天氣、情緒、人名……..,Watson Workspace都已經會有這些資料可以直皆提供給開發 Watson Workspace bot 的 developer 。

本文說明如何使用 node.js 從 0 打造一個最簡單的 Watson Workspace bot,傳送訊息到 Watson Workspace 中。知道如何傳送訊息到 Watson Workspace 中之後,能應用範圍就會很廣了,例如可以建立一個客服的後台系統,把前台不管來自網站的 chat bot 或是 line chat bot 的訊息都拋轉給後台的客服人員,客服人員可以使用  Watson Workspace 處理從不同管道進來的訊息,決定在前台 chat bot 無法自動處理客戶訊息的時候,人工介入來幫客戶處理問題。

Step 1: 註冊或登入 Watson Workspace
若還沒有 Watson Workspace 帳號,可於註冊一個免費帳號來玩玩

2018-04-18_10-59-29

開始試用 Watson Workspace

接下來你可以下載 Desktop 版的 Watson Workspace 使用,也可以直接使用 Web 版的。

Step 2: 建立一個 Space
如果已經有Space了,可以跳過這個步驟。
進入 Watson Workspace 後,點選畫面中的 Spaces 旁的 + icon,建立一個 Space

Step 3: 建立一個 Watson Work Services App
進入 Watson Work Services App console

2018-04-18_15-24-32

打開 Watson Work Services Apps 管理介面

建立一個新的 App

為你的 Bot 取個名字,為避免跟別人的Bot名字重複,建議在 App Name 最後加入你的名字的縮寫之類的
建立好之後,把 App ID 及 App secret 記下來(很重要,因為App secret 只會出現一次)
2018-04-18_11-17-21

Step 4: 將 App 加入 Space 中
到 Space Settings 中 把 Step 2 中建立的 App 加入你的 Space

Step 5: 複製 Space ID
回到 Space Settings 中,選擇 Audio & Video,將畫面中 Meeting Link 的 URL,meeting/ 之後的那段編碼 copy 下來,這個就是每個 Space 的 unique ID,將它記錄起來
SpaceID

Step 6: 建立 nodejs project
建立一個新的Folder

mkdir wws-bot-nodejs
cd wws-bot-nodejs

初始化 nodejs project
npm inits

這邊我是使用 watsonworkspace-sdk,這不是官方的 sdk,但是因為 Watson Works Services 的 API 呼叫大多數是透過GraphQL,這個非官方的 sdk 把呼叫 GrapQL 這段都封裝起來了,所以使用上會簡單非常的多,程式也會簡潔易懂多
watsonworkspace-sdk 除了能傳送訊息之外,也可以處理接收到的訊息,詳細可以參考 watsonworkspace-sdk
安裝 watsonworkspace-sdk
npm install watsonworkspace-sdk —save

建立 index.js
source code 如下
const wwsdk = require('watsonworkspace-sdk')
const ww = new wwsdk("<Step 2中的 APP ID>","<Step 2中的 APP secret>")
const msg = "Hello World!!"
ww.authenticate()
.then(token =>; {
ww.sendMessage('<Step 5中的 Space ID>', msg)
})

Step 7: 測試
執行

node .

回到 Watson Workspace,可以看到訊息已經傳送到 Space 中了。 第一支 Watson Workspace bot 完成!
Watson Workspace bot