Boto3获取的Token与EC2元数据Token不一致的原因咨询
为什么EC2元数据Token与Boto3获取的Token不一致?
核心原因是Botocore(Boto3的底层依赖库)的本地凭证缓存机制,具体细节如下:
- 凭证缓存策略:当Boto3首次从EC2元数据服务获取IAM角色的临时凭证(包含STS Token)后,会将这些凭证缓存到本地文件系统(默认路径如
/tmp/awscli/cache或~/.aws/cli/cache),缓存时长等于凭证的剩余有效期(IAM角色临时凭证默认有效期为1小时)。 - 缓存优先逻辑:后续调用
boto3.Session().get_credentials().token时,Boto3会优先读取本地缓存的凭证,而不会直接请求元数据服务,除非缓存的凭证已过期或即将过期(默认提前5分钟触发刷新)。 - 元数据服务的凭证刷新:EC2元数据服务会自动定期刷新IAM角色的临时凭证(每小时一次),但你通过
curl直接访问元数据服务时,拿到的是实时的最新凭证。如果在Boto3缓存凭证之后,元数据服务已刷新了凭证,但Boto3的缓存尚未过期,就会出现curl获取的Token与Boto3返回的Token不一致的情况——此时Boto3用的是缓存中的旧Token,而curl拿到的是元数据服务中的新Token。
额外补充:你移除IAM角色后Boto3无法获取凭证,证明Boto3确实依赖EC2元数据服务获取初始凭证,但后续的凭证使用完全依赖本地缓存,直到缓存过期才会重新请求元数据服务。
内容的提问来源于stack exchange,提问作者Old-Equipment-8361
相关产品推荐
相关产品推荐

