Could not load credentials from any providers

TL;DR — AWS SDK for JavaScript v3 走遍了它的整条默认凭证链——环境变量、SSO、共享 config/credentials profile、web identity,以及容器/实例元数据端点——没有一个产出凭证。给这条链一个它能找到的来源(环境变量、aws configure、一个附加的角色),或者显式地把 credentials 传给客户端——对于 DynamoDB Local,这些反正应该是虚拟值。

含义

CredentialsProviderError: Could not load credentials from any providers

每个 DynamoDB 请求都必须经过 SigV4 签名,因此在第一次调用之前,SDK 会通过它的提供者链解析凭证。这个错误就是这条链的"什么都没找到"的结果——它在任何到 DynamoDB 的网络调用之前触发,是 boto3 的 Unable to locate credentials 的 JS v3 等价物。它不是权限问题(那会是 AccessDeniedException)——根本没有任何身份。

为什么会发生

  • 任何地方都没有配置凭证——环境中没有 AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY,没有 ~/.aws/credentials,没有角色。
  • [default] profile 不存在——你只有命名的 profile,但没有设置 AWS_PROFILE,因此链去找 [default] 却什么都没找到。
  • 进程看不到你 shell 的环境——一个服务管理器、cron 任务、容器或 IDE 启动,没有继承你导出的变量。
  • 运行时中没有附加角色——一个没有预期 IAM 角色的 ECS 任务、EC2 实例或 Lambda,因此元数据提供者返回空。
  • 高负载下的间歇性问题:IMDS 限流——高并发工作负载猛烈请求 EC2 实例元数据服务,会导致凭证获取偶发失败(这个错误"随机"出现的一个已知原因)。
  • 没有身份来源的浏览器代码——前端调用需要 Cognito Identity Pool(或类似)凭证;浏览器中没有环境凭证链。

如何修复

  1. 选定一个凭证来源并端到端地验证它。 最快的检查:在运行你代码的_同一个_环境(同一用户、同一容器)中执行 aws sts get-caller-identity

  2. 本地开发: aws configure(写入 [default]),或者当你只用命名 profile 时设置 AWS_PROFILE=myprofile

  3. DynamoDB Local / LocalStack: 别依赖这条链——把显式的虚拟凭证与端点一起传入:

    import {DynamoDBClient} from '@aws-sdk/client-dynamodb';
    
    const client = new DynamoDBClient({
      region: 'local',
      endpoint: 'http://localhost:8000',
      credentials: {accessKeyId: 'local', secretAccessKey: 'local'}
    });
  4. 在 AWS 运行时中,附加角色——EC2 上的实例配置文件、ECS/Fargate 上的任务角色、Lambda 上的执行角色——而不是分发密钥。

  5. 在 EC2 上高并发时,只创建一次客户端(模块作用域),让凭证被解析并缓存,而非每个请求重新获取;SDK 重试加上一个共享客户端可以吸收 IMDS 的抖动。

  6. 不要混用 SDK v2 和 v3 的凭证设置——为你代码实际导入的那个 SDK 做配置。

一旦凭证解析成功,浏览数据是确认整条流水线的最快方式——DynoTable 桌面应用用你的 AWS profile(以及 DynamoDB Local)连接并立即显示你的表。在组合第一个查询?从 DynamoDB Expression Builder 开始。

相关错误

References

最后核实于 2026-07-13,依据上方链接的 AWS 官方文档。

无需控制台即可使用 DynamoDB

DynoTable 是面向 DynamoDB 的快速桌面客户端 —— 浏览表、运行 SQL 风格的查询,并在本地编辑项。