使用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
相关产品推荐
相关产品推荐

