AWS Lambda 是一個強大的無伺服器計算服務,可讓您在不管理基礎架構的情況下運行代碼,因此您可以專注於編寫代碼,而不必擔心預設或維護伺服器。
在本教程中,我們將探索 AWS Lambda,從設置您的第一個函數到將其與其他 AWS 服務集成。無論您是在處理數據流還是構建 API,本指南都將幫助您開始使用 AWS Lambda 進行無伺服器部署。
什麼是 AWS Lambda?
AWS Lambda 是由亞馬遜網絡服務(AWS)提供的無伺服器計算平台,允許開發人員運行代碼而無需預設或管理伺服器。 AWS Lambda 通過動態分配資源來執行您的函數,只在需要時收費,而不是根據預先分配的伺服器容量收費。
這種應用開發方法消除了傳統基礎設施設置的需要,讓您專注於編寫和部署代碼。
AWS Lambda 是事件驅動的,意味著它會受到來自其他 AWS 服務的特定事件觸發,這使其非常適合構建具有響應性、可擴展性和成本效益的解決方案。
傳統的部署方法需要設置和管理伺服器,這涉及擴展、更新和修補。這些任務可能耗時、昂貴,對於間歇性工作負載來說效率較低。相比之下,無伺服器部署消除了這些開銷,提供了自動擴展和開箱即用的高可用性。
AWS Lambda 的特點
- 事件驅動架構: AWS Lambda 函數會在資料變更、HTTP 請求或 AWS 資源更新等事件發生時被觸發。
- 多種運行時支援: Lambda 支援多種運行時,包括 Python、Node.js、Java、Go、Ruby 和 .NET。開發人員還可以使用 AWS Lambda Runtime API 自定義運行時,使其成為應對各種使用情況的多功能平台。
- 自動擴展性: AWS Lambda 根據需求自動擴展應用程式。無論是處理單個事件還是同時處理數千個事件,Lambda 都會動態調整計算資源。
- 按需計費: 成本由請求次數和函數執行時間決定。這消除了前期投資的必要,確保您僅為所使用的部分付費。
- 集成安全: Lambda 與 AWS 身份與訪問管理 (IAM) 一起工作,確保精細的訪問控制和您的函數與其他 AWS 服務之間的安全交互。
Lambda 的常見使用案例
- 處理數據流: AWS Lambda 集成了 Amazon Kinesis 來即時處理和分析數據流。例如,您可以監控 物聯網設備 或動態處理日誌文件。
- 構建 RESTful API: Lambda 函數可以與 AWS API Gateway 搭配使用,為網頁和移動應用程序創建可擴展的 API。這種設置通常用於處理用戶身份驗證、查詢數據庫或生成動態內容。
- 自動化工作流程: 通過根據來自服務(如 S3、DynamoDB 或 CloudWatch)的事件來觸發 Lambda 函數來自動化複雜的工作流程。例如,您可以調整上傳到 S3 的圖像大小或自動存檔舊的數據庫記錄。
- 數據流水線中的事件處理: 您可以使用 Lambda 處理實時數據事件,比如處理上傳到 S3 存儲桶的新文件、在存儲之前轉換數據,或者通過外部 API 調用來豐富數據流。
- 無伺服器後端處理: Lambda通常用於卸載後端任務,例如數據驗證,ETL(提取、轉換、加載)處理,或通過Amazon SNS或SES發送通知。
AWS Lambda如何運作?
AWS Lambda採用事件驅動模型運行,意味著它根據特定觸發器或事件執行代碼。Lambda功能的關鍵在於其與其他AWS服務的集成,以及根據需要執行函數的能力。讓我們逐步深入了解AWS Lambda的工作原理:
使用Lambda和其他核心AWS服務的架構示意圖範例。圖片來源:AWS。
1. 觸發AWS Lambda函數
AWS Lambda函數由來自各種AWS服務或外部系統的事件啟動。常見的事件來源包括:
- API Gateway:當用戶向您的API Gateway端點發送HTTP請求(例如GET或POST請求)時,Lambda可以執行一個函數來處理該請求,例如,用於在數據庫中創建用戶的RESTful API端點。
- S3 事件:Lambda 函数可以响应在 S3 存储桶中上传、删除或修改对象等操作。例如,它们可以在图像上传到 S3 存储桶后调整图像大小或转换文件格式。
- DynamoDB 流:对 DynamoDB 表的任何更改,如插入、更新或删除,都可以触发 Lambda 函数。例如,在向 DynamoDB 表添加新行时触发分析流水线。
- 自定义应用程序:您可以使用 SDK、CLI 或 HTTP 请求直接调用 Lambda 函数,从而与外部系统集成。
2. 执行环境
當事件觸發Lambda函數時,AWS會自動創建一個執行環境來運行代碼。這個環境包括:
- 您的函數代碼:為您特定任務編寫的代碼。
- 分配的資源:根據函數的需要,CPU和內存(可配置)會動態分配。
- 依賴項:部署期間指定的任何外部庫或包都將包含在內。
3. 並發與擴展性
AWS Lambda 透過平行運行多個函數實例來支援自動擴展。它能夠在無需配置的情況下透明地進行擴展。以下是並發工作的方式:
- 如果您的函數需要同時處理 100 個事件,Lambda 將根據需要創建所需的執行環境(最多達到並發限制)。
4. 與其他 AWS 服務的整合
AWS Lambda 與 AWS 服務深度整合,以構建穩健的端到端解決方案:
- 數據庫交互:Lambda 可以在執行期間讀取/寫入 DynamoDB 或 RDS 的數據。
- 消息服務: Lambda 可以透過 SNS 觸發通知或將消息發送到 SQS 隊列以進行下游處理。
- 監控和日誌記錄: CloudWatch 捕捉 Lambda 函數的所有日誌、指標和錯誤詳情,使您能夠監控和排除性能問題。
現在,讓我們開始設置您的第一個 Lambda 函數吧!
設置 AWS Lambda
前提條件
設置開發環境
- 安裝 AWS CLI: 下載並安裝 AWS CLI。使用您的 IAM 憑證進行配置。
- 設置Python或Node.js:根據您偏好的運行時安裝Python或Node.js。AWS Lambda支持多個運行時。在本教程中,我們將使用Python運行時。
第1步:訪問AWS Lambda控制台
- 登入AWS管理控制台。
- 前往 Lambda 服務。
在 AWS 控制台中導航至儀表板。
在導航選單中點擊Lambda以查看儀表板:
AWS 控制台中的 Lambda 儀表板。
第二步:創建新函數
- 點擊創建函數。
- 選擇“從頭開始創建”。
- 為您的函數提供一個名稱。
- 選擇運行時(例如,Python 3.11)。
- 點擊 創建函數 按鈕。
創建一個新的 AWS Lambda 函數。
這將需要幾秒鐘時間。函數創建完成後,您將在頂部看到一條成功消息。
步驟 3:編寫您的函數代碼
AWS Lambda 瀏覽器 IDE 用於簡單的代碼編輯。
步驟 4:測試您的 Lambda 函數
在此時,此函數只返回字符串“Hello from Lambda!”。
沒有邏輯,沒有依賴,什麼都沒有。
我們有一個名為lambda_function.py
的Python腳本,其中包含名為lambda_handler()
的函數,該函數返回一個字符串。
現在我們可以通過簡單點擊“測試”按鈕來測試它。
在瀏覽器中測試您的AWS lambda函數。
您可以刪除“事件JSON”,因為我們的函數不需要任何輸入。給定一個事件名稱,然後點擊“調用”按鈕。
AWS Lambda函數成功測試。
函數成功執行,並返回了消息。
太棒了!我們剛剛使用 AWS Lambda 部署了一個無伺服器函數。目前它並沒有太多功能,但已經可以運行。每次調用此函數時,它會返回一個簡單的字符串。
通過事件觸發 Lambda
如前所述,AWS Lambda 架構允許您在收到來自各種 AWS 服務的特定事件時觸發函數,使其成為一個多功能工具,用於自動化工作流程和集成系統。
像上傳文件到 S3 存儲桶、DynamoDB 表中的更新或通過 API Gateway 進行 API 調用等事件都可以觸發 Lambda 函數,實現實時處理和可擴展執行。
1. 設置 S3 觸發器
- 進入 S3 控制台。
- 選擇 S3 存儲桶。
- 在屬性下,添加一個事件通知以在創建對象時觸發您的 Lambda 函數。
在 AWS S3 存儲桶中創建事件通知。
在 S3 中選擇要觸發的 Lambda 函數。
示例用例:
-
- 自動調整上傳到S3的圖像大小。
- 將視頻轉換為多個分辨率或格式以進行串流播放。
- 在上傳時檢查文件格式、大小或元數據。
- 使用AI從上傳的文檔中提取文本(例如通過Amazon Textract)。
2. API Gateway 整合
- 前往API Gateway服務。
AWS控制台中的API Gateway服務儀表板。
- 創建一個新的REST API。
通過API Gateway創建新的REST API。
- 配置一個方法(例如,POST)以觸發您的Lambda函數。
示例用例:
-
- 構建用於實時響應的無服務器API。
- 觸發Lambda函數以在數據庫中創建並存儲用戶數據。
- 處理POST請求以實時處理並驗證客戶訂單
- 觸發Lambda函數從數據庫或API查詢並返回數據。
部署和監控AWS Lambdas
部署AWS Lambda函數非常簡單,可以根據您的需求使用不同的方法進行,例如使用AWS管理控制台進行手動部署或使用AWS CLI進行自動部署。
1. 使用AWS控制台進行手動部署
AWS管理控制台提供了直觀的Web界面,用於部署Lambda函數。這種方法非常適合小型項目或快速更改。以下是使用控制台部署Lambda函數的步驟:
- 創建或編輯函數:
- 登錄到 AWS管理控制台。
- 導航到AWS Lambda。
- 單擊“創建函數”以設置新函數或選擇要更新的現有函數。
- 上傳代碼:
- 選擇上傳來源,選擇.zip文件或容器映像。
- 您可以直接在集成的代碼編輯器中編輯函數代碼,用於小規模開發。
- 配置函數:
- 根據您的用例定義環境變量、內存分配和超時限制。
- 使用AWS IAM角色添加必要的權限,以允許函數與其他AWS服務進行交互。
- 部署更改:
- 單擊“部署”以保存並激活您的更改。
- 使用測試功能手動調用函數並驗證其是否按預期工作。
2. 使用 AWS CLI 進行自動部署
AWS CLI 是一種有效的方式,用於自動化部署和更新 Lambda 函數,特別適用於大型項目或 CI/CD 流水線,可確保一致性並減少手動錯誤。
步驟 1 – 準備部署包
將代碼和依賴項打包成 .zip 檔案。例如:
zip -r my-deployment-package.zip .
步驟 2 – 使用 CLI 部署函數
使用 update-function-code
命令上傳新代碼到 AWS Lambda:
aws lambda update-function-code \ --function-name MyFunction \ --zip-file fileb://my-deployment-package.zip
–function-name MyFunction \
–zip-file fileb://my-deployment-package.zip
aws lambda get-function --function-name MyFunction
步驟 3 – 檢查部署
部署後,使用以下命令驗證函數的狀態:
此命令檢索函數的配置並確認部署。
使用 CloudWatch 監控 Lambda
監控對於確保您的 Lambda 函數高效運行、優雅處理錯誤和滿足性能期望至關重要。AWS Lambda 與Amazon CloudWatch整合以提供監控和日誌記錄能力。
- Amazon CloudWatch 自動收集並顯示您 Lambda 函數的關鍵指標。這些指標幫助您分析函數的性能並排除問題。
- 需要監控的指標:
- 調用次數: 跟踪您的函數被調用的次數。幫助您了解流量模式和使用趨勢。
- 錯誤: 顯示函數執行期間的錯誤數量。使用此來識別失敗率和調試問題。
持續時間: 測量執行函數所需的時間。這對於優化性能和管理成本至關重要。
- 節流閥:顯示因達到並發限制而被節流的調用次數。
- 存取指標:
- 前往 CloudWatch 指標控制台。
選擇Lambda從命名空間列表中。
選擇您想要監控的函數以查看詳細的指標。
AWS Lambda 最佳實踐
現在您已經部署了第一個 Lambda 函數,了解一些未來更複雜項目的最佳實踐是非常有用的。在本節中,我提供一些需記住的最佳實踐。
1. 優化函數的冷啟動
- 冷啟動發生在 Lambda 函數在閒置後被調用時,導致 AWS 需要配置執行環境而產生輕微的延遲。儘管 AWS 會盡量減少這種開銷,但您可以採取一些措施來減少冷啟動時間:
- 使用較小的部署包
- 僅包含必要的依賴項,使部署包保持輕量級。
使用像 AWS Lambda Layers 這樣的工具來共享常用庫(例如 AWS SDK),以跨函數共享而無需將它們包含在個別的包中。
在可能的情況下壓縮和縮小代碼,特別是針對基於 JavaScript 或 Python 的函數。
避免在函數中進行繁重的初始化
將資源密集型初始化(例如資料庫連線、API 客戶端或第三方庫)移出函數處理程序。這可確保程式碼僅在每個環境中執行一次並在各個調用之間重複使用。
利用預配置佈局
對於關鍵、延遲敏感的函數,使用預配置佈局可使執行環境隨時準備好處理請求。儘管會增加額外成本,但可以保證高優先級工作負載的低延遲。
2. 保持函數狀態無關
無狀態性是無伺服器架構的基本原則,確保應用程式能夠無縫擴展:
避免依賴於內存數據
Lambda 函數是瞬時的,意味著它們的執行環境是臨時的,可能不會在各個調用之間保留。請勿依賴於內存變量,而應將狀態信息存儲在像 DynamoDB、S3 或 Redis 之類的外部系統中。
啟用冪等性
設計您的函數以優雅地處理重複事件。為請求使用唯一標識符,並檢查日誌或數據庫以確保同一事件不會被多次處理。
3. 使用環境變數
- 環境變數是配置 Lambda 函數的安全便捷方式:
- 存儲敏感信息
將 API 密鑰、數據庫連接字符串和其他秘密信息存儲為環境變數。AWS Lambda 在休息時加密這些變數,在執行時解密它們。
為增加安全性,使用 AWS Secrets Manager 或 Systems Manager Parameter Store 動態管理秘密。
簡化配置管理
使用環境變數來管理配置,如日誌級別、區域設置或第三方服務的URL。這消除了硬編碼值的需要,使您的函數在不同環境(例如開發、測試、生產)之間更具可移植性。
結論