You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Boto3向SNS主题发消息报错:请求中包含的安全令牌无效

排查解决步骤

1. 排查凭证优先级覆盖问题

Boto3会按固定优先级读取凭证,更新全局配置文件后仍报错,大概率是存在更高优先级的旧凭证生效:

  • 检查系统环境变量:执行 echo $AWS_ACCESS_KEY_ID、echo $AWS_SECRET_ACCESS_KEY、echo $AWS_SESSION_TOKEN,如果有输出说明环境变量中存储了旧凭证,执行unset命令清空对应变量即可
  • 检查项目本地凭证:确认当前Python项目目录下是否存在.aws/credentials文件,该文件优先级高于全局~/.aws/credentials配置
  • 检查代码硬编码配置:确认代码中没有硬编码旧凭证,也没有显式指定错误的AWS配置profile名称

2. 验证当前生效凭证

运行以下代码确认Boto3实际读取到的凭证和你新生成的一致:

import boto3
session = boto3.Session()
current_cred = session.get_credentials()
print(f"当前生效Access Key: {current_cred.access_key}")
print(f"当前生效Secret Key: {current_cred.secret_key}")

如果输出的凭证和你新生成的不一致,按上一步的优先级顺序逐一排查旧凭证的存储位置即可。

3. 排查凭证本身有效性

  • 确认你生成的是IAM用户的长期访问凭证,不是临时角色生成的短期过期凭证
  • 登录AWS控制台确认对应IAM用户的访问密钥状态为「启用」,没有被禁用
  • 确认你的AWS账号没有处于欠费、受限等异常状态
  • 如果你使用的是组织子账号,确认组织没有设置限制IAM用户访问权限的策略

4. 无需主动调用GetSessionToken的场景

普通IAM用户的长期凭证默认有权限调用SNS发布消息接口,不需要主动获取会话令牌,只有MFA校验、跨账号角色切换等场景才需要调用GetSessionToken,凭证确认正确后可以直接运行以下代码测试:

import boto3
sns_client = boto3.client('sns', region_name='替换为你的SNS主题所在区域')
resp = sns_client.publish(
    TopicArn='替换为你的SNS主题ARN',
    Message='测试消息'
)
print(resp)

内容的提问来源于stack exchange,提问作者Wilveren

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 09:36:02