View a markdown version of this page

擴展 Lambda 受管執行個體 - AWS Lambda

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

擴展 Lambda 受管執行個體

當呼叫到達時,Lambda 受管執行個體不會擴展,也不支援冷啟動。反之,它會使用資源耗用訊號以非同步方式擴展。受管執行個體目前會根據 CPU 資源使用率和多並行飽和度進行擴展。

主要差異:

  • Lambda (預設):在沒有免費執行環境來處理傳入調用時擴展 (冷啟動)

  • Lambda 受管執行個體:根據執行環境的 CPU 資源使用率和多並行飽和,以非同步方式擴展

如果您的流量在 5 分鐘內增加一倍以上,您可能會在 Lambda 擴展執行個體和執行環境以滿足需求時看到調節。

擴展生命週期

Lambda 受管執行個體使用分散式架構來管理擴展:

元件:

  • 受管執行個體 - 在您提供的子網路中於您的帳戶中執行

  • Router and Scaler - 路由呼叫和管理擴展的共用 Lambda 元件

  • Lambda 代理程式 - 在每個受管執行個體上執行,以管理執行環境生命週期並監控資源消耗

運作方式:

  1. 當您使用容量提供者發佈函數版本時,Lambda 會在您的帳戶中啟動受管執行個體。根據預設,它會針對 AZ 彈性啟動三個 ,並在標記函數版本 ACTIVE 之前啟動三個執行環境。

  2. 每個受管執行個體都可以針對映射至相同容量提供者的多個函數執行環境。

  3. 隨著流量流入您的應用程式,執行環境會耗用 資源。Lambda 代理程式會通知 Scaler,以決定是否擴展新的執行環境或受管執行個體。

  4. 如果 Router 嘗試將調用傳送至資源消耗較高的執行環境,則該執行個體上的 Lambda 代理程式會通知它在另一個執行個體上重試。

  5. 隨著流量減少,Lambda 代理程式會通知 Scaler,以決定縮減執行環境並縮減受管執行個體。

調整擴展行為

您可以透過五個控制項自訂受管執行個體的擴展行為:

函數層級控制項

1. 函數記憶體和 vCPUs

選擇函數的記憶體大小和 vCPU 配置。支援的最小函數大小為 2GB 和 1vCPU。

考量:

  • 挑選支援函數多並行執行的記憶體和 vCPU 設定

  • 您無法設定少於 1 個 vCPU 的函數,因為在受管執行個體上執行的函數應支援多並行工作負載

  • 您無法選擇小於 2GB,因為這符合 c 執行個體的 2 比 1 記憶體與 vCPU 比率,其比率最低

  • 對於 Python 應用程式,由於 Python 處理多並行的方式,您可能需要選擇較高比率的記憶體與 vCPUs,例如 4 比 1 或 8 比 1

  • 如果您執行 CPU 密集型操作或執行少量 IO,您應該選擇多個 vCPU

2. 並行上限

設定每個執行環境的最大並行數。

預設行為:Lambda 選擇合理的預設值,以平衡適用於各種應用程式的資源消耗和輸送量。

調整準則:

  • 增加並行:如果您的函數調用使用極少的 CPU,您可以將並行上限提高到每個 vCPU 最多 64 個

  • 減少並行:如果您的應用程式耗用大量記憶體和極少 CPU,您可以減少並行上限

重要:由於 Lambda 受管執行個體適用於多並行應用程式,因此在擴展時,並行非常低的執行環境可能會遇到調節。

3. 每個函數的執行環境

為您的函數設定執行環境的最小和最大數量。

預設行為:Lambda 維護至少 3 個預設執行環境,以確保跨可用區域的高可用性。

調整準則:

  • 設定最小值:佈建基準流量的容量,並在突增期間減少調節。

  • 設定上限:限制執行環境的數量,以控制向外擴展,並防止多個函數共用容量提供者時出現雜訊鄰近問題。

  • 停用函數:將最小值和最大值設定為 0,以停用函數而不將其刪除。

範例

aws lambda put-function-scaling-config \ --function-name my-lmi-function \ --qualifier '$LATEST.PUBLISHED' \ --function-scaling-config MinExecutionEnvironments=5,MaxExecutionEnvironments=20 \ --region us-east-1

重要備註:

  • 限定詞範圍:這些組態適用於每個合格 ARN 的函數層級。在 上設定 時$LATEST.PUBLISHED,組態會傳播到未來的$LATEST.PUBLISHED版本。在特定版本上設定時,新發佈的版本會還原為預設值。

  • 配對組態:您必須同時設定最小值和最大值。任何未指定的設定都會還原為其預設值。MinExecutionEnvironments 和 的有效值MaxExecutionEnvironments範圍介於 0 到 15000。

容量提供者層級控制

4. 目標資源使用率

選擇您自己的 CPU 使用率消耗目標。

預設行為:Lambda 維持足夠的空間,讓您的流量在 5 分鐘內加倍,無需調節。

最佳化選項:

  • 如果您的工作負載非常穩定,或者您的應用程式對調節不敏感,您可以將目標設定為高層級,以實現更高的使用率和更低的成本

  • 如果您想要維持高載流量的標頭空間,您可以將資源目標設定為低層級,這將需要更多容量

5. 執行個體類型選取

設定允許或排除的執行個體類型。

預設行為:Lambda 會為您的工作負載選擇最佳的執行個體類型。建議讓 Lambda 受管執行個體選擇執行個體類型,因為限制可能的執行個體類型數量可能會導致可用性降低。

自訂組態:

  • 特定硬體需求:將允許的執行個體類型設定為相容的執行個體清單。例如,如果您的應用程式需要高網路頻寬,您可以選取多個 n 個執行個體類型

  • 成本最佳化:對於測試或開發環境,您可以選擇較小的執行個體類型,例如 m7a.large 執行個體類型

排程擴展

使用 Amazon EventBridge 排程器,依重複或一次性排程調整函數的最小和最大執行環境。這對於可預測的流量模式很有用,例如在尖峰時間之前向上擴展,以及在離峰時間向下擴展。

排程器組態:

  • 建立 EventBridge 排程器執行角色,或使用授予對目標函數lambda:PutFunctionScalingConfig呼叫 許可的現有角色。

  • 使用 Cron 或 Rate 表達式建立排程,並將 PutFunctionScalingConfig API 作為通用目標。在輸入承載中指定新的 MinExecutionEnvironmentsMaxExecutionEnvironments值。

範例 1:擴展以處理規劃的尖峰流量

建立兩個排程以在尖峰時間之前向上擴展,並在之後向下擴展。每個排程都以具有更新 MinExecutionEnvironmentsMaxExecutionEnvironments值的 PutFunctionScalingConfig API 為目標。

在 UTC 上午 8:00 向上擴展 (最小值 = 100,最大值 = 1000):

aws scheduler create-schedule \ --name "ScaleUpLambdaManagedInstances" \ --schedule-expression "cron(0 8 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 100, \"MaxExecutionEnvironments\": 1000}}" }'

在 UTC 下午 6:00 縮減規模 (最小值 = 5,最大值 = 20):

aws scheduler create-schedule \ --name "ScaleDownLambdaManagedInstances" \ --schedule-expression "cron(0 18 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 5, \"MaxExecutionEnvironments\": 20}}" }'

範例 2:在離峰時間停用並重新啟用

MinExecutionEnvironments和 同時MaxExecutionEnvironments設定為 0 會停用函數版本,而不會將其刪除。停用的函數不會自動隨流量縮減規模。您必須透過另一個排程動作設定非零值,明確地重新啟用它。

在 UTC 下午 10:00 停用 (最小值 = 0,最大值 = 0):

aws scheduler create-schedule \ --name "DeactivateLambdaManagedInstances" \ --schedule-expression "cron(0 22 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 0, \"MaxExecutionEnvironments\": 0}}" }'

在 UTC 上午 7:00 重新啟用 (最小值 = 10,最大值 = 20):

aws scheduler create-schedule \ --name "ReactivateLambdaManagedInstances" \ --schedule-expression "cron(0 7 * * ? *)" \ --flexible-time-window '{"Mode": "OFF"}' \ --target '{ "Arn": "arn:aws:scheduler:::aws-sdk:lambda:PutFunctionScalingConfig", "RoleArn": "arn:aws:iam::<account-id>:role/eventbridge-scheduler-role", "Input": "{\"FunctionName\": \"my-lmi-function\", \"Qualifier\": \"$LATEST.PUBLISHED\", \"FunctionScalingConfig\": {\"MinExecutionEnvironments\": 10, \"MaxExecutionEnvironments\": 20}}" }'

調整準則:

  • 對於具有可預測尖峰的工作負載,請建立多個排程以符合您的流量模式:一個在尖峰小時之前擴展您的函數,另一個在尖峰小時之後擴展。每個排程都遵循具有更新 MinExecutionEnvironmentsMaxExecutionEnvironments值的相同模式。

  • 排程擴展會調整執行環境的佈建樓層和上限,但最小和最大之間的實際擴展仍會回應 CPU 使用率和並行飽和度。

  • 如果您的流量在排程擴展的 5 分鐘內增加一倍以上,在佈建容量時,您可能仍會遇到調節。

  • 擴展至零以停用函數時,請記住,重新啟用需要具有非零值的明確PutFunctionScalingConfig呼叫。

後續步驟