Unable to locate credentials (boto3 / DynamoDB)
TL;DR — boto3/botocore 把它整條憑證 provider 鏈走了一遍——環境變數、共享的 ~/.aws/credentials、配置 profile、容器/例項角色——什麼都沒找到。沒有憑證就沒法給 DynamoDB 請求籤名。給這條鏈一個它能找到的憑證來源:aws configure、環境變數、一個 profile,或者一個 IAM 角色。
這是什麼意思
botocore.exceptions.NoCredentialsError: Unable to locate credentials在任何 DynamoDB 呼叫之前,SDK 都必須解析出一對訪問金鑰 + 金鑰,用來做 SigV4 簽名。這個錯誤就是在那一步丟擲的:沒有任何憑證 provider 返回過東西。它發生在請求發出之前——它不是許可權被拒(那會是 AccessDeniedException),而是壓根沒有身份。
為什麼會發生
- 根本沒配置憑證——從沒跑過
aws configure,也不存在~/.aws/credentials。 - 缺少環境變數——程序環境裡沒有設定
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY(在 cron 作業、容器、CI 裡很常見)。 - profile 錯誤或缺失——你引用了
--profile foo(或AWS_PROFILE=foo),但那個 profile 不在 credentials/config 檔案裡。 - 沒有例項/容器角色——在沒有附加 IAM 角色的 EC2/ECS/Lambda 上,後設資料 provider 什麼也不返回。
- 換了使用者的主目錄——以某個服務帳戶執行,而它的
~/.aws裡並沒有你編輯過的那個檔案。 - 臨時憑證方案下會話令牌過期或缺失。
如何修正
- 給本地開發配置一個 profile:
aws configure # writes ~/.aws/credentials + ~/.aws/config - 或者為這個程序設定環境變數:
export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... export AWS_DEFAULT_REGION=us-east-1 - 在 EC2/ECS/Lambda 上,附加一個 IAM 角色——SDK 會自動從例項/容器後設資料裡取到它;別把金鑰烤進去。
- 在跑你的程式碼之前,先驗證身份能解析出來:
aws sts get-caller-identity - 指向正確的 profile——給
boto3.Session(...)傳profile_name,或者設定AWS_PROFILE。 - 針對 DynamoDB Local,任何佔位金鑰都行——傳一對假的
aws_access_key_id/aws_secret_access_key,好讓這條鏈不為空。
在你程式碼之外做個快速的健全性檢查:DynoTable 用的是同一套 AWS profile 來連線——如果它能列出你的表,那說明憑證是存在的,問題在於你的程序讀的是哪個來源。
DynoTable + Local
DynoTable 解析憑據的方式與 CLI 相同 - 如果它已連線但 boto3 未連線,則你的程序正在讀取不同的主目錄或缺少 AWS_PROFILE。在“設定”→“設定檔案”下配置設定檔案並執行Test Connection;用 ⌘P 切換。對於本地,新增帶有虛擬金鑰和端點 http://localhost:8000 的設定檔案。參見連線 AWS和安裝。透過Query Builder中的測試查詢進行確認。
來源
- Credentials — Boto3 documentation(2026-07-13 驗證)
- Error handling — Boto3 documentation(2026-07-13 驗證)
常見問題
如何修復 boto3 中的“無法找到憑據”?
為憑證提供者鏈提供一些可查詢的內容:執行 aws configure 來寫入 ~/.aws/credentials,在程序環境中設定 AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY,或者在 EC2/ECS/Lambda 上附加 IAM 角色。然後用aws sts get-caller-identity驗證。
“無法找到憑據”與 AccessDeniedException 相同嗎? 不會。在傳送請求之前,會在本地引發 NoCredentialsError,因為沒有憑據提供程式返回任何內容。當有效身份缺乏該操作的 IAM 許可權時,AccessDeniedException 來自身份驗證後的AWS。
重現方式
呼叫 DynamoDB 時,鏈中任何位置都無法解析憑證 — 沒有環境變數、沒有共享憑證檔案、沒有設定檔案、沒有例項角色:
import boto3
boto3.client('dynamodb', region_name='us-east-1').list_tables()實際輸出:
NoCredentialsError: Unable to locate credentials該訊息非常簡潔:它沒有提及 boto3 所檢視過的任何地方。這就是這個錯誤的全部困難,也是為什麼按順序工作鏈——環境,然後共享檔案,然後設定檔案,然後角色——勝過猜測。
相關錯誤
- The security token included in the request is invalid——憑證找到了,但被 AWS 拒絕了。
- AccessDeniedException——身份有效,但這個操作缺少 IAM 許可權。
- 設定中缺少區域
- 學習:Running DynamoDB Local——用假憑證打本地 endpoint。
參考資料
- Credentials — Boto3 documentation
- Error handling — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。
2026-07-26 針對 boto3 1.43.56 / botocore 1.43.56 復現——上方輸出為原樣照錄。