boto3 SSO令牌早于AWS CLI过期问题求助
你的问题核心在于旧版本botocore(boto3依赖的底层库)的SSO凭证处理逻辑存在缺陷,与AWS CLI的实现不一致:
版本差异导致功能缺失
你使用的boto3 1.21.46对应的botocore版本较旧,而AWS CLI 2.4.27内置的botocore版本更新。旧版botocore的SSOCredentials组件不会自动刷新短期角色凭证——第一次通过boto3获取角色凭证后,它只会缓存这个有效期通常为1小时的短期凭证,到期后不会自动用仍有效的SSO主令牌去AWS SSO服务重新请求新的角色凭证;而AWS CLI会在角色凭证过期时自动触发刷新流程,只要SSO主令牌未过期就能继续使用。缓存处理逻辑不一致
旧版botocore仅读取~/.aws/sso/cache中的SSO主令牌,但不会主动检查角色凭证的过期状态并重新获取;而AWS CLI会同时管理SSO主令牌和角色凭证的缓存,在角色凭证过期时自动调用GetRoleCredentials接口刷新。
升级boto3和botocore到最新稳定版
这是最彻底的解决方法,AWS在后续版本中修复了SSO凭证自动刷新的问题。执行以下命令升级:pip install --upgrade boto3 botocore建议升级到1.26.0及以上版本,这些版本完全兼容AWS CLI的SSO缓存逻辑,会自动处理角色凭证的刷新。
临时修复(无法升级版本时)
如果无法升级依赖,可以在代码中捕获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())验证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

