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 agent。

30 天免费试用,无需信用卡 — 之后为无时间限制的免费版。