Drone Cloud 初體驗 — 自動化部屬 Nodejs Function 到 AWS Lambda
不知道各位有沒有聽說最近有一個新的 CI(持續整合)服務 Drone Cloud 上線了,因為他免費提供給 開源專案 使用,筆者我身為一個免費服務愛好者當然要趕快來用用看
考慮到可能有人不知道什麼是 CI,我這邊簡單說明一下:
CI 全名 Continuous Integration,可以在你每次 push 時幫你跑測試、壓縮、ssh 到機器、部屬新版本等等,如果中途出了差錯也可以在第一時間透過 slack 或是 email 通知開發人員
設定好 CI 後就可以專心在開發,不用每次開發完都手動做那些雜事,算一下如果這些雜事每天要花你 3分鐘,那你花一個小時把 CI 設定好一年下來就可以省下 18 個小時,夠划算吧!
到這邊我想大家對 CI 的應用都有些認識了,那 CI 服務那麼多,除了 Drone 之外還有TravisCI、CircleCI 等等,Drone 有什麼獨特之處嗎?
Drone 最厲害的地方在於 可以直接使用 Docker image 作為 plugin ,目前 Docker Hub 大平台上有將近四十萬個 image,因此 Drone 天生就有很多 plugin 可以用,不像 TravisCI 要測試哪個 Nodejs 版本還得等官方支援
接著就進入今天的主題吧,今天的重點在於講解怎麼串接 Drone Cloud,所以我想了一個簡單的題目: 自動化部屬 Nodejs Function 到 AWS Lambda ,完成後只要在本地端開發推上 Github 就會自動部屬到 Lambda,是不是很方便呢~
我猜大家應該都聽過 AWS Lambda,筆者我這邊就不再贅述,如果你完全不知道 Lambda 是什麼,建議先 Google 了解一下再繼續往下讀
這篇文章會分成以下幾個步驟:
- 在 AWS Lambda 上新增 function
- 在 AWS IAM 上新增使用者
- 整合 Drone Cloud
- 實作 handler
- 撰寫 .drone.yml
Step 1 — 在 AWS Lambda 上新增 function
到 AWS Lambda Management Console 上面點選「建立函式」,我是選在 us-west-1 (N. California) 區,如果你想部屬在其他區域也可以,建立一個 function 叫做 helloWorld
接著還要新增一個 API Gateway,讓外部可以透過 HTTP 觸發 function
新增完 API Gateway 會得到一個 API Endpoint,到那個網址看到 Hello from Lambda!
就是成功了~
Step 2 — 在 AWS IAM 上新增使用者
為了讓 Drone 有權限操作 AWS Lambda,必須先到 AWS IAM 上新增一個使用者,這樣 Drone 才有權部屬 function
新增一個 user 叫做 lambda-user 然後給他 Lambda 的 Full Access
新增完使用者會得到一組 Access key ID 跟 Secret access key,這組 key 有操作 Lambda 的權限,所以千萬千萬不要把 key 外洩出去
Step 3 — 整合 Drone Cloud
前面有提到 Drone Cloud 只免費提供給開源專案使用,所以你的專案必須在 Github 上開源,以下會用我自己的 nodejs-drone-lambda-example 做示範
到 Drone Cloud 登入後啟用自己的專案
為了讓 Drone 可以存取 AWS,要把剛剛的 key 新增到 Secrets 裡面,之後就可以直接指定變數名稱,不會因為開源了導致 key 被看光光
Step 4 — 實作 handler
handler 非常簡單,就只是一個 function 而已,這邊什麼都不做就只回覆 Hello World
// index.js exports.handler = async function(event, context) { const response = { statusCode: 200, body: JSON.stringify('Hello World'), } return response }
Step 5 — 撰寫 .drone.yml
接下來就是最重要的 .drone.yml
,為了讓 Drone Cloud 完成自動部屬,要把部屬的流程寫在這個檔案裡面,寫完之後 Drone 就會照著流程跑
以 AWS Lambda 來說部屬分成兩個步驟,第一步是要把程式碼壓縮變成一個 zip 檔,這一步我用的是 Docker Hub 上的 alpine Linux ,在 alpine 裡面把所以檔案包裝成一個 handler.zip
kind: pipeline name: default
steps: - name: zip image: alpine commands: - apk update && apk add zip - zip -r handler.zip *
第二步要把 zip 檔部屬到 AWS Lambda,這邊會用到 mesosphere/aws-cli
這個 image,搭配剛剛寫在 Secret 內的 access_key 就可以把 handler.zip
部屬到 Lambda 上,簡單吧!
steps: ...
- name: deploy-lambda image: mesosphere/aws-cli environment: AWS_ACCESS_KEY_ID: from_secret: aws_access_key_id AWS_SECRET_ACCESS_KEY: from_secret: aws_secret_access_key AWS_DEFAULT_REGION: us-west-1 commands: - aws lambda update-function-code --function-name helloWorld --zip-file fileb://./handler.zip
接著只要你有新的 commit 被 push 到 Github 上, Drone Cloud 就會自動 clone 最新的進度 -> 壓縮成 handler.zip
-> 部屬到 Lambda,如果哪個步驟出錯了也可以看 log 找到錯誤
部屬完到 AWS Lambda 上看確實已經變成剛剛寫上去的 Hello World
,這樣以後就可以在本地端開發了,寫完 push 上去 Drone 就會自動部屬上去
另外如果想要做到部屬完通知的功能,可以參考 Email 或 Slack 這兩個 plugin, 若是想部屬到 GCP 的 Cloud Function 或是 App Engine 之類的也可以使用 google/cloud-sdk 這個 image
總結
這次用 Drone 搭配 AWS Lambda 做了一個小 Demo,筆者我自己很看好 Drone 的發展,因為他直接支援 Docker image 而且 pipeline 可以一直串,能做的事真的非常多, Drone 自己就用了 14 個 step 來進行測試、build、發佈新版本,設定寫起來也簡單明瞭
雖然 Drone Cloud 只支援開源專案,但因為 Drone 是開源的,如果私人專案想要用的話也可以 自己架一個 Drone server ,很適合公司內部或個人使用
如果對文中哪個步驟有疑問的話歡迎在底下留言, 我會盡量回答,如果覺得文章實用的話也可以幫我拍拍手, 一個人最多可以拍五十次所以請不要吝嗇你的掌聲XD,謝謝大家
參考資料
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。