所以當AWS推出了Lambda,身為一個Infra暴弱的Dev,真的會要給AWS一個大大的讚!這才是真正的SASS精神啊。畢竟我們不需要為了喝牛奶而去養一頭牛你說是吧。Lamdba讓程式開發人員可以專心的在程式的邏輯上面,將每個function獨立出來計費可以讓阮囊羞澀的獨立開發者與startup不需要負擔主機的維運費用,並且有精美的dashboard可以統計各個function的狀態,真的是非~常~的美好。
BUT,這世界上總是有個BUT,Lambda要寫python/node.js方便是方便,不過在部署的時候還是得設定IAM的Role,function才能正常運行。如果是AWS的菜鳥(尤其是Infra跟我一樣爆爛的)看到IAM的設定應該會很茫然。於是現在就有很多Lambda的部署工具,比方說Python用的Kappa,以及現在我想介紹的Claudia.js。
Claudia.js其實就是用AWS的Node.js framework將Lamdba的部署自動化,IAM以及Lambda的設定都在Claudia.js當中完成。之後如果要更新code,也只要一個指令就能完成,而且不需要登入AWS Console,是不是很方便啊。
以下就來介紹怎麼透過Claudia.js自動部署microservice並在Facebook上面做一個機器人。
首先你必須要申請一個AWS帳號
設定環境
因為Claudia.js是用來Deploy Node.js的microservice,所以你的電腦也要裝Node.jsNode.js預設就有npm(Node.js的package管理工具)因此以下會提到npm指令,但不需要另外安裝。
安裝Node.js
Windows版
Command:sudo curl http://nvm-latest.herokuapp.com | bash
手動安裝:到官網安裝最新版的Node.js
安裝完後在Command line工具中執行
node -v就可以檢查Node.js是否正確安裝。
Mac版
雖然Mac的Homebrew好用到令人流淚,但因為node.js版本更新非常快速,因此推薦使用nvm安裝。透過nvm安裝Node可以很簡單的輕鬆切換Node.js版本。- 如果你有安裝XCode,可以透過XCode來安裝nvm
$ xcode-select --install
- 如果沒有安裝,可以透過curl來安裝
sudo curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.32.1/install.sh | bash
- 在Terminal中輸入
nvm ls-remote
,找出最新的版本,我寫這篇文章時最新的版本是7.2.1 - 執行
$ nvm install 7.2.1 $ nvm alias default 7.2.1
安裝node.js
設定IAM Policy
因為AWS的IAM Role Policy預設並沒有啟用AWS Gateway API,所以要先將User Policy建立起來,Claudia在部署的時候才不會因為沒有權限而報錯。- 登入AWS Console,選擇IAM service,然後按一下"Policies"。
- 按下"Create Policy"按鈕
- 選擇“Create Your Own Policy”
- 在Policy名稱上面填上“API_Gateway_Resources_Full”,並在Policy Document中填入以下資料:
- 按下"Create Policy"就完成了。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1467321765000", "Effect": "Allow", "Action": [ "apigateway:*" ], "Resource": [ "*" ] } ] }
新增一個IAM使用者
- 到AWS主控台,從上方的下拉選單選擇IAM服務,進入IAM服務後選擇左邊的"Users" ,並按下藍色的"Add User"
- 輸入使用者名稱,並勾選“Programmatic access”,然後按下“Next:Permissions"
- 選擇”Attach existing policies directly“ 並在底下的policy勾選IAM Full permission / Lambda Full permission,然後按下"Next: Review"
- 確定這個使用者有IAM Full Access 和Lambda Full Access之後,按下”Create User“
- 按下"Download .csv"按鈕可以下載這個使用者的Credential, 強烈建議要下載下來因為當按下close之後你就再也沒有機會看到Secret access key 了,只能重新建立一個使用者
(都已經說了This is the last time these credentials will be available to download.了~)

建立登入資料
這個步驟是讓你在Deploy的時候不需要再輸入帳號密碼。用Sublime或Notepad等純文字編輯器打開 Mac/Linux 的 ~/.aws/credentials 或 Windows 的 C:\Users\USERNAME\.aws\credentials,加入以下指令:
[default] aws_access_key_id = YOUR_ACCESS_KEY_ID aws_secret_access_key = YOUR_ACCESS_SECRET_KEY
YOUR_ACCESS_KEY_ID指的是剛剛建立好的帳號中,最後一步顯示的access_key_id,YOUR_ACCESS_SECRET_KEY則是被隱藏的access Secret key.
如果剛剛沒有把資料保存下來...再回去重新建立一個使用者吧
安裝Claudia.js(安裝至Global,可忽略這個步驟)
因為已經安裝好npm了,安裝Claudia就是一件非常輕鬆簡單的事情。在Mac的Terminal或是Windows的console打入以下指令:npm install claudia -g
Claudia就裝好了。
[12/18]*補充說明:npm指令中-g是全域安裝(安裝到global)其實因為Claudia只是部署工具,比較建議隨著專案來安裝,如果不想安裝到Global可以在下面的安裝套件步驟中一起安裝Claudia.
開始寫機器人囉!
初始化npm專案
- 建立一個資料夾並命名為aLittleGreeter
- 打開Mac Terminal/Windows command line tool並移動到這個資料夾(cd aLittleGreeter)
- 初始化npm專案:輸入
npm init
安裝套件
(如果選擇不將Claudia安裝到Global,可以在這個步驟打入npm install claudia -D來安裝Claudia到這個專案。)
在寫機器人之前,我們還需要安裝兩個npm套件
- claudia-bot-builder:有了這個套件,Claudia才能幫你設定和其他通訊軟體(例如Facebook, skype, slack)
- huh:這是亂數取一個理由的npm套件
,可以在系統掛掉的時候第一時間回信給PM解釋(誤)
npm install claudia-bot-builder huh -S即可安裝這兩個套件。
BOT的Code
打開你的sublime或是其他的記事本工具,輸入以下的code:
const botBuilder = require('claudia-bot-builder'); const excuse = require('huh'); module.exports = botBuilder( function(message) { return 'Thanks for sending '+ message.text +'Your message is very important to us, but '+excuse.get(); });然後儲存成index.js。 這是一個很簡單的機器人,會把你說的話再重複一次,然後找個理由回(ㄈㄨ)答(ㄧㄢˇ)你。
透過Claudia把Code部署上AWS
Claudia會幫你把Lambda和Role該設定的全部都設定好,就交給Claudia部署就可以了。只需要一個指令 claudia create --name aLittleGreeter --region us-west-2 --api-module index- name 屬性:Claudia會使用name來建立IAM Role和Lamdba
- region屬性:你要部署到哪個AWS的region,在這邊使用us-west-w2指的是美國的奧勒岡州。可以參考AWS Region列表選擇要部署到哪個region
- api-module屬性:Lamdba程式的進入點。我們的檔名是index.js,所以將api-module設定為index,Claudia就會將index.js的內容部署到Lamdba。
如果沒有問題,就會看到Claudia一直在幫你跑AWS上面的流程了。
部署完成以後,應該會看到以下的訊息
{ "lambda": { "role": "aLittleGreeter-executor", "name": "aLittleGreeter", "region": "us-west-2" }, "api": { "id": "[api-gateway-id]", "module": "index", "url": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest", "deploy": { "facebook": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/facebook", "slackSlashCommand": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/slack/slash-command", "telegram": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/telegram", "skype": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/skype", "twilio": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/twilio", "kik": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/kik", "groupme": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/groupme", "viber": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/viber", "alexa": "https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/alexa" } } }
然後回到AWS的IAM 管理介面,選擇Role,可以看到Claudia已經幫你建好一個Role了

再切到AWS的Lambda管理介面,發現Claudia也建好Lambda的函數了
設定Facebook粉絲專頁機器人
OK,我們已經部署完AWS的部份了,接下來是Facebook的設定。- 先建立一個粉絲專頁
- 到Facebook Developer應用程式開發頁面,如果之前沒有註冊成為Facebook Developer,應該會先看到"立即註冊"的按鈕,按下立即註冊成為Facebook Developer。
- 按下“新增應用程式”,類別選擇“專業應用程式”,取好名字以後選擇“建立應用程式編號"
- 建立好之後會到這個應用程式的主控台,在產品設定中按下Messanger區塊旁的"開始使用"
- 在"權杖產生"中,先選擇先前建立好的粉絲專頁,在旁邊的粉絲專頁存取權杖中會顯示一組權杖,先記錄下來。
- 這時我們要在Claudia設定與Facebook連動,回到電腦的Terminal或是Cmd Console,打入以下指令:
claudia update --configure-fb-bot
Claudia會將Code重新部署,部署完後會出現以下的回應:Facebook Messenger setup Following info is required for the setup, for more info check the documentation. Your webhook URL is: https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/facebook Your verify token is: [verify Token] Facebook page access token:
- Claudia詢問的Facebook page access token就是剛剛Facebook應用程式中粉絲專頁的權杖,將剛剛複製好的權杖貼入Terminal
- 接著Claudia會詢問Facebook App Secret,到應用程式中選擇“主控台”,在主控台中找到"應用程式秘鑰",按下顯示後將內容貼到Terminal
- 到這邊AWS端的連動已經設定完成,接下來回到Facebook應用程式
- 到"Webhooks"區段中選擇“Setup Webhook”
- 填寫Webhook資訊:
- 回呼網址:填上Claudia回應中的deploy->facebook區段中的內容,通常是https://[api-gateway-id].execute-api.us-west-2.amazonaws.com/latest/facebook
- 驗證權杖:在剛剛打入
claudia update --configure-fb-bot
的時候,Claudia的回應中有一段 Your verify token is: [verify Token],填入這個verify token - 訂閱欄位:至少要勾選messages
- 儲存之後,就可以看到Webhooks區段有綠色勾勾,代表已經設定完畢
- 然後就可以嘗試傳送訊息給你的粉絲專頁了
茶包射手
部署的時候出現npm error
檢查一下Code有沒有寫錯,或是需要的npm套件沒有安裝。部署的時候出現AccessDeniedException
檢查IAM的使用者是否已經有IAM和Lambda的Full permission出現package.json does not exist in the source folder
通常是因為沒有執行npm init,可以再執行一次讓npm產生package.json部署失敗,出現Make sure you have the latest version of node.js and npm installed.
這是因為Node.js太舊了,如果Mac有安裝Homebrew只要透過Homebrew更新就可以了brew upgrade node
如果沒有Homebrew,可以透過npm清除Node.js的Cache並下載最新版:sudo npm cache clean -f sudo npm install -g n sudo n stable
Windows的使用者也可以透過npm來更新node.jsnpm cache clean npm update -g
我想更新我的Code,重新執行Claudia出現這樣的訊息:
Role with name aLittleGreeter-executor already exists.
這是因為重複執行Claudia create。Claudia create會自動建立AWS的IAM Role和Lamdba,而名字是identity不能重複的。所以如果要更新Code或是設定其他的組態(像是Facebook連動)請用Claudia update.如果想要更新的不是只有Code本身,像是想要換AWS的region,那麼只能將建立好的IAM Role, Lamdba等等都先手動刪除再執行Claudia create。
-
Facebook機器人不會回應我的朋友
這是正常的,這個機器人目前只會回應你而已,當全部開發完成之後會需要提交給Facebook審查,可以參考Facebook的審查說明。人工審查需要七天左右,審查通過其他人才可以用。
5 則留言:
關於:建立登入資料
找不到相關設定的檔案耶~是漏安裝什麼了嗎?
請問 Claudia.js 跟 serverless 是一樣的東西嗎
Dieing or dying?
@Lily Wang Claudia是AWS Lambda的部署工具喔,他不是serverless
@clin你的意思是說你找不到~/.aws/credentials 或 C:\Users\USERNAME\.aws\credentials嗎?那可能需要安裝AWS的SDK,請參考AWS說明http://docs.aws.amazon.com/powershell/latest/userguide/specifying-your-aws-credentials.html
@Suyuan Chang 我是故意的,it means to cut, form, or stamp with or as if with a die.是名詞。
張貼留言