EC2上微服务Pod偶发AWS安全令牌过期问题排查求助
问题:EC2上微服务Pod不定期出现AWS临时令牌过期错误
我们有部分部署在EC2实例上的微服务Pod可正常运行,但部分Pod在连接DynamoDB和SNS时,会不定期出现The security token included in the request is expired错误,同一微服务连接Aurora数据库却无此异常。
这些Pod出现问题后,通常几分钟内会自行恢复,重启Pod也可立即恢复正常。
已尝试的方案
我们尝试为SNS客户端配置重试策略:
RetryPolicy retryPolicy = new RetryPolicy(PredefinedRetryPolicies.DEFAULT_RETRY_CONDITION, PredefinedRetryPolicies.DEFAULT_BACKOFF_STRATEGY, MAX_RETRY_COUNT_AWS_TOKEN_EXPIRED, true); ClientConfiguration clientConfiguration = new ClientConfiguration().withRetryPolicy(retryPolicy); return AmazonSNSClientBuilder.standard().withClientConfiguration(clientConfiguration).build();
同时,在捕获令牌过期异常时,重新执行上述代码实例化SNS客户端,期望获取带有新安全令牌的客户端,但该方法无效。
根据AWS SDK文档,EC2的IAM角色通过实例元数据服务(IMDS)在临时凭证过期前获取新的STS令牌,但该机制有时失效。
核心问题
- 该问题的可能原因是什么?
- 如何调试EC2实例元数据服务调用AWS是否失败?CloudTrail未记录相关信息。
- 我们环境有时存在DNS解析问题,这是否会引发该问题?EC2实例元数据服务获取STS令牌是否依赖DNS解析?
当前95%的Pod运行正常,每周约5%的Pod会出现该问题并持续数分钟,恳请提供解决方案建议。
解决方案建议
- 检查IMDS的可用性与凭证状态:在出现问题的Pod所在EC2实例上,执行
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/[你的IAM角色名],查看返回的凭证Expiration字段是否正常,以及请求是否能快速响应。如果IMDS超时或返回异常,说明宿主机网络或IMDS服务存在问题。 - 升级AWS SDK并使用默认凭证链:确保使用的AWS Java SDK为最新稳定版,旧版本可能存在凭证刷新逻辑的bug。推荐使用
DefaultAWSCredentialsProviderChain自动处理凭证获取与刷新,无需手动构建客户端策略;若必须自定义客户端,避免长期持有单例客户端实例,每次请求前确保获取最新凭证。 - 排查DNS与网络连通性:EC2实例元数据服务使用链路本地地址
169.254.169.254,不依赖DNS解析。但如果Pod内的网络规则(如iptables)拦截了该地址的请求,或Pod的网络栈异常导致无法访问该地址,会影响凭证获取。可在有问题的Pod内执行ping 169.254.169.254或curl上述IMDS端点验证连通性。 - 切换到IMDSv2并调整会话超时:IMDSv1存在会话管理缺陷,建议切换到IMDSv2,它支持最长6小时的会话超时,减少因会话过期导致的凭证问题。可通过EC2实例的元数据设置或IAM策略强制启用IMDSv2。
- 监控Pod资源使用率:部分Pod出现问题可能是CPU/内存不足,导致IMDS请求无法及时处理。监控出现异常的Pod的资源指标,排查是否存在资源瓶颈。
- 检查IAM角色权限与STS配额:确认EC2实例绑定的IAM角色有
sts:GetSessionToken或对应STS操作的权限;同时检查STS服务的区域配额是否超限,虽然CloudTrail不记录IMDS调用,但可查看STS的服务日志(若启用)是否有错误记录。
内容的提问来源于stack exchange,提问作者ViS
相关产品推荐
相关产品推荐

