必须使用mongodb-aws认证机制且连接字符串中不得含user/password参数,否则驱动忽略环境变量和实例角色、atlas拒绝连接;需显式指定authmechanism=mongodb-aws,并在atlas后台add new database user授权对应iam arn。

必须用 MONGODB-AWS 认证机制,且连接字符串里不能带 user 和 password 参数——否则驱动会忽略环境变量和实例角色,Atlas 也会直接拒绝连接并返回 AuthenticationFailed 错误。
连接字符串必须显式指定 authMechanism=MONGODB-AWS
Node.js 驱动(7.0+)默认不启用 MONGODB-AWS,哪怕你已配置好 IAM 凭证,漏掉这个参数就会 fallback 到 SCRAM-SHA-1,然后因无密码报错。
- 正确写法:
mongodb+srv://cluster0.mongodb.net/?authMechanism=MONGODB-AWS - 错误写法:
mongodb+srv://user:pass@cluster0.mongodb.net/...—— 即使user是空或占位符,也会触发弃用路径,并在日志中输出DEPRECATION WARNING: MONGODB-AWS credentials in URI are deprecated - 如果用了
mongodb://原生协议(非 SRV),也要加&authMechanism=MONGODB-AWS,不能只靠环境变量“猜”
凭证加载顺序决定你该配什么
Node.js 驱动按固定优先级查凭证:环境变量 → ~/.aws/credentials → EC2/EKS 元数据服务。你只需确保其中**一个来源有效**,MongoClient 就能自动构造签名;但顺序错了就静默失败。
- EC2 实例上:确认能 curl 到
http://169.254.169.254/latest/meta-data/iam/security-credentials/,且实例角色绑定了对 Atlas 数据库的访问权限 - EKS 中用 IRSA:ServiceAccount 必须带
eks.amazonaws.com/role-arn注解,且挂载了aws-iam-tokenvolume - 本地开发:设
AWS_PROFILE=atlas-dev,并在~/.aws/credentials里定义该 profile;别用default,否则容易和 CI/其他工具冲突 - 环境变量方式:只设
AWS_ROLE_ARN不够,还得有可访问的AssumeRole权限,否则aws4库会 fallback 到空凭证,报Missing credentials in config
Atlas 后台必须手动授权该 AWS 身份
代码连得通 ≠ 能读写数据。即使凭证加载成功、连接建立,Atlas 仍会返回 Unauthorized 或 Access denied for user,因为项目级权限没开。
- 登录 Atlas 控制台 → 进入对应 Project → Access Manager → Add New Database User
- Authentication Method 选
Amazon Web Services (AWS) Identity and Access Management (IAM) - 在
AWS IAM Role ARN或AWS IAM User ARN字段填入你实际使用的 ARN(例如arn:aws:iam::123456789012:role/atlas-connector) - Assign Privileges:至少给
readWriteAnyDatabase(测试用)或按最小权限原则绑定具体数据库角色
最容易被忽略的是 Atlas 后台那一步授权——很多人反复检查代码和环境变量,却卡在没进 Access Manager 点那个 “Add New Database User”。另外,authMechanismProperties 在 MONGODB-AWS 下不需要设置,加了反而可能干扰签名流程。











