The security token included in the request is invalid
TL;DR — 你的 AWS 凭证错误、过期,或者 SDK 读到的是另一套你以为不是的凭证。刷新/核对访问密钥 + 密钥(用临时凭证的话还有会话令牌),并确认 SDK 实际用的是哪个 profile/来源。
含义
UnrecognizedClientException: The security token included in the request is invalid.AWS 在认证阶段就拒绝了你的凭证——还没轮到检查权限。这与 AccessDeniedException 不同,后者意味着凭证是_有效的_、只是缺少权限。这里是凭证本身没被接受。异常名称因工具而异:AWS CLI 把同一条消息挂在 InvalidClientTokenId 下,而 DynamoDB 的错误参考把它的 UnrecognizedClientException 条目措辞为 "The Access Key ID or security token is invalid."——它们都表示认证失败了。
为什么会发生
- 临时凭证过期——某个 STS/SSO 会话或扮演角色的令牌超时了,或者你有访问密钥却缺了必需的
AWS_SESSION_TOKEN。 - 密钥错误或不完整——拼写错误、被轮换/删除的访问密钥,或者设了
AWS_ACCESS_KEY_ID却没有配套的AWS_SECRET_ACCESS_KEY。 - 环境里残留着上一次会话的
AWS_SESSION_TOKEN。 - 拿真实凭证去打 DynamoDB Local(或者反过来)——Local 接受任何假密钥,但真实 endpoint 不会接受占位值。
- 机器上的时钟偏移大到足以让请求签名失效。
如何修复
- 验证凭证能用:
aws sts get-caller-identity。如果这条也失败,那问题在凭证,不在 DynamoDB。 - 刷新临时凭证——重新跑
aws sso login/ 重新扮演角色,并确保临时密钥配了AWS_SESSION_TOKEN。 - 清掉残留的环境变量——你 shell 里那个旧的
AWS_SESSION_TOKEN/AWS_ACCESS_KEY_ID会盖过你的 profile。把它们 unset 掉,或者设成正确的 profile(aws configure list会显示哪个来源胜出)。 - 对于 DynamoDB Local,用占位凭证并指向本地 endpoint:
const client = new DynamoDBClient({ region: 'local', endpoint: 'http://localhost:8000', credentials: {accessKeyId: 'local', secretAccessKey: 'local'} }); - 如果别的都看起来没问题,就检查机器时钟是否准确(有没有和 NTP 同步)。
在用 DynoTable 浏览?它在每次连接时都会重新解析你的 ~/.aws profile,所以重新登录或轮换密钥无需重启就能生效。
从 DynoTable
DynoTableresolves your ⟦0⟧ profile fresh on every connection,
因此无需重新启动即可重新登录、密钥轮换或清除环境变量该应用程序。按 ⌘P 查看哪个配置文件处于活动状态以及是否处于活动状态凭证点为绿色 — 红点表示 登录 (SSO) 或 重新连接
在任何表调用成功之前。对于 DynamoDB Local,添加带有端点的配置文件
http://localhost:8000 和字母数字占位符键(请参阅
Running DynamoDB Local);真实的 AWS 键与 Local
触发同样的错误。
常见问题
“请求中包含的安全令牌无效”是什么意思? AWS 在检查权限之前在身份验证时拒绝了你的凭据。密钥错误、轮换或不完整,临时会话令牌已过期或过时,或者 SDK 正在读取与你想象不同的凭证源。
如何调试无效的安全令牌?
运行 aws sts get-caller-identity — 如果也失败,则这是凭据,而不是 DynamoDB。刷新临时凭据(aws sso login或重新承担角色),确保为临时密钥设置AWS_SESSION_TOKEN,并清除覆盖你的配置文件的过时环境变量。
复现方法
这个不需要有效的凭据,也不需要本地引擎——身份验证在授权之前失败,因此真正的DynamoDB服务会回答一个故意伪造的密钥:
import boto3
boto3.client(
'dynamodb',
region_name='us-east-1',
aws_access_key_id='AKIAIOSFODNN7EXAMPLE',
aws_secret_access_key='wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY',
).list_tables()实际输出:
UnrecognizedClientException: The security token included in the request is invalid. [HTTP 400]结构错误的密钥 (not-a-key) 返回相同的消息,这是实际的陷阱:错误告诉你凭证被拒绝,而不是_为什么_。拼写错误、删除的访问密钥、来自错误帐户的密钥以及从未存在过的密钥都以相同的方式出现在此处。将其与 security token expired 进行比较,后者确实与众不同,并注意配对 — 线码为 UnrecognizedClientException,而消息谈论“安全令牌”,因此搜索消息并 grep 处理程序以查找类需要不同的字符串。
相关错误
- AccessDeniedException——凭证有效,缺少权限。
- 配置中缺少 region
- 学习:Running DynamoDB Local——用占位凭证打本地 endpoint。
来源
- Troubleshooting errors for the AWS CLI — AWS CLI User Guide(2026-07-13 验证)
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide(2026-07-13 验证)
- DynamoDB local usage notes — Amazon DynamoDB Developer Guide(2026-07-13 验证)
2026 年 7 月 26 日通过 boto3 1.43.56 针对 us-east-1 中的实时 DynamoDB 服务复制 — 上面的输出是逐字记录的。