You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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角色

  1. 确认EKS集群已配置OIDC提供商,可通过aws eks describe-cluster --name 集群名称 --query "cluster.identity.oidc.issuer"查看,创建集群时默认开启。
  2. 创建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. 将步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:10:18