AWS Lambda 與 Amazon EC2:該選擇哪一個?
亞馬遜是提供多元雲端服務的領導者之一,其服務項目已達數十種且持續增加中。Amazon EC2 是亞馬遜最受歡迎的服務之一,也是 2006 年推出的亞馬遜雲端運算平台的核心組成部分。如今 Amazon EC2 已被廣泛採用,但另一項名為 Lambda(於 2014 年推出)的亞馬遜服務人氣也正持續攀升。 今天的部落格文章將比較 AWS Lambda 與 EC2 這兩大平台,協助您根據自身環境做出正確的選擇。
什麼是 AWS EC2?
AWS EC2(Amazon EC2)是一項服務,可讓您在雲端使用稱為 EC2 執行個體的虛擬機器,並提供可擴展性。您可以隨時根據需求調整磁碟空間、CPU 效能、記憶體等資源。您可以選擇已預先安裝所需作業系統(OS)的基礎映像檔(例如 Linux 或 Windows),接著配置大部分的作業系統設定,並安裝自訂應用程式。 您擁有 Amazon EC2 執行個體的 root 存取權限,並可建立額外使用者。您可以管理所需的一切,並完全掌控您的 EC2 執行個體,包括重新啟動和關閉執行個體。AWS EC2 網路服務歸類於"基礎架構即服務"(IaaS)。AWS EC2 可用於雲端託管——您可以在雲端中將伺服器部署為虛擬機器(執行個體)。
什麼是 AWS Lambda?
AWS Lambda 是一個運算平台,當與某個事件關聯的觸發器被觸發時,您即可執行以受支援的程式語言(Java、JavaScript 或 Python)所編寫的程式碼。您無需配置虛擬伺服器和環境,即可執行自己編寫的應用程式。只需插入您的程式碼(稱為 Lambda 函式 (在此情況下)在 AWS Lambda 介面中,將 Lambda 函式與事件關聯,並在需要時於雲端執行應用程式,無需處理伺服器管理與環境設定。如此一來,您便能專注於應用程式本身,而非伺服器管理——這正是 AWS Lambda 被稱為 無伺服器。
觸發應用程式執行的事件可能包括:將檔案上傳至 Amazon S3 儲存桶、對 DynamoDB 資料表進行變更、接收傳送至 API Gateway 服務的 HTTP 請求等。在設定好函式於事件發生時執行後,每當有新事件發生,您的應用程式便會自動執行。
就分類而言,Lambda 是 Amazon 所實現的"函式即服務"(FaaS)。在下表中,您可以看到從使用實體伺服器開始,各服務類型的管理層級,並進行比較。最低層級(需使用者自行管理)以綠色標示,較高層級(由供應商提供管理)則以藍色標示。因此,當使用實體伺服器時,您可以管理硬體以及所有較高層級。 當使用基礎架構即服務(IaaS)例如 AWS EC2 時,您可以管理由託管服務供應商提供的虛擬機器(EC2 執行個體)上的作業系統。在平台即服務(PaaS)層級,您可以執行您的應用程式,但該應用程式必須在執行前進行編譯。 當使用函式即服務(FaaS),例如 AWS Lambda 時,您無需編譯應用程式——只需將程式碼插入由 MSP(託管服務供應商)提供的介面中即可。表格中為比較而提及的軟體即服務(SaaS),僅允許您透過輕量級客戶端或網頁瀏覽器,在雲端上使用現成的應用程式(由供應商開發的應用程式)。
AWS EC2 與 Lambda:使用情境
由於使用此服務時幾乎所有設定皆可自訂,因此 AWS EC2 擁有廣泛的使用情境。AWS EC2 最常見的使用情境包括:
- 網站託管
- 開發與測試應用程式或複雜環境
- 高效能運算
- 災難還原
AWS Lambda 的常見使用情境:
- 任務自動化
- 處理上傳至 Amazon S3 的物件
- 即時日誌分析
- 即時篩選與轉換資料
讓我們來探討一個具體的例子。假設您的網站使用 Amazon S3 儲存桶來儲存網站內容,包括圖片、影片、音訊檔案等。當上傳新的圖片或影片檔案時,您需要為網頁建立預覽圖,作為連結至原始尺寸圖片或影片檔案的入口。手動建立預覽圖是一項既枯燥又耗時的任務。 在這種情況下,您可以建立一個 Lambda 函式,該函式能根據上傳的圖片自動調整圖片大小、重新命名該圖片,並將目標圖片儲存至適當的目錄中。您可以將 Lambda 函式設定為在原始圖片檔案上傳至網站所使用的 Amazon S3 儲存桶後立即執行。
AWS EC2 與 Lambda:運作原理
EC2. 您可能還記得,在使用 AWS EC2 時,您操作的是稱為 EC2 執行個體的虛擬機器 (VM)。您可以向 EC2 執行個體新增虛擬硬體(虛擬磁碟、網路介面、處理器、記憶體),並可啟動、停止及重新啟動虛擬機器執行個體。EC2 執行個體可搭配兩種儲存類型使用——彈性區塊儲存 (EBS) 及 S3 儲存桶。 您可以使用已預先配置且安裝了作業系統的映像檔,亦可建立自訂的 Amazon EC2 機器映像 (AMI)。Amazon EC2 雲端服務提供自動縮放與負載平衡功能。Amazon EC2 執行個體可與大多數其他 Amazon 網路服務(例如 S3、ECS、Route53、CloudWatch 等)協同運作。.
Lambda. 使用 AWS Lambda 時,您的應用程式(Lambda 函式)會在一個對您而言完全無縫的容器中執行。該容器包含程式碼和函式庫。Amazon 會根據應用程式的需求提供資源,且縮放過程是自動且無縫的。您無法控制執行應用程式的容器,也無法控制該容器所運行的 Amazon EC2 執行個體(您對它們一無所知,因為 Amazon Lambda 使用者無法存取底層基礎架構)。 請參閱上表。
AWS Lambda 可視為 EC2 Container Service (ECS) 的框架,它利用容器來執行代表您應用程式的程式碼片段。每個容器的生命週期都很短。正在執行的 Lambda 函式不會儲存其狀態。若要儲存結果,應將其保存在某種資料儲存空間中,例如 Amazon S3 儲存桶。 您可以為 Lambda 函式配置虛擬網路,例如用於連線至 Amazon RDS(Amazon Relational Database Service)。Lambda 由多個部分組成:層、函式環境以及處理程序。觸發器是 Lambda 的啟動機制。Lambda 是一項由觸發器查詢所執行的函式。
可用觸發器的完整清單:
- API 閘道
- AWS IoT
- Alexa 技能套件
- Alexa 智慧家庭
- 應用程式負載平衡器
- CloudFront
- CloudWatch Events
- CloudWatch Logs
- CodeCommit
- Cognito 同步觸發器
- DynamoDB
- Kinesis
- S3
- SNS
- SQS
API Gateway 是一項特殊服務,可讓開發人員將各式各樣的非 AWS 應用程式與 AWS 應用程式及其他資源進行連接。
AWS EC2 與 Lambda 比較:版本/快照
EC2. 一個由……組成的複雜系統 快照 此功能適用於 AWS EC2 執行個體的 EBS(彈性區塊儲存)儲存卷。您可以建立增量快照,並 回滾至所需狀態 EC2 執行個體的快照。多卷快照可用於關鍵工作負載,例如使用多個 EBS 卷的資料庫。
Lambda. 系統支援便捷的版本控制機制,以便更有效地管理 Lambda 函式。您可以為每個上傳的程式碼副本指派一個版本號,然後新增指向相應程式碼版本的別名。每個版本號從 1 開始,並依序遞增。例如,您可以將 Lambda 函式分類為 alpha、beta 和生產環境版本。在發佈時,系統會為每個 Lambda 函式版本指派一個 Amazon Resource Name(ARN),此名稱日後無法變更。
AWS EC2 與 Lambda:安全性
EC2. 您應妥善管理您的 Amazon EC2 執行個體及其內部的所有元件。您可以手動為 Amazon EC2 執行個體設定防火牆——Amazon 提供 VPC(虛擬私有雲)防火牆,用以控制流量並確保雲端中 Amazon EC2 執行個體的安全性。 您可以手動為 EC2 執行個體安裝並設定防毒軟體、建立 IAM 角色、指定權限、建立安全群組等。AWS Systems Manager Patch Manager 可讓您自動安裝作業系統更新與安全性修補程式。您可設定 AWS 在安裝修補程式或更新前先建立快照,以防範可能發生的問題。如有需要,請建立金鑰對以存取 EC2 執行個體。相較於使用 AWS Lambda,在使用 AWS EC2 時應更加重視安全性。
Lambda. Lambda 預設可存取某些 AWS 服務的權限。IAM 角色是用來定義 Lambda 函式必須能夠存取的服務。 對於每個 Lambda 函式,您都應設定一個 IAM 角色,作為啟動該 Lambda 函式的代理身分。這意味著在設定 IAM 角色後,您將能夠讓 Lambda 函式連線至已定義的 Amazon 服務,而無需使用金鑰或其他授權參數。
您可以使用 KMS 金鑰,設定 Lambda 函式與 S3 之間的加密,以及 API Gateway 與 Lambda 之間的加密。 建立 Lambda 函式時,系統會自動建立一個預設加密金鑰。不過,建議您自行建立 KMS 金鑰。
與 Amazon EC2 執行個體相比,Lambda 函式無需進行安全性更新與修補程式。底層的容器和作業系統會由 Amazon 自動更新。這正是使用 Lambda 函式在安全性方面的優勢。
AWS EC2 與 Lambda:效能與可用性
EC2. 啟動 EC2 執行個體後,該執行個體將持續運行,直到您手動停止它或排程關機任務為止。當 EC2 執行個體處於運行狀態時,應用程式幾乎能立即在該執行個體上執行。只要您的 EC2 執行個體效能允許,即可同時執行任意數量的應用程式。若應用程式必須在全天定期運行,在 EC2 執行個體上執行應用程式便是一個理想的解決方案。
Lambda. Lambda 函式隨時可用,但並非持續運行。預設情況下,Lambda 函式處於非活動狀態。當與某個事件關聯的觸發器被啟動時,您的應用程式(Lambda 函式)便會開始執行。Lambda 函式的最大執行時間(超時)上限為 900 秒(15 分鐘)。 因此,在 AWS Lambda 中執行長期運行的應用程式並非明智之舉。若您需要執行需超過 900 秒才能成功完成的應用程式,或執行時間不固定的應用程式,請考慮使用 AWS EC2。Lambda 函式運行的另一項限制是最大記憶體用量,上限為 3008 MB。
視區域而定,可同時執行 1000 至 3000 個 Lambda 執行個體。 若您希望同時執行更多執行個體,請聯絡 AWS 技術支援。
對於 AWS Lambda 而言,從傳送請求到應用程式執行的延遲最長可達 100 毫秒,這與在 EC2 執行個體上執行的應用程式不同,後者並無此類延遲。100 毫秒雖不算長,但對於某些類型的應用程式而言,這段時間可能至關重要。 若您的應用程式必須從 Amazon S3 儲存桶下載某些資料,在應用程式執行前可能需要額外 1 至 3 秒的時間。在規劃使用 AWS Lambda 執行應用程式時,請務必留意此延遲時間。
冷啟動時間是 Lambda 函式的缺點之一。 當函式在一段較長的時間內未被執行時,便會產生延遲,因為在 Amazon 雲中啟動容器並執行函式需要時間。若您面臨工作負載不均勻的情況,且應用程式必須在一天中的不同時段執行,且應用程式執行之間有較長的停頓時間,使用 AWS Lambda 來執行應用程式可能是一個不錯的解決方案。
AWS Lambda 與 EC2:定價模式
EC2 和 Lambda 這兩項雲端服務均採用"隨用隨付"的計費原則。不過,讓我們來探討兩者的細節與差異。
EC2. 無論函式/應用程式是否執行,您都需為 AWS EC2 執行個體的運行時間付費。每小時的費用取決於 EC2 執行個體所使用的 CPU 效能、記憶體容量、顯示卡效能以及儲存容量。當您因定期請求量龐大而需要函式/應用程式始終保持可用時,使用 AWS EC2 執行個體在財務上可能更為合理。
Lambda. 您需支付應用程式執行次數及完成執行所需的時間所產生的費用。應用程式每秒的運行費用取決於為該應用程式配置的記憶體用量,每吉字節秒的費用為 0.00001667 美元。應用程式執行時間的計算起點為應用程式啟動時刻,至結果返回或因超時而停止為止。 時間會向上取整至最接近的 100 毫秒倍數。若您需要隨需可用性,使用 AWS Lambda 執行函式/應用程式的費用可能更為划算。
結論
AWS EC2 是一項代表傳統雲端基礎架構(IaaS)的服務,讓您能夠將 EC2 執行個體作為虛擬機器(VM)運行、配置環境,並執行自訂應用程式。
AWS Lambda 是亞馬遜推出的"函式即服務"(Function as a Service)解決方案,讓您無需擔心底層基礎架構即可運行應用程式。AWS Lambda 提供無伺服器架構,並讓您能在事件觸發器被激活後,在雲端執行一段程式碼。 使用 AWS Lambda 時,您將擁有具備版本控制功能、可擴展、體積小且成本低廉的函式。您可以專注於編寫程式碼,而非配置基礎架構。
如果您計算過,應用程式在始終運行的 EC2 執行個體上存在大量閒置時間,請考慮使用 AWS Lambda;透過此服務,當沒有請求執行應用程式時,您無需為閒置時間付費。 若您的應用程式有大量定期請求,將應用程式部署在始終運行的 EC2 執行個體上可能更為合適。
使用 AWS EC2 適合執行高效能應用程式、長期運行的應用程式,以及啟動時絕不能有延遲的應用程式。若您使用 AWS EC2 執行個體,請務必進行備份,以避免資料遺失。 NAKIVO Backup & Replication 這是一套全方位的資料保護解決方案,除了能保護 VMware vSphere 虛擬機器、Hyper-V 虛擬機器及實體伺服器外,還能保護 EC2 執行個體。
