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頭格式有誤——文件記載的觸發條件是:頭為空、缺少Credential或Signature引數、頭沒有以演算法名(AWS4-HMAC-SHA256)開頭,或者某個 key=value 對少了等號。- 某個代理或 API 閘道器重寫了請求——在 SDK 簽名之後改動
Authorization頭(或其他被簽名的部分),會讓 AWS 收到的頭與你發出的那個不同。 - 手工編輯過頭部——簽名之後增刪頭部、或者重排查詢字串,都會破壞規範請求。
如何修正
- 使用官方 AWS SDK,讓它來簽名。這些 SDK 已經替你正確實現了 SigV4——對幾乎每一次發生來說,修復辦法就是別再手工簽名了。
- 簽名之後不要再改動請求——如果前面擋著一個代理/閘道器,要確保它不會新增、丟棄或重排頭部,也不會改動 body/路徑。在真正發出請求的那一端做簽名。
- 檢查
Authorization頭在傳輸途中有沒有被改動——AWS 記載的診斷辦法:對你發出的那個頭計算 SHA-256 雜湊、做 Base64 編碼,再與某些IncompleteSignatureException訊息裡附帶的雜湊比對。如果不同,說明你的用戶端與 AWS 之間有東西改動了這個頭。 - 如果你必須手工簽名,就嚴格遵循 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 中執行冒煙測試查詢。
來源
- Error handling with DynamoDB — IncompleteSignatureException(2026-07-13 驗證)
- Troubleshoot Signature Version 4 signing(2026-07-13 驗證)
常見問題
什麼原因導致 IncompleteSignatureException?
請求中的 AWS SigV4 簽名格式錯誤或缺少所需部分 - 空的或格式錯誤的 Authorization 標頭、缺少 Credential 或 Signature 引數,或者不帶等號的鍵=值對。使用 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。
相關錯誤
- The request signature we calculated does not match——一個完整但錯誤的簽名(金鑰錯誤或規範化有誤)。
- The security token included in the request is invalid——簽名格式正確,憑證不對。
- The security token included in the request is expired——臨時憑證過期了。
- 設定中缺少區域
參考資料
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide (IncompleteSignatureException message, HTTP 400, not retryable)
- Troubleshoot Signature Version 4 signing for AWS API requests — IAM User Guide (Authorization-header errors and the hash-comparison diagnostic)
- Create a signed AWS API request — IAM User Guide (the SigV4 signing process)
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。
2026-07-26 針對 us-east-1 的實時 DynamoDB 服務復現——上方輸出為原樣照錄。