Node.js调用AWS SES发邮件报Missing credentials in config错误
Missing credentials in config报错的核心触发原因是AWS SDK凭证配置字段名拼写错误:代码中配置项写的是accessSecretKey,但AWS JavaScript SDK(v2/v3版本均是)识别的秘密访问密钥字段名为secretAccessKey,SDK读取配置时找不到对应密钥字段,就会抛出凭证缺失的错误。
除此之外原有代码还存在全局配置可能不生效、async/await和Promise链式调用混用的问题,会进一步提升配置不生效的概率。
修正方案
1. 修正配置字段+实例初始化逻辑
不要依赖AWS.config.update全局配置,初始化SES服务实例时直接传入配置项,同时修正字段名错误,参考代码如下:
const AWS = require('aws-sdk'); exports.sendEmail = async () => { const SESConfig = { accessKeyId: "你的AWS访问密钥ID", secretAccessKey: "你的AWS秘密访问密钥", // 注意:原代码的accessSecretKey是错误字段名 region: "us-east-1", apiVersion: "2010-12-01" } const sendParams = { Destination: { ToAddresses: ["xxx@xxx.xxx"] }, Message: { Body: { Text: { Charset: "UTF-8", Data: "你的邮件正文内容" } }, Subject: { Charset: "UTF-8", Data: "Test email" } }, Source: "xxx@xxx.xxx" // 已验证的发件人邮箱 }; try { // 初始化实例时直接传入配置,避免全局配置异步加载不生效 const sesClient = new AWS.SES(SESConfig); const result = await sesClient.sendEmail(sendParams).promise(); console.log('邮件发送成功,MessageId:', result.MessageId); return result; } catch (err) { console.error('邮件发送失败:', err, err.stack); throw err; } };
2. 其他排查项(修正字段后仍报错时按顺序检查)
- 确认使用的AK/SK为有效状态:密钥没有被删除、禁用,且绑定的IAM身份策略已授予
ses:SendEmail、ses:SendRawEmail权限,同时确认你的SES账号如果还在沙箱模式下,收件人也必须是已验证的邮箱(当前用同个已验证邮箱作为收发件人符合沙箱要求)。 - 本地开发环境推荐不用硬编码凭证:在本地
~/.aws/credentials文件配置好AK/SK和区域,然后设置系统环境变量AWS_SDK_LOAD_CONFIG=1,SDK会自动读取本地凭证文件,代码里不需要写任何密钥配置,避免硬编码泄漏风险。 - 部署到AWS云资源(Lambda/EC2/ECS/EKS)时,不要硬编码AK/SK:直接给运行资源绑定对应SES权限的IAM角色,SDK会自动获取临时安全凭证,无需手动配置任何密钥字段。
- 如果使用的是AWS SDK v3版本,需要安装
@aws-sdk/client-ses依赖包,初始化方式和v2有差异,但凭证字段名依然是secretAccessKey,不存在accessSecretKey这个配置字段。
内容的提问来源于stack exchange,提问作者Vivek Modi
相关产品推荐
相关产品推荐

