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 权限。
- 配置中缺少 region
- 学习: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 复现——上方输出为原样照录。