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 裡並沒有你編輯過的那個檔案。
  • 臨時憑證方案下會話令牌過期或缺失

如何修正

  1. 給本地開發配置一個 profile
    aws configure     # writes ~/.aws/credentials + ~/.aws/config
  2. 或者為這個程序設定環境變數
    export AWS_ACCESS_KEY_ID=...
    export AWS_SECRET_ACCESS_KEY=...
    export AWS_DEFAULT_REGION=us-east-1
  3. 在 EC2/ECS/Lambda 上,附加一個 IAM 角色——SDK 會自動從例項/容器後設資料裡取到它;別把金鑰烤進去。
  4. 在跑你的程式碼之前,先驗證身份能解析出來
    aws sts get-caller-identity
  5. 指向正確的 profile——給 boto3.Session(...)profile_name,或者設定 AWS_PROFILE
  6. 針對 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中的測試查詢進行確認。

來源

常見問題

如何修復 boto3 中的“無法找到憑據”? 為憑證提供者鏈提供一些可查詢的內容:執行 aws configure 來寫入 ~/.aws/credentials,在程序環境中設定 AWS_ACCESS_KEY_IDAWS_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 所檢視過的任何地方。這就是這個錯誤的全部困難,也是為什麼按順序工作鏈——環境,然後共享檔案,然後設定檔案,然後角色——勝過猜測。

相關錯誤

參考資料

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

2026-07-26 針對 boto3 1.43.56 / botocore 1.43.56 復現——上方輸出為原樣照錄。

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

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

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