The request signature we calculated does not match

TL;DR — AWS があなたの DynamoDB リクエストの SigV4 署名を再計算したところ、送られてきた値と異なりました。よくある原因は、誤った/対応しないシークレットキー、自分のマシンと AWS の時計のずれ、あるいは微妙に間違って組み立てられた自前の正規リクエストです。キーか時計を直してください — あるいは単に AWS SDK に署名させましょう。

意味

InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

すべての DynamoDB リクエストは、リクエストの正規形に対してシークレットキーを使い SigV4 で署名されます。AWS はサーバー側で署名を再導出し、異なればこの HTTP 400 を返します。これは(アイデンティティ/署名の)認証 の失敗であり、認可の拒否とは別物です。通常はそのままではリトライ不可ですが、時計のずれが原因なら 断続的に 現れることがあります。

発生する理由

  • 誤ったシークレットアクセスキーAWS_SECRET_ACCESS_KEYAWS_ACCESS_KEY_ID に対応していない(キーの取り違え、ローテーション済み/古いシークレット、末尾の余分な空白や改行)。
  • 時計のずれ — マシンの時刻が AWS からずれている。SigV4 はリクエストのタイムスタンプを署名に織り込むので、時計が狂うと署名も壊れます(VM/コンテナで典型的、たとえば VM がハイバネーションから復帰した後など)。
  • 手で組み立てた正規リクエスト — 独自のサイナーがヘッダー/クエリパラメータの順序を誤る、URI を誤ってエンコードする、誤ったペイロードをハッシュする、など。
  • キー内の特殊文字の扱いの誤り-+/% を含むシークレットは、認証情報ファイルを組み立てるシェルやスクリプトで壊れることがあります。AWS はキーの再生成を勧めています。
  • 旧来の SigV2 — Signature Version 2 での署名。Amazon S3 のようなサービスや新しいリージョンではもうサポートされていません。
  • 署名後に プロキシやゲートウェイがリクエストを変更している(ヘッダーの追加/並べ替え、パスの再エンコードなど)。

修正方法

  1. キーペアを確認し直します。 アクセスキーとシークレットを再生成するかコピーし直し、きれいに設定します(末尾の空白/改行に注意し、ツールが壊してしまう特殊文字をシークレットが含むなら再生成しましょう)。
  2. 時計を直します。 NTP を有効にしてホストの時刻を正確に保ちます:
    timedatectl status        # verify "System clock synchronized: yes"
  3. AWS SDK / CLI を優先します — リクエストの構築と署名を任せれば、正規リクエスト由来のバグはまるごと消えます。
  4. どうしても手で署名するなら、SigV4 の正規リクエストのルールを正確に守り(ソート済みヘッダー、URI エンコードされたパス、x-amz-date、ハッシュ化されたペイロード)、CLI の --debug 出力と比較してください。
  5. 正しく動くクライアントで アイデンティティが機能することを確認します:
    aws sts get-caller-identity

再現方法

本物のアクセスキー ID と、誤ったシークレットで署名します。リクエストのそれ以外はすべて有効なので、失敗の原因が署名に絞り込まれます。

import boto3
boto3.client(
    'dynamodb',
    region_name='us-east-1',
    aws_access_key_id='AKIA...',                      # a real key id
    aws_secret_access_key='deliberately-the-wrong-secret',
).list_tables()

実際の出力:

InvalidSignatureException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.
HTTP 400

クラスに注目してください。 メッセージはおなじみの「signature we calculated does not match」ですが、DynamoDB はこれを InvalidSignatureException として返します — ほかのいくつかの AWS サービスが同じ状況で使う SignatureDoesNotMatch ではありません。メッセージで照合するのではなくクラスでキャッチしているなら、その違いは、ハンドラが発火するかまったく発火しないかの分かれ目になります。

DynoTable で見る

DynoTable がリクエストを手で署名するよう求めることはありません — CLI と同じ AWS SDK の 認証情報チェーンを使います(AWS アカウントに接続する)。 aws sts get-caller-identity は成功するのに DynamoDB がこのエラーを投げ続けるなら、アプリと AWS のあいだにプロキシやミドルウェアがないかを確認してください。DynoTable は、間に何も挟まず あなたのマシンから直接 DynamoDB と通信します。キーや時計のずれを直したら、⌘P で 有効なプロファイルを確認し、テーブルを開き直す前に Settings → ProfilesTest Connection を実行しましょう。

関連するエラー

出典

最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。

2026-07-26 に us-east-1 の実稼働 DynamoDB サービスに対して再現しました — 上記の出力はそのままの逐語です。

Console なしで DynamoDB を扱う

DynamoDB では実行できない本物の SQL(JOINs、GROUP BY、集計)を実行する高速な DynamoDB デスクトップクライアント。ビジュアル編集と、あなた自身の Bedrock キーで動く AI エージェントを備えています。

30日間無料トライアル、クレジットカード不要 — その後は期限のない Free プラン。