如何使 Lambda 函數與 Amazon EC2 執行個體或 AWS 執行個體排程器一起正常工作?

上次更新日期:2021 年 9 月 8 日

我搭配 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體或 AWS 執行個體排程器使用 AWS Lambda 函數。但是我的 Lambda 函數逾時,無法叫用或拋出錯誤。

簡短描述

AWS 執行個體排程器會導致您的 Lambda 函數無法正常運作,原因如下:

  • 你的軟體開發套件逾時。若要解決這個問題,請完成 Fix SDK timeouts (修正軟體開發套件逾時) 區段中的步驟。
  • 你的函數逾時。若要解決這個問題,請完成 Prevent function timeouts (防止函數逾時) 區段中的步驟。
  • Amazon CloudWatch Events 規則未觸發。若要解決這個問題,請完成 Verify that your scheduled rule was invoked (確認已叫用您的排程規則) 區段中的步驟。
  • 你的函數正在調節。若要解決這個問題,請完成 Prevent function throttling (防止函數調節) 區段中的步驟。
  • 你有重複的 Lambda 叫用。若要解決這個問題,請完成 Prevent errors by using idempotency (使用冪等來防止錯誤) 區段中的步驟。

注意:AWS 執行個體排程器會以使用 CloudWatch Events 規則設定的間隔來排程 Lambda 函數,以執行 Lambda 函數。這會導致 Lambda 函數的非同步叫用,這會影響函數錯誤的處理方式。如果在執行時發生錯誤而導致函數失敗,則依預設相同的事件會再次重試兩次。然後,該事件會遭到捨棄。在調節的事件中,事件最多可以在事件遭到捨棄之前排入佇列六個小時。

解決方案

修正軟體開發套件逾時

早期版本的 AWS 執行個體排程器不會覆寫預設軟體開發套件逾時。如果 API 呼叫啟動或停止執行個體需要超過 60 秒的時間來回應較早的版本,則請求會逾時。

若要解決此問題,請取得最新版本的 AWS 執行個體排程器 ,或修改 Boto3 設定物件read_timeout 值 (在 Boto3 網站上)。例如:

import boto3
from botocore.config import Config

client_config = Config(read_timeout=890)

ec2 = boto3.client('ec2', config=client_config)

防止函數逾時

如果您的 Lambda 函數逾時,請檢查函數是否正在等待確認 EC2 執行個體已啟動。如需詳細資訊,請參閱為什麼我無法開始或啟動 EC2 執行個體?

執行個體可能需要幾分鐘的時間才能達到執行狀態。如果達到執行狀態的時間超過為函數設定的逾時時間,您的函數會逾時。若要解決此問題,請在 AWS CloudFormation 範本中修改 300 (5 分鐘) 的 Timeout (逾時) 值,以增加函數的逾時值。您必須有足夠的時間讓執行個體在函數逾時之前啟動。例如:

"Runtime": "python3.7",
"Timeout": 300,
"TracingConfig": {
    "Mode": "Active"
}

注意:Lambda 函數的最大可設定逾時值為 15 分鐘。

如果您的函數在虛擬私有雲端中,則必須允許您的函數存取網際網路,以便呼叫 Amazon EC2 API。

確認已叫用您的排程規則

若要針對 CloudWatch 事件未叫用的 Lambda 函數進行疑難排解,請參閱為什麼我的 Lambda 函數不是由我的 CloudWatch Events 規則觸發?

防止函數調節

若要防止函數調節,請參閱如何對具有「速率超出」和 429 「TooManyRequestsException」錯誤的 Lambda 函數調節進行疑難排解?

對於非同步叫用,您帳戶上的 Lambda 調節會影響叫用函數的能力。在叫用非同步叫用之前,所有非同步叫用都會傳送至事件佇列。如果另一個函數也收到大量的非同步叫用,那麼您的事件佇列會積存。這個積存並非表示您的函數無法叫用。這個積存表示事件已延遲。清除事件佇列積存之後,您可以看到多個叫用。依預設,非同步事件佇列中的事件會保留在非同步事件佇列中最多六小時。

使用冪等來防止錯誤

若要防止重複叫用錯誤,當函數以非同步叫用進行設定時,請讓 Lambda 函數成為冪等

請記住,因為與事件佇列的最終一致性,所以非同步 Lambda 叫用會發生多次。


此文章是否有幫助?


您是否需要帳單或技術支援?