前言 - 現有架構的挑戰
最近,我在一個 Serverless 專案中遇到了一個讓人頭疼的挑戰。這個專案運行在多個 Lambda Functions 之上,為了避免冷啟動帶來的延遲問題影響使用者體驗,需要確保 Functions 處於「熱啟動」狀態(Warm Start),如何有效管理大量的預熱 (prewarm) 操作變得非常棘手。
常見的解決方案之一,是為每個 Lambda Function 配置一個 EventBridge Scheduler,雖然可以達到預熱效果,但:
- 管理成本高:需要單獨為每個 Lambda Function 配置 Scheduler,數量多難以管理。
- 靈活性不足:難以快速響應需求變更,重新部署新的 Lambda Function 時,需要修改 Scheduler 的 Target。
基於這些挑戰,我開發了 Tag-Based Lambda Warmer Terraform Module,提供了一種低成本、高靈活性的解決方案。
Tag-Based Lambda Warmer 介紹
Tag-Based Lambda Warmer 的核心理念非常簡單:
將需要被預熱 (prewarm) 的 Lambda Function 加上指定的 Tag(例如:Prewarm=true
)。
當你部署 Terraform Module 後,EventBridge Schduler 會定期調用 Tag-Based Lambda Warmer,Warmer 會根據 Tag 自動篩選需要被預熱的 Lambda Functions
這套解決方案特別適合以下情境:
- 低流量、間歇性工作負載:例如開發環境或小型應用中的 Lambda Functions,需要偶爾處於熱啟動狀態,但不需要持續高效能。
- 多環境管理:通過不同的 Tag(例如
Environment=dev
或Environment=prod
),可以輕鬆在多個環境中靈活部署。 - 成本敏感型專案:對於中小型 Serverless 應用,這種解決方案能有效降低運維成本。
還是要提醒,這種透過定期調用來保持熱啟動狀態的解決方案,只能讓你保持至少有一個熱啟動狀態的 Execution Environment,今天流量突然有一個高峰,碰上冷啟動是不可避免的
我已經將 Tag-Based Lambda Warmer 寫成 Terraform Module 並發布到 Terraform Registry 囉,你只需要在你的 Terraform 配置中引用模組:
module "lambda_warmer" {
source = "aws-educate-tw/tag-based-lambda-warmer/aws"
# version = "0.2.1"
aws_region = "ap-northeast-1"
# Optional: Custom configuration
environment = "prod"
prewarm_tag_key = "Project"
prewarm_tag_value = "MyProject"
lambda_schedule_expression = "rate(5 minutes)"
scheduler_max_retry_attempts = 0
invocation_type = "Event"
}
執行流程
- EventBridge Scheduler 定時觸發 Tag-Based Lambda Warmer Function。
- Warmer Function 調用 Lambda API,獲取所有 Lambda Functions 列表。
- 根據指定的 Tag Key 和 Value,篩選出需要預熱的 Lambda Functions。
- 非同步觸發這些函數進行預熱。
- 執行日誌記錄在 CloudWatch Logs,方便後續監控與調試。
優點
如果某個 Lambda Function 不再需要預熱,只需 移除 Tag 或修改其值;如果日後又有預熱需求,只需重新加上 Tag,即可輕鬆加入預熱名單。
這種 Tag-Based 的設計具有以下幾個關鍵優勢:
- 靈活性高:
- 可以快速調整預熱範圍,無需重新部署基礎設施。
- 支援客製化篩選條件,例如基於專案名稱 (
Project=MyApp
) 或環境 (Environment=prod
) 的 Tag。
- 低成本:
- 只需一個 EventBridge Scheduler 和一個 Lambda Function 的組合,即可實現多個 Lambda 的集中化管理。
- 避免了高昂的 Provisioned Concurrency 成本,完全按需付費。
- 簡單易用:
- 部署 Module 後,唯一需要做的就是為 Lambda Functions 添加或移除 Tag,無需其他額外配置。 (視情況需要新增一小段程式碼)
注意事項
那些需要被預熱的 Lambda Functions 視情況可能需要在請求一到達時先檢查是否是 Prewarming 操作,避免被預熱後就執行了業務邏輯
以下是 Python 範例程式碼,你可以將以下程式碼插入至 lambda_handler
函數中,用來檢查是否是 Prewarming 操作:
def lambda_handler(event, context):
# Identify if the incoming event is a prewarm request
if event.get("action") == "PREWARM":
logger.info("Received a prewarm request. Skipping business logic.")
return {
"statusCode": 200,
"body": "Successfully warmed up"
}
結語
Tag-Based Lambda Warmer 是一個低成本、高靈活性的 Lambda 預熱解決方案。無論是小型專案還是多環境部署,它都能幫助你有效管理和優化 Lambda Functions 的冷啟動問題。
如果你對這個模組感興趣,歡迎參考以下資源:
- GitHub Repository: terraform-aws-tag-based-lambda-warmer
- Terraform Registry: AWS Lambda Warmer Module
有任何問題,歡迎提交 Issue。希望這個工具能幫助你更好地管理 Serverless 專案中的 Lambda Functions!