DynamoDB IncompleteSignatureException

TL;DR — 請求的 AWS Signature Version 4 簽名不完整,或者不符合 AWS 標準,所以 DynamoDB 在認證之前就拒絕了它。如果你用的是 AWS SDK,簽名是自動的——這幾乎總是意味著請求是手工構造的,或者某個代理/閘道器在簽名之後弄壞了 Authorization 頭。讓 SDK 來簽名,並確保傳輸途中沒有東西重寫請求。

這是什麼意思

IncompleteSignatureException: The request signature does not conform to AWS standards.

AWS 用 SigV4 對每個請求籤名。這個異常意味著簽名存在,但格式有誤或缺少必需的組成部分——一個糟糕的 Authorization 頭、一個缺失的簽名頭,或者規範請求(canonical request)對不上。它是 HTTP 400,發生在用戶端,且原樣不可重試:簽名必須先改對。

為什麼會發生

  • 手寫簽名——你在自己(而不是透過 SDK)構造 SigV4 簽名,而規範請求、signed-headers 列表或 Authorization 頭寫錯了。
  • Authorization 頭格式有誤——文件記載的觸發條件是:頭為空、缺少 CredentialSignature 引數、頭沒有以演算法名(AWS4-HMAC-SHA256)開頭,或者某個 key=value 對少了等號。
  • 某個代理或 API 閘道器重寫了請求——在 SDK 簽名之後改動 Authorization 頭(或其他被簽名的部分),會讓 AWS 收到的頭與你發出的那個不同。
  • 手工編輯過頭部——簽名之後增刪頭部、或者重排查詢字串,都會破壞規範請求。

如何修正

  1. 使用官方 AWS SDK,讓它來簽名。這些 SDK 已經替你正確實現了 SigV4——對幾乎每一次發生來說,修復辦法就是別再手工簽名了。
  2. 簽名之後不要再改動請求——如果前面擋著一個代理/閘道器,要確保它不會新增、丟棄或重排頭部,也不會改動 body/路徑。在真正發出請求的那一端做簽名。
  3. 檢查 Authorization 頭在傳輸途中有沒有被改動——AWS 記載的診斷辦法:對你發出的那個頭計算 SHA-256 雜湊、做 Base64 編碼,再與某些 IncompleteSignatureException 訊息裡附帶的雜湊比對。如果不同,說明你的用戶端與 AWS 之間有東西改動了這個頭。
  4. 如果你必須手工簽名,就嚴格遵循 AWS SigV4 的簽名流程——規範請求、待簽字串、簽名金鑰推導,以及 Authorization 頭(演算法、Credential=SignedHeaders=Signature=)全都必須對上。拿一個已知正確的 SDK 請求來核對。

金鑰錯誤或被截斷是另一種故障:它產生的是一個_完整_但對不上的簽名,浮現出來是“signature we calculated does not match”,而不是這個錯誤。同樣地,機器時鐘偏移浮現出來是 Signature expired,而不是簽名不完整。

DynoTable + Local

DynoTable使用AWS SDK簽名路徑——沒有手工構建的SigV4——所以在正常使用中不會出現這個錯誤類。如果你的應用程式在 DynoTable 工作時命中它,請比較設定檔案:Settings → Profiles → Test Connection 與你的應用程式載入的相同鍵。對於本地,具有端點 http://localhost:8000 的設定檔案上的虛擬憑據完全繞過簽名。參見連線 AWS安裝。憑據解析後,在 Query Builder 中執行冒煙測試查詢。

來源

常見問題

什麼原因導致 IncompleteSignatureException? 請求中的 AWS SigV4 簽名格式錯誤或缺少所需部分 - 空的或格式錯誤的 Authorization 標頭、缺少 CredentialSignature 引數,或者不帶等號的鍵=值對。使用 AWS SDK 簽名是自動的,因此它通常意味著手動構建的簽名或在簽名後更改請求的代理。

這與 UnrecognizedClientException 有什麼不同? IncompleteSignatureException 意味著簽名本身格式錯誤。 UnrecognizedClientException(“安全令牌無效”)意味著簽名格式正確,但其背後的憑據未被接受。

重現方式

傳送一個存在但不可解析為 SigV4 的 Authorization 標頭:

import requests
requests.post(
    'https://dynamodb.us-east-1.amazonaws.com',
    headers={
        'X-Amz-Target': 'DynamoDB_20120810.ListTables',
        'Content-Type': 'application/x-amz-json-1.0',
        'Authorization': 'AWS4-HMAC-SHA256 this-is-not-a-valid-credential-scope',
    },
    data='{}',
)

實際輸出:

IncompleteSignatureException: Invalid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): 'nmoNS1XQjeE7XjC3Nzhi4KfIKrQZsBTlcf+/muyMgDs='.
HTTP 400

尾隨的 Base64 字串是你自己的標頭的雜湊值,因此它在每個請求上都不同 - 不匹配。該訊息告訴你的是結構性的:AWS可以讀取演算法,但不能讀取其後面的Credential=/SignedHeaders=/Signature=對。這表明標頭是如何組裝的,這就是為什麼標頭幾乎總是來自手動簽名而不是來自 SDK。

相關錯誤

參考資料

最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。

2026-07-26 針對 us-east-1 的實時 DynamoDB 服務復現——上方輸出為原樣照錄。

不必透過主控台就能操作 DynamoDB

一款快速的 DynamoDB 桌面用戶端,可執行 DynamoDB 無法執行的真正 SQL — JOINs、GROUP BY、聚合 — 並支援視覺化編輯與使用你自己的 Bedrock 金鑰的 AI 代理。

30 天免費試用,無需信用卡 — 之後為無時間限制的免費方案。