Spring Boot无AWS密钥连接Secrets Manager(K8s部署遇凭证异常)
在AWS EKS中无需硬编码凭证访问Secrets Manager的最优方案
解决这个问题的最优方式是使用IAM Roles for Service Accounts(IRSA),这是AWS官方推荐的EKS Pod权限管理方案,能让Pod直接获取IAM角色权限,无需硬编码AccessKey/SecretKey,且权限粒度更细、更安全。
步骤1:创建IAM访问策略
首先创建最小权限的IAM策略,允许Pod访问目标Secrets Manager密钥:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Resource": "arn:aws:secretsmanager:你的区域:你的账号ID:secret:目标密钥名称-*" } ] }
步骤2:创建关联服务账户的IAM角色
- 确认EKS集群已配置OIDC提供商,可通过
aws eks describe-cluster --name 集群名称 --query "cluster.identity.oidc.issuer"查看,创建集群时默认开启。 - 创建IAM角色,信任关系配置为允许指定K8s服务账户扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::你的账号ID:oidc-provider/集群OIDC地址" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "集群OIDC地址:sub": "system:serviceaccount:你的命名空间:服务账户名称" } } } ] }
- 将步骤1创建的策略附加到这个IAM角色上。
步骤3:在K8s中创建服务账户
在目标命名空间下创建K8s服务账户,通过注解关联IAM角色:
apiVersion: v1 kind: ServiceAccount metadata: name: 你的服务账户名称 namespace: 你的命名空间 annotations: eks.amazonaws.com/role-arn: arn:aws:iam::你的账号ID:role/你的IAM角色名称
步骤4:配置Spring Boot应用
关联服务账户
在Deployment的Pod模板中指定使用上述服务账户:
apiVersion: apps/v1 kind: Deployment metadata: name: 你的应用部署名称 namespace: 你的命名空间 spec: replicas: 1 selector: matchLabels: app: 你的应用名称 template: metadata: labels: app: 你的应用名称 spec: serviceAccountName: 你的服务账户名称 # 关联服务账户 containers: - name: 你的应用容器名称 image: 你的应用镜像 ports: - containerPort: 8080
Spring Boot代码实现
使用AWS SDK v2时,无需手动配置凭证,SDK会自动通过IRSA获取临时凭证:
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class SecretsManagerConfig { // 自动加载IRSA提供的凭证 @Bean public SecretsManagerClient secretsManagerClient() { return SecretsManagerClient.create(); } } // 业务服务中使用 @Service public class SecretFetchService { private final SecretsManagerClient secretsManagerClient; // 构造注入客户端 public SecretFetchService(SecretsManagerClient secretsManagerClient) { this.secretsManagerClient = secretsManagerClient; } public String getSecret(String secretId) { GetSecretValueRequest request = GetSecretValueRequest.builder() .secretId(secretId) .build(); GetSecretValueResponse response = secretsManagerClient.getSecretValue(request); return response.secretString(); } }
备选方案(不推荐):使用节点IAM角色
如果暂时无法配置IRSA,可使用EKS节点的IAM角色,但该角色会被节点上所有Pod共享,权限粒度较粗,存在安全风险。只需确保节点角色包含访问Secrets Manager的权限,Spring Boot SDK同样会自动从节点元数据服务获取凭证。
内容的提问来源于stack exchange,提问作者sunilkumar
相关产品推荐
相关产品推荐

