Node.js AWS客户端调用Kinesis PutRecord时提示无效安全令牌问题
你遇到的这个UnrecognizedClientException: The security token included in the request is invalid错误,哪怕你确认凭证有效,也大概率是凭证加载或者配置的细节问题——我之前踩过类似的坑,整理了几个靠谱的排查和修复步骤:
先确认SDK实际加载的凭证是哪一套
AWS SDK for Node.js会按固定优先级加载凭证:环境变量 > 本地共享凭证文件(~/.aws/credentials) > 服务器IAM角色(如果在ECS/EKS/EC2上)。很多时候我们以为用的是A凭证,结果SDK偷偷加载了B凭证(比如环境变量里的旧凭证没清)。可以加一段调试代码打印当前凭证:const AWS = require('aws-sdk'); AWS.config.getCredentials(function(err) { if (err) console.log(err.stack); else { console.log("当前使用的Access Key:", AWS.config.credentials.accessKeyId); // 如果是临时凭证,一定要检查sessionToken if (AWS.config.credentials.sessionToken) { console.log("当前Session Token:", AWS.config.credentials.sessionToken); } } });对比输出和你认为有效的凭证是否一致。
检查临时凭证是否过期
如果用的是STS生成的临时IAM凭证,这类凭证有有效期(默认1小时,最长12小时),过期后直接触发这个错误。可以打印过期时间确认:console.log("凭证过期时间:", AWS.config.credentials.expiration);要是过期了,重新调用STS接口获取新凭证就行。
核对Kinesis流的区域配置
区域不匹配也是常见坑!哪怕凭证是对的,但SDK配置的Kinesis区域和流实际所在区域不一样,服务端会直接判定凭证无效。确认客户端区域和流的区域一致:const kinesis = new AWS.Kinesis({ region: 'us-east-1' // 替换成你的流所在的实际区域,比如ap-southeast-1 });检查本地凭证文件的格式
如果用的是~/.aws/credentials文件,确保格式没有问题——比如多余的空格、引号,或者profile名称写错。正确格式应该是:[default] aws_access_key_id = 你的AK aws_secret_access_key = 你的SK # 如果用自定义profile [my-kinesis-profile] aws_access_key_id = 你的AK aws_secret_access_key = 你的SK要是指定了profile,代码里要明确加载:
AWS.config.profile = 'my-kinesis-profile';再确认IAM权限的细节
虽然你说凭证有效,但还是要再核对对应的IAM用户/角色有没有kinesis:PutRecord或kinesis:PutRecords权限,并且策略里的资源要包含你要写入的Kinesis流ARN。比如一个合规的权限策略片段:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["kinesis:PutRecord"], "Resource": "arn:aws:kinesis:us-east-1:123456789012:stream/你的流名称" } ] }清理SDK的凭证缓存
AWS SDK会自动缓存凭证,有时候旧的无效凭证被缓存了,哪怕你更新了凭证也会继续用。可以强制刷新凭证:AWS.config.credentials.refresh((err) => { if (err) console.error("刷新凭证失败:", err); else console.log("凭证已成功刷新"); });
内容的提问来源于stack exchange,提问作者ram

