SpringBoot服务未使用Helm部署绑定的IAM角色,S3访问遭403拒绝
不需要在服务中手动实现STSAssumeRole,IRSA(IAM Roles for Service Accounts)机制已经自动完成了临时凭证的获取流程。结合你的情况,以下是可能遗漏的配置点和排查方向:
检查AWS SDK版本兼容性
Java SDK v1需升级到1.11.700及以上版本,Java SDK v2需2.10.0及以上版本。老版本SDK不会自动识别AWS_ROLE_ARN和AWS_WEB_IDENTITY_TOKEN_FILE环境变量,导致无法通过IRSA获取凭证。验证Pod中Token文件的访问权限
默认token文件路径为/var/run/secrets/eks.amazonaws.com/serviceaccount/token,需确保容器运行用户对该文件有读取权限。可进入Pod执行ls -l /var/run/secrets/eks.amazonaws.com/serviceaccount/token检查权限,若使用非root用户,可能需要调整ServiceAccount的automountServiceAccountToken或容器的securityContext配置。排查IAM角色的权限边界
若IAM角色设置了权限边界(Permission Boundary),即使附加了S3全访问策略,权限边界也可能限制实际操作权限。需确认权限边界策略允许S3相关操作。检查S3桶的Bucket Policy
桶自身的Bucket Policy可能存在拒绝规则,或未明确允许你的IAM角色访问。例如,桶策略中需包含允许<你的IAM角色ARN>执行s3:*操作的语句,避免出现优先级更高的拒绝规则。手动验证IRSA凭证获取流程
在Pod内安装AWS CLI,执行以下命令测试是否能获取临时凭证:aws sts assume-role-with-web-identity \ --role-arn arn:aws:iam::123456789:role/my-role \ --role-session-name test-session \ --web-identity-token file:///var/run/secrets/eks.amazonaws.com/serviceaccount/token若能成功返回临时凭证,再用该凭证测试S3访问:
# 将返回的AccessKeyId、SecretAccessKey、SessionToken填入环境变量 export AWS_ACCESS_KEY_ID=<临时密钥ID> export AWS_SECRET_ACCESS_KEY=<临时密钥> export AWS_SESSION_TOKEN=<临时会话Token> aws s3 ls s3://<你的桶名>这一步能区分是IRSA配置问题,还是服务代码的AWS客户端配置问题。
检查SpringBoot的硬编码AWS凭证
若application.properties或application.yaml中手动配置了aws.access-key、aws.secret-key等参数,会覆盖IRSA的自动凭证获取逻辑,需删除这些硬编码配置。
内容的提问来源于stack exchange,提问作者Prasann

