當我使用 AWS SDK 調用 AWS Lambda 函數時,該函數會傳回簽章過期錯誤。
簡短說明
當用戶端時間與伺服器時間不相符時,就會發生 Lambda 過期簽章,類似於下列錯誤:
"Error: native lambda error:InvalidSignatureException: Signature expired: 20230118T161739Z is now earlier than 20230118T161739Z (20190318T162239Z - 5 min.)"
API 請求必須在請求時間戳記的五分鐘內送達 AWS,否則 AWS 會拒絕該請求。在某些情況下,無法透過變更用戶端時間以符合伺服器時間的方式來修正此問題。
解決方法
使用 AWS SDK 同步調用 Lambda 函數時,連線會持續到回應傳回為止。Node.js SDK 預設允許 50 個連線。如果達到連線限制,SDK 就會在本機將要求排入佇列,直到有可用的連線為止。如果您收到簽章過期錯誤,可能會達到連線限制,而下列動作也會出現這種情況:
- Lambda 函數未進行節流。
- 用戶端的時間正確無誤。
- (僅限 Node.js SDK) 建立用戶端時,已設定 correctClockSkew:true 選項,以確保在調用時已更正時間。
- Lambda 函數以高速率調用,並且長時間執行。
- Lambda 函數以高速率調用。
SDK 會簽署要求,然後將其放入佇列中,等候可用連線。如果佇列變得太大且要求等候超過五分鐘,則簽章就會過期。任何其他要求都會失敗,因為簽章已過期。
若要解決此問題,如果不需要來自 Lambda 的非同步調用的回應,請考慮使用該調用。這允許 SDK 僅將連線用於調用要求,並且不會等候回應。
您也可以增加 SDK 允許的最大連線數。
**注意:**其他連線允許 Lambda 函數以更高的速率調用,不過這可能會導致節流發生。
相關資訊
監控 Lambda 應用程式並進行疑難排解
如何疑難排解 Lambda 函數調用逾時錯誤?
如何確定我的 Lambda 函數是否逾時?