从 AWS Secrets Manager 导入 Spring Boot 应用程序中的密钥

Posted

技术标签:

【中文标题】从 AWS Secrets Manager 导入 Spring Boot 应用程序中的密钥【英文标题】:Importing secrets in Spring Boot application from AWS Secrets Manager 【发布时间】:2022-01-19 07:58:46 【问题描述】:

我使用Credentials for other database 选项将我的 mysql 数据库凭证存储在 AWS 机密管理器中。我想在我的application.properties 文件中导入这些凭据。根据我在这个线程“https://***.com/questions/56194579/how-to-integrate-aws-secret-manager-with-spring-boot-application”中找到的一些答案,我做了以下事情:

    添加了依赖spring-cloud-starter-aws-secrets-manager-configapplication.properties 中添加了spring.application.name = <application name>spring.config.import = aws-secretsmanager: <Secret name> 在以下属性中使用密钥作为占位符:
spring.datasource.url = jdbc:mysql://$host:3306/db_name
spring.datasource.username=$username
spring.datasource.password=$password

运行应用程序时出现以下错误:

java.lang.IllegalStateException: Unable to load config data from 'aws-secretsmanager:<secret_name>'
Caused by: java.lang.IllegalStateException: File extension is not known to any PropertySourceLoader. If the location is meant to reference a directory, it must end in '/' or File.separator

首先,我遵循的流程是否正确?如果是,这个错误是什么以及如何解决这个问题?

【问题讨论】:

您是否在spring.config.import 中指定了所有秘密?如果没有,并且如果您想通过您的应用程序名称来解决它们,请尝试使用spring.config.import=aws-secretsmanager:(参见说明here) 我在一个秘密/secret/&lt;app_name&gt;_&lt;profile&gt;/credentials 中拥有我想要的所有密钥。我正在使用spring.config.import=aws-secretsmanager:/secret/&lt;app_name&gt;_&lt;profile&gt;/credentials 【参考方案1】:

我找到了导致错误的问题。显然我添加了错误的依赖项。

根据最新的文档,使用spring.config.import 导入AWS 机密的配置支持已从org.springframework.cloud 移至io.awspring.cloud。所以更新后的依赖将是io.awspring.cloud:spring-cloud-starter-aws-secrets-manager-config:2.3.3NOT org.springframework.cloud:spring-cloud-starter-aws-secrets-manager-config:2.2.6

【讨论】:

【参考方案2】:

您正在尝试使用spring.config.import,并且在 Spring Cloud 2.3.0 中引入了对此的支持:

https://spring.io/blog/2021/03/17/spring-cloud-aws-2-3-is-now-available

秘密经理

Support loading properties through spring.config.import, introduced in Spring Cloud 2020.0 Read more about integrating your

带有 AWS 机密管理器的 Spring Cloud 应用程序。 删除了对自动配置模块 #526 的依赖。 删除了对 javax.validation:validation-api 的依赖。 允许 Secrets Manager 前缀在前面不带“/”#736。



在 spring-cloud 2020.0.0(又名 Ilford)中,引导阶段是 no 默认情况下启用更长的时间。为了启用它,您需要额外的 依赖:

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-bootstrap</artifactId>
  <version>spring-cloud-version</version>
</dependency>

但是,从 spring-cloud-aws 2.3 开始,允许导入默认 aws' secretsmanager 密钥 (spring.config.import=aws-secretsmanager:) 或 单个键 (spring.config.import=aws-secretsmanager:secret-key;other-secret-key)

https://github.com/spring-cloud/spring-cloud-aws/blob/main/docs/src/main/asciidoc/secrets-manager.adoc



application.yml

spring.config.import: aws-secretsmanager:/secrets/spring-cloud-aws-sample-app

或尝试将其留空:

spring.config.import=aws-secretsmanager:

因此,默认使用 spring.application.name,

应用:

@SpringBootApplication
public class App 

    private static final Logger LOGGER = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) 
        SpringApplication.run(App.class, args);
    

    @Bean
    ApplicationRunner applicationRunner(@Value("$password") String password) 
        return args -> 
            LOGGER.info("`password` loaded from the AWS Secret Manager: ", password);
        ;
    


【讨论】:

根据链接,要根据应用程序名称和配置文件导入,我们只需要使用spring.config.import=aws-secretsmanager:。还是行不通。同样的错误。 您检查过您的 aws 云版本吗?请看说明 我有'org.springframework.cloud:spring-cloud-starter-aws-secrets-manager-config:2.2.6.RELEASE'"org.springframework.cloud:spring-cloud-dependencies:2020.0.4"。为什么我们需要'io.awspring.cloud:spring-cloud-aws:2.3.0' 依赖?我尝试添加它。没有帮助。此外,根据文章,我们仅在通过bootstrap.yml 文件进行配置时才需要引导依赖项。

以上是关于从 AWS Secrets Manager 导入 Spring Boot 应用程序中的密钥的主要内容,如果未能解决你的问题,请参考以下文章

AWS Secrets Manager 找不到指定的密钥

AWS Secrets Manager 使用 AWS-SDK Java 更新密钥请求

使用 Terraform 将文件上传到 AWS Secrets Manager

AWS 跨账户 - 对 AWS CDK 中的参数的参数存储/Secrets Manager 访问

AWS Systems Manager Parameter Store 和 AWS Secrets Manager 之间的区别?

如何通过python更新AWS Secrets Manager?