EKS部署中Java API访问S3失败但AWS CLI可正常访问故障排查
EKS IRSA对接S3报KMS权限错误修复方案
核心问题本质是AWS Java SDK与AWS CLI的S3 KMS加密默认行为不一致,当前ServiceAccount配置本身没有问题,问题出在加密配置与KMS权限匹配上。
场景差异说明
- 执行的AWS CLI命令显式加了
--sse aws:kms参数,该模式默认调用AWS托管的S3服务自带KMS密钥(别名为aws/s3),这类AWS托管密钥默认对同账号内的授权主体开放基础加密/解密权限,不需要额外配置KMS权限即可正常使用。 - 报错信息显示Java SDK调用时,实际请求的是客户自管理的KMS CMK密钥(ARN为
arn:aws:kms:eu-west-2:xxxxx:key/dcb9dcc5-0141-4f02-a9e4-bc8a1925e8a1),这类用户自创建的KMS密钥默认不开放任何权限,需要同时配置IAM身份策略和KMS密钥策略才能调用。
修复步骤
第一步:校验Pod的IRSA注入是否正常
进入Java应用所在Pod执行环境变量查询,确认IRSA配置生效:kubectl exec -it <Java应用Pod名称> -n <Pod所在命名空间> -- env | grep AWS返回结果中存在
AWS_ROLE_ARN=arn:aws:iam::xxxxx:role/yyyyyy、AWS_WEB_IDENTITY_TOKEN_FILE两个变量,说明ServiceAccount的IRSA注入正常,不需要修改ServiceAccount YAML。第二步:根据业务加密需求调整配置
- 如果业务不需要使用自定义KMS密钥加密S3对象:直接修改Java代码中S3客户端的加密配置,移除显式指定自定义KMS密钥ID的参数,配置为使用AWS托管的S3 KMS密钥,和CLI行为保持一致即可,不需要额外加权限。
- 如果业务必须使用报错中的自定义CMK密钥:
- 给绑定ServiceAccount的IAM角色
yyyyyy添加如下内嵌权限策略,允许角色调用该KMS密钥的加密解密相关接口:
{ "Effect": "Allow", "Action": [ "kms:GenerateDataKey", "kms:Decrypt" ], "Resource": "arn:aws:kms:eu-west-2:xxxxx:key/dcb9dcc5-0141-4f02-a9e4-bc8a1925e8a1" }- 进入KMS控制台,找到对应ID的自定义密钥,在密钥策略中添加上述IAM角色的
kms:GenerateDataKey、kms:Decrypt权限——客户自管理KMS密钥需要IAM身份策略、KMS密钥策略双重放通才会生效。
- 给绑定ServiceAccount的IAM角色
内容的提问来源于stack exchange,提问作者PremKumarR
相关产品推荐
相关产品推荐

