EKS部署Spring Boot配置IRSA无法通过ServiceAccount正确扮演AWS角色
问题排查结果
当前配置的核心错误是AWS SDK依赖版本过低+缺失IRSA认证适配模块,附带存在权限配置隐患,最终导致SDK没有使用IRSA注入的角色凭证,回退读取了EKS工作节点绑定的默认角色,也就是日志里显示的集群生成默认角色。
具体原因拆解:
- 你引入的
com.amazonaws:aws-java-sdk-sts:1.12.9版本过旧,该版本的AWS Java SDK 1.x 没有内置EKS IRSA场景下的环境变量自动识别逻辑,无法自动读取Pod里已经注入的AWS_WEB_IDENTITY_TOKEN_FILE、AWS_ROLE_ARN两个环境变量完成Web身份令牌认证。同时你只引入了单独的STS SDK包,没有引入Spring Cloud AWS对应的STS自动配置组件,Spring框架不会帮你组装Web Identity对应的凭证提供方。 - 你配置的
securityContext.fsGroup=123456存在权限隐患:EKS IRSA webhook注入到Pod里的身份令牌文件默认属组ID为65534,如果你的应用以非root用户运行,且fsGroup和令牌文件属组不匹配,会直接出现令牌文件无读权限的问题,进一步导致IRSA认证流程初始化失败,直接回退到EC2实例元数据服务拉取节点角色的凭证。
修复方案
按以下步骤调整配置即可解决:
- 升级并补全Maven依赖:将AWS Java SDK的STS组件升级到1.12.300以上版本(该版本后1.x SDK正式稳定支持IRSA环境变量自动识别),同时引入Spring Cloud AWS的STS自动配置starter,如果你已经配置了Spring Cloud AWS的官方依赖管理,不需要手动指定SDK版本:
<dependencies> <!-- 新增Spring Cloud AWS STS自动配置依赖 --> <dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-starter-aws-sts</artifactId> </dependency> <!-- 替换原有低版本STS SDK,版本可随Spring Cloud AWS依赖管理自动对齐,无需硬编码 --> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-sts</artifactId> <version>1.12.500</version> </dependency> </dependencies>
- 调整Deployment的安全上下文配置:将
securityContext.fsGroup的值改为65534,和IRSA令牌文件的默认属组对齐,或者补充fsGroupChangePolicy: OnRootMismatch配置,确保应用运行用户有权限读取/var/run/secrets/eks.amazonaws.com/serviceaccount/token路径下的令牌文件。 - 重新发布应用后校验:进入业务Pod执行
cat $AWS_WEB_IDENTITY_TOKEN_FILE确认可以正常输出令牌内容,再观察应用启动日志,此时拉取Secrets Manager配置时使用的身份会变为你在ServiceAccount注解里配置的目标角色,不会再出现AccessDenied报错。
内容的提问来源于stack exchange,提问作者夢のの夢
相关产品推荐
相关产品推荐

