當我使用 AWS SDK 調用 AWS Lambda 函數時,該函數會傳回「簽名已過期」錯誤。
簡短說明
當用戶端時間與伺服器時間不相符時,Lambda 簽名會過期,且您會收到類似下列錯誤訊息:
"Error: native lambda error:InvalidSignatureException: Signature expired: 20230118T161739Z is now earlier than 20230118T161739Z (20190318T162239Z - 5 min.)"
API 請求必須在請求時間戳記的 5 分鐘內送達 AWS,否則 AWS 會拒絕該請求。在某些情況下,您可以變更用戶端時間以與伺服器時間相符。
解決方法
當您使用 AWS SDK 同步調用 Lambda 函數時,連線會持續直到回應傳回為止。預設情況下,Node.js SDK 會允許 50 個連線。如果達到連線配額,SDK 會在本機將請求排入佇列,直到連線可用為止。如果您收到「簽名已過期」錯誤,並且下列動作為真,則可能已達到連線配額:
- Lambda 函數未進行節流。
- 用戶端的時間正確無誤。
- (僅適用於 Node.js SDK)建立用戶端時,您可以設定 **CorrectClockskew: True ** 選項,以便在調用函數時更正時間。
- 您以高速率調用 Lambda 函數,或者以高速率調用 Lambda 函數,並且長時間執行調用。
SDK 會簽署請求,然後將請求置於佇列中。如果佇列變得太大且要求等候超過 5 分鐘,則簽名就會過期。任何其他請求都會失敗,因為簽名已過期。
如果您不需要調用的回應,請使用非同步調用。非同步調用允許 SDK 僅使用連接來調用請求,而不等待回應。
您也可以在應用程式中使用最高層級等待 (TLA)。如果您在處理程式之外進行 API 呼叫,並且在使用 Node.js AWS SDK v3 時收到 SignatureDoesNotMatch 例外,請使用 TLA。
或者,增加 SDK 允許的最大連線數。
**注意:**新增連線時,Lambda 函數會以更高的速率調用,並可能導致限流。
相關資訊
監控 Lambda 應用程式並進行疑難排解
如何疑難排解 Lambda 函數調用逾時錯誤?
如何確定我的 Lambda 函數是否逾時?