本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Lambda 受管執行個體的最佳實務
容量提供者組態
依信任層級分隔容量提供者。為具有不同安全需求的工作負載建立不同的容量提供者。指派給相同容量提供者的所有函數都必須相互信任,因為容量提供者可做為安全界限。
使用描述性名稱。命名容量提供者,以清楚指出其預期用途和信任層級 (例如 production-trusted、)dev-sandbox。這有助於團隊了解每個容量提供者的目的和安全性狀態。
使用多個可用區域。在建立容量提供者時,指定跨多個可用區域的子網路。Lambda 預設會針對 AZ 彈性啟動三個執行個體,以確保函數的高可用性。
執行個體類型選取
讓 Lambda 選擇執行個體類型。根據預設,Lambda 會為您的工作負載選擇最佳的執行個體類型。我們建議您讓 Lambda 受管執行個體為您選擇執行個體類型,因為限制可能的執行個體類型數量可能會導致可用性降低。
指定特定需求的執行個體類型。如果您有特定的硬體需求,請將允許的執行個體類型設定為相容的執行個體清單。例如:
-
對於需要高網路頻寬的應用程式,請選取多個 n 個執行個體類型
-
針對具有成本限制的測試或開發環境,請選擇較小的執行個體類型,例如 m7a.large
函數組態
選擇適當的記憶體和 vCPU 設定。選取支援函數多並行執行的記憶體和 vCPU 組態。支援的函數大小下限為 2GB 和 1 個 vCPU。
-
對於 Python 應用程式,選擇較高比率的記憶體與 vCPUs(例如 4 比 1 或 8 比 1),因為 Python 處理多並行的方式
-
對於執行少量 IO 的 CPU 密集型操作或函數,請選擇多個 vCPU
-
對於 IO 密集型應用程式,例如 Web 服務或批次任務,多並行可提供最大效益
適當設定並行上限。Lambda 會針對平衡資源消耗和輸送量的最大並行選擇合理的預設值。根據函數的資源用量調整此設定:
-
如果您的函數調用使用極少的 CPU,請增加並行上限 (每個 vCPU 最多 64 個)
-
如果您的應用程式使用大量記憶體和極少 CPU,請減少並行上限
請注意,並行極低的執行環境可能會遇到調節和擴展困難。
擴展組態
設定適當的目標資源使用率。根據預設,Lambda 會維持足夠的空間,讓您的流量在 5 分鐘內加倍,無需調節。根據您的工作負載特性進行調整:
-
對於對調節不敏感的非常穩定工作負載或應用程式,請將目標設定為高層級,以實現更高的使用率和更低的成本
-
對於具有潛在流量暴增的工作負載,請將資源目標設定為低層級,以維持額外的空間
規劃流量成長。如果您的流量在 5 分鐘內增加一倍以上,您可能會在 Lambda 擴展執行個體和執行環境時看到調節。設計您的應用程式,以在快速擴展期間處理潛在的限流。
安全
套用 PassCapacityProvider 許可的最低權限。僅授予必要容量提供者的lambda:PassCapacityProvider許可。使用資源層級許可來限制使用者可以指派給函數的容量提供者。
監控容量提供者用量。Use AWS CloudTrail 可監控容量提供者指派和存取模式。這有助於識別未經授權的存取嘗試,並確保符合安全政策。
分隔不受信任的工作負載。請勿在不受信任的工作負載之間依賴容器進行安全隔離。使用不同的容量提供者來分隔不受互信的工作負載。
成本最佳化
利用 EC2 定價選項。利用 EC2 Savings Plans 和預留執行個體來降低成本。這些定價選項適用於基礎 EC2 運算 (15% 的管理費不會折扣)。
針對穩定狀態工作負載進行最佳化。Lambda 受管執行個體最適合具有可預測大量流量的穩定狀態函數。對於高載流量模式,Lambda (預設) 可能更具成本效益。
監控資源使用率。追蹤 CloudWatch 指標以了解 CPU 和記憶體使用率。根據實際用量模式調整函數記憶體配置和執行個體類型選擇,以最佳化成本。
監控與可觀測性
監控容量提供者指標。追蹤容量提供者層級指標,包括 CPUUtilization、MemoryUtilization、vCPUAvailable 和 MemoryAvailable,以確認工作負載有足夠的資源可用。
監控執行環境指標。追蹤執行環境層級指標,包括 ExecutionEnvironmentConcurrency 和 ExecutionEnvironmentConcurrencyLimit,以了解擴展行為並識別潛在的限流。
設定 CloudWatch 警示。為關鍵指標建立 CloudWatch 警示,以主動識別問題:
-
CPU 或記憶體使用率高
-
可用容量低
-
接近並行限制
語言特定考量事項
遵循特定語言的最佳實務。每種程式設計語言處理多並行的方式都不同。檢閱語言特定指南以取得詳細建議:
-
Java:將執行緒安全集合、
AtomicInteger和ThreadLocal用於請求特定狀態 -
Node.js:針對所有請求特定的狀態使用 InvokeStore,並避免全域變數
-
Python:在 中使用唯一的檔案名稱
/tmp搭配請求 IDs並考慮以程序為基礎的記憶體隔離 -
Rust:使用
run_concurrent而非run,並啟用concurrency-tokio功能。處理常式必須是Clone+Send。
測試執行緒安全和並行問題。在部署到生產環境之前,請徹底測試您的 函數是否有執行緒安全問題、競爭條件,以及在並行負載下的適當狀態隔離。
後續步驟
-
使用 CloudWatch 指標監控 Lambda 受管執行個體