如何在EKS中使用Spring Cloud AWS从AWS Secrets Manager加载配置?求集成示例
在EKS中用Spring Cloud AWS从Secrets Manager加载配置
完全可行,Spring Cloud AWS原生支持在EKS环境下从Secrets Manager拉取配置,核心是通过**IAM角色服务账户(IRSA)**让Pod获得访问Secrets Manager的权限,无需硬编码AWS凭证。下面是具体实现步骤和集成示例:
1. 添加Spring Cloud AWS依赖
给Spring Boot项目添加Secrets Manager starter依赖,版本需和你的Spring Boot版本匹配(比如Spring Boot 3.x对应Spring Cloud AWS 3.x):
Maven(pom.xml)
<dependency> <groupId>io.awspring.cloud</groupId> <artifactId>spring-cloud-starter-aws-secrets-manager-config</artifactId> <version>3.1.0</version> </dependency>
Gradle(build.gradle)
implementation 'io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:3.1.0'
2. 配置EKS IAM权限(IRSA)
这是EKS集成的关键步骤,通过IRSA让Pod关联IAM角色,获得访问Secrets Manager的权限:
步骤1:创建IAM访问策略
创建一个IAM策略,允许访问指定的Secrets Manager密钥(替换ARN中的区域、账号ID和密钥名):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:my-app-secrets-*" } ] }
步骤2:创建IAM角色并关联策略
创建IAM角色时,信任策略要指向你的EKS OIDC提供商(替换OIDC ARN和ServiceAccount信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/ABCDEFGHIJKLMNOPQRSTUVWXYZ123456" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.us-east-1.amazonaws.com/id/ABCDEFGHIJKLMNOPQRSTUVWXYZ123456:sub": "system:serviceaccount:default:my-app-sa" } } } ] }
将之前创建的IAM策略关联到这个角色。
步骤3:创建K8S ServiceAccount
在EKS中创建ServiceAccount,通过注解关联上面的IAM角色:
apiVersion: v1 kind: ServiceAccount metadata: name: my-app-sa namespace: default annotations: eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/my-app-secrets-role
3. Spring Boot应用配置
在application.yml(或application.properties)中开启Secrets Manager配置导入:
spring: cloud: aws: secretsmanager: enabled: true region: us-east-1 name: my-app-secrets # 你的Secrets Manager密钥名称 config: import: "aws-secretsmanager:" # 开启从Secrets Manager加载配置
如果需要加载多个密钥或按环境区分,可以这样配置:
spring: config: import: "aws-secretsmanager:my-app-${spring.profiles.active}-secrets,aws-secretsmanager:my-app-common-secrets"
代码中使用配置
假设Secrets Manager中的密钥内容为JSON格式:
{ "db.username": "admin", "db.password": "s3cr3tP@ssw0rd" }
你可以直接用@Value注入这些属性:
@RestController public class SecretsTestController { @Value("${db.username}") private String dbUsername; @Value("${db.password}") private String dbPassword; @GetMapping("/secrets") public String showSecrets() { return String.format("DB Username: %s, DB Password: %s", dbUsername, dbPassword); } }
4. EKS部署示例
创建Deployment YAML,指定使用上面的ServiceAccount:
apiVersion: apps/v1 kind: Deployment metadata: name: my-spring-boot-app namespace: default spec: replicas: 1 selector: matchLabels: app: my-spring-boot-app template: metadata: labels: app: my-spring-boot-app spec: serviceAccountName: my-app-sa containers: - name: app-container image: your-docker-registry/my-spring-boot-app:latest ports: - containerPort: 8080 env: - name: SPRING_PROFILES_ACTIVE value: dev
5. 验证部署
- 部署应用到EKS:
kubectl apply -f deployment.yaml
- 查看Pod运行状态:
kubectl get pods
- 端口转发到本地测试:
kubectl port-forward pod/my-spring-boot-app-xxxx-yyyy 8080:8080
- 访问
http://localhost:8080/secrets,确认能正确显示从Secrets Manager加载的配置。
注意事项
- 确保你的EKS集群已配置OIDC提供商(默认创建的EKS集群自动配置,手动创建需确认)
- IAM策略的Resource要精确到目标密钥ARN,避免过度授权
- 注意Spring Cloud AWS和Spring Boot的版本兼容性
- 可以结合Spring Profiles实现多环境配置隔离
内容的提问来源于stack exchange,提问作者Minat
相关产品推荐
相关产品推荐

