第一次架設網站時使用熱門的 LAMP 架構,PHP 的部份以 Python 的 Django 來取代。一開始要先研究 Linux 上如何架起 Apache 及其相關參數要怎麼設定,然後 Django 要怎麼在 Apache 上跑,MySQL 的設定與串接,要研究的項目很多,若是剛踏進這個領域的人,光環境設定大概就會弄個一個禮拜甚至一個月。這時你會發現,弄了那麼久,卻還沒真正開始寫程式。後來也有用過 nodejs 來架設過簡易的 server,但不管是要跑在 Azure、GAE、Heroku … 等等平台上,要研究的東西也不算少。對一個前端來說,要架設一個 server 所花的時間成本其實是滿高的。
在今年 2016/6 第一次聽到 serverless (其實 Amazon 在 2014 就推出了),被其不用管理 server 的特性所吸引,只要將寫好的 function 部署出去,其他東西 AWS 會幫你處理好,但說是 serverless,其實不是沒有 server 的意思,而是不用自己管理 server。
但是事情也沒有想像中那麼美好,以為終於可以專心在開發上不用管一大堆的 server 設定,但就如 Denny Ku 大在 淺析 serverless 架構與實作 中所說,中文的教材真的很少,要跨進 serverless 的世界其實也是不簡單的,但跨過了這個門檻真的可以提升不少開發效率。
serverless v0.5.5
Serverless 簡介
Serverless 在 AWS 上的實現主要是串接 AWS 上的兩項服務,Lambda 與 API Gateway。將寫好的應用放在 Lambda,並在 API Gateway 設定 Lambda function 的進入點。Lambda 可以在設定好對應的 API Gateway 直接調用,也可以透過 event source 的方式來觸發。event source 觸發有兩種方式,第一種是在 Kinesis 中做設定,Lambda 會 polling 這個 event source,讓 function 在 Kinesis 中資料有變更時去觸發,稱為 pull model。第二種是會先在 Lambda 設定要偵測的事件,例如 S3 或是 DynamoDB 的變動,而且偵測這些事件是需要權限的,沒有權限無法偵測這些變動,只要設定的 event source 有變動就會自動調用 function 去處理,又稱 push model。
在這裡可能會想說那直接學這兩樣東西就好了,為什麼還要另外用個 serverless 的架構?因為當然沒這麼簡單,在部署 Lambda function 時要設定對應的 API Gateway 來管理 function 的進入點,若不使用 serverless,每次部署都要登入到 AWS console 來修改或上傳 function 所更改的部份,而且上傳的部份限定 zip 檔,所以上傳前要壓縮一次,而 API Gateway 的部份也要另外再去做設定,實際跑一趟下來真的是滿費工的。在 serverless 環境下就是全部都用 cli 解決,所以使用 serverless 著實減少了很多開發時間。
分析
優點:
- 不用管理 server (就是為了這個才來的)。
- 可實作 REST API。
- 支援 Nodejs、Python、Java 開發。
- 若呼叫量不多,會比使用 EC2 來得便宜。
缺點:
- 速度會較一般 server 慢,因為 function 都是被呼叫到才啟用,所以較一般 server 多了些延遲時間。
- 較難 debug。
開始使用
IAM Roles
這關乎到 Lambda function 的執行權限,所以在建立 Lambda function 前需先去 AWS 上建立 IAM Roles,這裡僅介紹簡易的設定方式。
進到 AWS IAM Roles 後點選 Users。
點選上方的 Create New Users。
建立完成後記下所建立使用者的 Access Key ID 與 Secret Access Key。
點選所建立的 role,在 Permissions 中點選 Attach Policy,這裡會跳出很多 Policy 的選項,為求方便在練習時都會選擇 AdministratorAccess 這個 Policy。
真正在使用時還是要依使用情境慎選 Policy。
完成上述步驟後回到本機,在檔案 ~/.aws/credentials 中,將所建立的 Access Key ID 與 Secret Access Key 填入其中。
這樣 IAM 的設定在這裡算告一段落。
Serverless
在 global 先安裝 serverless:
$ npm install serverless -g
建立 project:
$ serverless project create
serverless 這指令真是又臭又長,不過好險它有縮寫 sls,所以指令中的 serverless 皆可換成 sls
- 輸入 project 名稱。
- 輸入 API Gateway 部屬的環境 (stage),可以先用預設的 dev。
- 選擇 profile (就是前面在 ~/.aws/credentials 裡所設定的 IAM role,這裡選擇 Existing Profil)。
- 選擇 default 就是選擇前面設定的預設值。
- 選擇要部署 function 的 region (AWS 的 region 很多,但有支援 Lambda 的只有列出的 5 個,可參考:AWS 區域和終端節點)。
stage 建議要有基本三個: dev、beta、prod,若為 team work 可用其他名稱來命名 stage。
建立 function:
$ serverless function create
- 選擇開發環境,在這裡選 nodejs 4.3。
- 選擇要建立的 function 形式,Endpoint 即為一個進入點。
部署:
$ serverless dash deploy
選擇要部屬的項目:
function — 所寫的功能,會部署到 Lambda 上
endpoint — 所寫的功能的相關設定,會部署到 API Gateway 上。
最後會給你一段 link,即為你的 serverless function 所在的位址。
進這連結應可以看到:
{“message”: “Go Serverless! Your Lambda function executed successfully!”}
到這裡,第一個 Lambda function 就部署好了! :]
參考:
A Serverless REST API in Minutes with the Serverless Framework