AWS SDK を使用して AWS Lambda 関数を呼び出すと、関数は署名の期限切れエラーを返します。
簡単な説明
クライアント時間とサーバー時間が一致しない場合、Lambda 署名が期限切れとなり、次のようなエラーメッセージが表示されます。
「エラー: ネイティブ lambda エラー: InvalidSignatureException: 署名の有効期限が切れました: 20230118T161739Z が、20230118T161739Z よりも早い時間となっています (20190318T162239Z - 5 分)」
API リクエストは、リクエストのタイムスタンプから 5 分以内に AWS に到達する必要があります。それ以外の場合、AWS によりリクエストが拒否されます。シナリオによっては、クライアント時間をサーバー時間に合わせて変更できます。
解決策
AWS SDK を使用して Lambda 関数を同期的に呼び出すと、応答が返されるまで接続は継続します。Node.js SDK はデフォルトで 50 の接続を許可します。接続クォータに達すると、SDK は接続が利用可能になるまで、リクエストをローカルでキューに入れます。「Signature expired (署名の期限切れ)」エラーが発生しており、次のアクションが当てはまる場合は、接続クォータに達している可能性があります。
- 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 関数がタイムアウトしているかどうかを確認する方法を教えてください。