簡介Serverless 與 AWS Lambda

Jo-Yu Liao
8 min readJan 31, 2020

一、什麼是 Serverless ?

image source: fourTheorem

Serverless 的發展由來(Be lazy and embrace the cloud)

A. Machine:

過去我們要部署服務的時候,需要花錢買物理伺服器,還要雇用專門的運維人員管理機房,卻容易產生閒置的伺服器與人員。據統計,美國國土安全部(DHS)使用實體伺服器的平均利用率僅有 5 ~ 15%。

B. Virtual Servers:

後來有了伺服器虛擬化的概念,透過 虛擬伺服器(Virtual Servers) ,將一台物理伺服器實體分割成多個虛擬伺服器的服務,分配獨立的公網 IP 位址、作業系統(Windows、Linux )、記憶體、CPU 資源等。部署服務不再需要購買許多獨立的物理伺服器、可減少人員配置,又可將平均利用率提升到到 60% ~ 80%。

C. Clouds & Containers:

進入雲端時代後,許多雲服務商,如 AWS、GCP、Azure,提供公有雲服務,讓公司不用再花錢買物理伺服器、管理基礎架構,可以直接在公有雲部署開發應用程式。而為了方便部署到雲平台,企業可以透過 Docker 等 容器(container) 將自己開發的程式打包起來,快速移植到另一個平台,實現 “Build, Ship, and Run Any App, Anywhere.”。關於容器的詳細內容可參考:台大 - 淺談輕量化的虛擬技術 — Docker容器

D. Serverless(BaaS + FaaS):

image source: https://www.linkedin.com/pulse/serverless-future-software-architecture-bhaskar-babu

雖然有了公有雲,可以用 AWS EC2 等虛擬機器服務不用自己架、自己管機器,但還是要寫 Docker 將服務部署到虛擬機上面,而且只要機器開著,不管有沒有人訪問你的服務,都還要支付機器的使用費。有沒有辦法可以只在服務有人使用的時候才付錢?有沒有可能我只需要負責寫程式就好,其他 Docker 什麼的都不用管?那你可以考慮用 無伺服器(Serverless)運算服務了!

無伺服器運算服並不是真的沒有伺服器,而是說伺服器對用戶而言是透明的,伺服器的裝載、啟動、卸載、路由、擴容等都是由平台負責。

無伺服器運算服務的使用過程:

  1. 開發人員開發程式。
  2. 開發人員將程式上傳到雲平台的無伺服器運算服務如 AWS Lambda。
  3. 設定好觸發程式的條件(例如上傳檔案到 Amazon S3 就觸發、或是定時執行等)。
  4. 如果觸發條件發生,則平台啟動並運行程式,等觸發條件消失後,就卸載程式。

因為開發者只需負責開發程式,不需要部署、組態或管理伺服器服務就可提供服務給用戶,此為 函數即服務(Function-as-a-Service,FaaS)

然而~這種使用的時候才加載不用就卸載的方式,會導致:

  1. 狀態無法保存(應用與伺服器解耦,狀態不能保存在伺服器、無法保證同一 Client 的兩次請求由同一 Server 上的同一個 Instance 處理(Sticky Session ))
  2. 函式無法做到本地持久化,沒辦法訪問本地磁盤的東西

因此平台也需要將持久化相關的功能(如 MySQL、Redis)也以服務的方式提供,才能做到真正的 Serverless,此概念為 後端即服務(Backend-as-a-Service,Baas),如 AWS DynamoDB。(也有一種說法是 BaaS 包含 FaaS)

簡而言之,Serverless = BaaS + FaaS。而關於 Serverless 的發展由來可總結為:“Be lazy and embrace the cloud”。

Serverless 的優缺點

優點:相較於前述的部屬方法更便宜、更省人力、又可以自動擴容。
缺點:供應商鎖定(Vendor lock-in)、學習曲線陡峭、不適合長時間執行的服務、啟動延遲(Startup latency)。

介紹完 Serverless 的概念後要來簡介常見的 Serverless 服務 AWS Lambda 。

二、AWS Lambda 簡介

image source: AWS Lambda

AWS Lambda 是一種 無伺服器(Serverless)運算服務,可執行程式碼以回應事件,並且自動管理基礎運算資源,而使用者則依照使用量付費(費用依函數的請求數量和程式碼執行持續時間計算)。

主要概念

舉個例子,假設工程師想寫一個服務是當用戶上傳 mp4 檔案到 S3 bucket A 時,能透過程式將 mp4 轉成 gif 檔,再把 gif 檔放到 S3 bucket B 供用戶下載。在這種情況下,轉檔程式就是所謂的 function,上傳 mp4 檔案到 S3 bucket A 是 trigger,而 S3 bucket B 則是 destination。以下再進一步說明

Function

在 AWS Lambda 上執行的程式碼稱為 Lambda function(Lambda 函數),包含你寫的程式、以及程式相關的 package(需要先在本地下載好打包成 zip 檔上傳)。AWS 採用 scale out 的方式管理 Lambda,一個 Lambda function 會由一個事件觸發,如果同時有 10 個事件,就會有 10 個 Lambda function 被觸發。

Trigger

觸發 Lambda function 的觸發器,可以是同步、異步或是輪詢事件。例如可以設置上傳檔案到 S3 就會自動觸發的 Lambda function 執行轉檔的程式,將剛上傳到 S3 的 mp4 檔轉成 gif 檔。或是透過輪詢 AWS DynamoDB 執行 Lambda function。

Destination

接收 Lambda function 執行後的結果,如例子中存放 gif 檔的 S3 bucket B。需要注意的是,在設置 destinations 需要新建立 AWS role 賦予相關權限給 Lambda,才能把結果存到 destinations。

如何使用 Lambda?

要使用 Lambda 需要先辦一個 AWS 帳號,進入 AWS console 搜尋 Lambda

search Lambda

點擊新增 Function 後可以看到下面的頁面:

lambda console

點擊中間的 Lambda logo 會跳到下方的 IDE,可線上修改程式、上傳 zip 或從 S3 讀取程式檔案。Lambda 支持多種語言撰寫程式,如 Python、Java 等。
開發者寫完程式後需要在 Handler 設置觸發時主要執行的檔案名稱與函式(如下方的 lambda_function.lambda_handler)以及設定觸發條件,儲存後就可以測試看看功能是否正常運行囉!

lambda function

使用心得

  1. 關於 dependencies:
    Lambda 不支持線上安裝 package,所有需要用的 package 都需要先壓縮成 zip 上傳,可以用創建 layer 的方式管理 package。但要注意命名(例如 python 的 package 需要以 python 開頭)詳細可參考文檔
  2. 適用場景:無狀態、用完即走的程式,如上傳檔案執行轉檔的服務。
  3. 開發情況:有時候 Lambda 開發儲存需要很多時間,建議先在線下寫好程式再上傳到 Lambda 不然開發起來很耗時也不容易 Debug。
dependencies

以上就是 serverless 與 AWS Lambda 的簡介ヽ(*´∀`)ノ゚。

--

--