Lambda 受管執行個體的最佳實務 - AWS Lambda

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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:將執行緒安全集合、 AtomicIntegerThreadLocal用於請求特定狀態

  • Node.js:針對所有請求特定的狀態使用 InvokeStore,並避免全域變數

  • Python:在 中使用唯一的檔案名稱/tmp搭配請求 IDs並考慮以程序為基礎的記憶體隔離

  • Rust:使用 run_concurrent而非 run,並啟用 concurrency-tokio功能。處理常式必須是 Clone + Send

測試執行緒安全和並行問題。在部署到生產環境之前,請徹底測試您的 函數是否有執行緒安全問題、競爭條件,以及在並行負載下的適當狀態隔離。

後續步驟