The security token included in the request is invalid
TL;DR — 你的 AWS 憑證錯誤、過期,或者 SDK 讀到的是另一套你以為不是的憑證。重新整理/核對訪問金鑰 + 金鑰(用臨時憑證的話還有會話令牌),並確認 SDK 實際用的是哪個 profile/來源。
這是什麼意思
UnrecognizedClientException: The security token included in the request is invalid.AWS 在認證階段就拒絕了你的憑證——還沒輪到檢查許可權。這與 AccessDeniedException 不同,後者意味著憑證是_有效的_、只是缺少許可權。這裡是憑證本身沒被接受。異常名稱因工具而異:AWS CLI 把同一條訊息掛在 InvalidClientTokenId 下,而 DynamoDB 的錯誤參考把它的 UnrecognizedClientException 條目措辭為 "The Access Key ID or security token is invalid."——它們都表示認證失敗了。
為什麼會發生
- 臨時憑證過期——某個 STS/SSO 會話或扮演角色的令牌超時了,或者你有訪問金鑰卻缺了必需的
AWS_SESSION_TOKEN。 - 金鑰錯誤或不完整——拼寫錯誤、被輪換/刪除的訪問金鑰,或者設了
AWS_ACCESS_KEY_ID卻沒有配套的AWS_SECRET_ACCESS_KEY。 - 環境裡殘留著上一次會話的
AWS_SESSION_TOKEN。 - 拿真實憑證去打 DynamoDB Local(或者反過來)——Local 接受任何假金鑰,但真實 endpoint 不會接受佔位值。
- 機器上的時鐘偏移大到足以讓請求籤名失效。
如何修正
- 驗證憑證能用:
aws sts get-caller-identity。如果這條也失敗,那問題在憑證,不在 DynamoDB。 - 重新整理臨時憑證——重新跑
aws sso login/ 重新扮演角色,並確保臨時金鑰配了AWS_SESSION_TOKEN。 - 清掉殘留的環境變數——你 shell 裡那個舊的
AWS_SESSION_TOKEN/AWS_ACCESS_KEY_ID會蓋過你的 profile。把它們 unset 掉,或者設成正確的 profile(aws configure list會顯示哪個來源勝出)。 - 對於 DynamoDB Local,用佔位憑證並指向本地 endpoint:
const client = new DynamoDBClient({ region: 'local', endpoint: 'http://localhost:8000', credentials: {accessKeyId: 'local', secretAccessKey: 'local'} }); - 如果別的都看起來沒問題,就檢查機器時鐘是否準確(有沒有和 NTP 同步)。
在用 DynoTable 瀏覽?它在每次連線時都會重新解析你的 ~/.aws profile,所以重新登入或輪換金鑰無需重啟就能生效。
從 DynoTable
DynoTableresolves your ⟦0⟧ profile fresh on every connection,
因此無需重新啟動即可重新登入、金鑰輪換或清除環境變數該應用程式。按 ⌘P 檢視哪個設定檔案處於活動狀態以及是否處於活動狀態憑證點為綠色 — 紅點表示 登入 (SSO) 或 重新連線
在任何表呼叫成功之前。對於 DynamoDB Local,新增帶有端點的設定檔案
http://localhost:8000 和字母數字預留位置鍵(請參閱
Running DynamoDB Local);真實的 AWS 鍵與 Local
觸發同樣的錯誤。
常見問題
“請求中包含的安全令牌無效”是什麼意思? AWS 在檢查許可權之前在身份驗證時拒絕了你的憑據。金鑰錯誤、輪換或不完整,臨時會話令牌已過期或過時,或者 SDK 正在讀取與你想象不同的憑證源。
如何除錯無效的安全令牌?
執行 aws sts get-caller-identity — 如果也失敗,則這是憑據,而不是 DynamoDB。重新整理臨時憑據(aws sso login或重新承擔角色),確保為臨時金鑰設定AWS_SESSION_TOKEN,並清除覆蓋你的設定檔案的過時環境變數。
重現方式
這個不需要有效的憑據,也不需要本地引擎——身份驗證在授權之前失敗,因此真正的DynamoDB服務會回答一個故意偽造的金鑰:
import boto3
boto3.client(
'dynamodb',
region_name='us-east-1',
aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
).list_tables()實際輸出:
UnrecognizedClientException: The security token included in the request is invalid. [HTTP 400]結構錯誤的金鑰 (not-a-key) 返回相同的訊息,這是實際的陷阱:錯誤告訴你憑證被拒絕,而不是_為什麼_。拼寫錯誤、刪除的訪問金鑰、來自錯誤帳戶的金鑰以及從未存在過的金鑰都以相同的方式出現在此處。將其與 security token expired 進行比較,後者確實與眾不同,並注意配對 — 線碼為 UnrecognizedClientException,而訊息談論“安全令牌”,因此搜尋訊息並 grep 處理程式以查詢類需要不同的字串。
相關錯誤
- AccessDeniedException——憑證有效,缺少許可權。
- 設定中缺少區域
- 學習:Running DynamoDB Local——用佔位憑證打本地 endpoint。
來源
- Troubleshooting errors for the AWS CLI — AWS CLI User Guide(2026-07-13 驗證)
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide(2026-07-13 驗證)
- DynamoDB local usage notes — Amazon DynamoDB Developer Guide(2026-07-13 驗證)
2026 年 7 月 26 日透過 boto3 1.43.56 針對 us-east-1 中的實時 DynamoDB 服務複製 — 上面的輸出是逐字記錄的。