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

boto3 SSO令牌早于AWS CLI过期问题求助

问题原因分析

你的问题核心在于旧版本botocore(boto3依赖的底层库)的SSO凭证处理逻辑存在缺陷,与AWS CLI的实现不一致:

  1. 版本差异导致功能缺失
    你使用的boto3 1.21.46对应的botocore版本较旧,而AWS CLI 2.4.27内置的botocore版本更新。旧版botocore的SSOCredentials组件不会自动刷新短期角色凭证——第一次通过boto3获取角色凭证后,它只会缓存这个有效期通常为1小时的短期凭证,到期后不会自动用仍有效的SSO主令牌去AWS SSO服务重新请求新的角色凭证;而AWS CLI会在角色凭证过期时自动触发刷新流程,只要SSO主令牌未过期就能继续使用。

  2. 缓存处理逻辑不一致
    旧版botocore仅读取~/.aws/sso/cache中的SSO主令牌,但不会主动检查角色凭证的过期状态并重新获取;而AWS CLI会同时管理SSO主令牌和角色凭证的缓存,在角色凭证过期时自动调用GetRoleCredentials接口刷新。

解决方案
  1. 升级boto3和botocore到最新稳定版
    这是最彻底的解决方法,AWS在后续版本中修复了SSO凭证自动刷新的问题。执行以下命令升级:

    pip install --upgrade boto3 botocore
    

    建议升级到1.26.0及以上版本,这些版本完全兼容AWS CLI的SSO缓存逻辑,会自动处理角色凭证的刷新。

  2. 临时修复(无法升级版本时)
    如果无法升级依赖,可以在代码中捕获UnauthorizedSSOTokenError,手动触发凭证刷新:

    import boto3
    from botocore.exceptions import UnauthorizedSSOTokenError
    
    def get_valid_session(profile_name):
        try:
            session = boto3.Session(profile_name=profile_name)
            # 验证凭证有效性
            sts = session.client('sts')
            sts.get_caller_identity()
            return session
        except UnauthorizedSSOTokenError:
            # 清除botocore的本地缓存,重新创建会话
            from botocore.credentials import JSONFileCache
            cache = JSONFileCache()
            cache.delete(f'sso_role_credentials_{profile_name}')
            return boto3.Session(profile_name=profile_name)
    
    session = get_valid_session('RoleA')
    sts = session.client('sts')
    print(sts.get_caller_identity())
    
  3. 验证SSO配置
    确保~/.aws/config中的SSO配置包含合理的role_session_duration(可选,默认1小时),示例:

    [profile RoleA]
    sso_start_url = https://your-sso-url.awsapps.com/start
    sso_region = us-east-1
    sso_account_id = 123456789012
    sso_role_name = RoleA
    role_session_duration = 3600
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 17:15:40