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 分以上保留になると、署名は期限切れになります。署名の有効期限が切れているため、それ以降のリクエストは失敗します。
この問題を解決するには、呼び出しからの応答が不要な場合は、Lambdaの非同期呼び出しの使用を検討してください。これにより、SDK はリクエストを呼び出すためだけに接続を使用でき、応答を待つ必要がなくなります。
SDK で許可される最大接続数を増やすこともできます。
**注:**接続を追加すると、Lambda 関数をより高いレートで呼び出すことができるため、スロットリングが発生する可能性があります。
関連情報
Lambda アプリケーションのモニタリングとトラブルシューティング
Lambda 関数呼び出しのタイムアウトエラーをトラブルシューティングする方法を教えてください。
Lambda 関数がタイムアウトしているかどうかを確認する方法を教えてください。