Node.js部署EC2连接DynamoDB报CredentialsProviderError如何解决?
问题原因
- 混用AWS SDK v2和v3的配置逻辑:你代码中用
AWS.config.loadFromPath('./config.json')是AWS SDK v2的配置方法,仅对v2的客户端生效。报错栈所有错误都来自@aws-sdk/开头的v3模块,说明业务逻辑中使用了v3的相关能力,v3的默认凭证链无法读取v2的配置,找不到凭证就抛出该错误。 - config.json路径读取失败:你用的
./config.json是相对Node进程启动的工作目录的路径,若EC2上启动服务时的工作目录不是项目根目录,就会找不到配置文件,导致v2的配置也加载失败。 - 跨平台node_modules兼容问题:直接将Mac环境下安装的node_modules上传到CentOS运行,部分带原生二进制的依赖存在平台兼容问题,可能导致配置读取逻辑异常。
修复方案
方案1:统一使用AWS SDK v2能力(快速修复)
如果你只需要用到marshall/unmarshall转换工具,不需要v3的其他能力,可以直接使用v2自带的工具,不需要引入v3的依赖:
- 替换导入语句:
// 删除原有的 const { marshall,unmarshall } = require("@aws-sdk/util-dynamodb"); const { marshall, unmarshall } = require('aws-sdk/util-dynamodb');
- 删除项目中的node_modules目录,在EC2环境下重新执行
npm install安装依赖,不要直接上传本地的node_modules。
方案2:给AWS SDK v3补充配置
如果你确实需要使用v3的相关能力,给v3单独配置凭证:
- 首先修正配置文件读取路径,避免工作目录差异导致的读取失败:
const path = require('path'); const awsConfig = require(path.join(__dirname, './config.json')); // 原有v2配置也改成绝对路径读取 AWS.config.loadFromPath(path.join(__dirname, './config.json'));
- 初始化v3客户端时传入配置:
const { DynamoDB } = require('@aws-sdk/client-dynamodb'); const ddb = new DynamoDB({ region: awsConfig.region, credentials: { accessKeyId: awsConfig.accessKeyId, secretAccessKey: awsConfig.secretAccessKey } });
方案3:EC2环境最优实践(推荐)
EC2上部署不建议硬编码密钥,你可以给EC2实例绑定具备DynamoDB操作权限的IAM角色,AWS SDK的默认凭证链会自动读取实例角色的凭证,不需要再维护config.json里的敏感凭证信息,同时彻底避免凭证泄露风险。
额外检查项
- 确认EC2上config.json的文件权限,确保运行Node进程的用户有读取权限,可执行
chmod 644 config.json修正权限。 - 检查Node进程启动的工作目录,确保和本地测试时的目录结构一致。
内容的提问来源于stack exchange,提问作者sd1sd1
相关产品推荐
相关产品推荐

