知識庫 / Spring / Spring Boot RSS 訂閱

在 Spring Boot 中集成 AWS Secrets Manager

Spring Boot
HongKong
4
11:36 AM · Dec 06 ,2025

1. 概述

在本教程中,我們將集成一個 Spring Boot 應用程序與 AWS Secrets Manager,以便檢索數據庫憑據和其他類型的密鑰,例如 API 密鑰。

2. AWS Secrets Manager

AWS Secrets Manager 是一個 AWS 服務,它允許我們安全地存儲、輪換和管理憑據,例如數據庫憑據、API 密鑰、令牌或任何我們想要管理的秘密。

我們可以區分兩種類型的秘密:一種是專門用於數據庫憑據,另一種則是更通用的用於任何其他類型的秘密。

使用 AWS Secrets Manager 的一個好例子是向我們的應用程序提供一組憑據或 API 密鑰。

推薦的存儲秘密的方式是 JSON 格式。 此外,如果想要使用秘密輪換功能,則必須使用 JSON 結構.

3. 與 AWS Secrets Manager 集成

AWS Secrets Manager 可以輕鬆地集成到我們的 Spring Boot 應用程序中。 讓我們通過使用 AWS CLI 創建 Secrets,然後通過 Spring Boot 中的簡單配置檢索它們來嘗試一下。

3.1. 密鑰創建

讓我們在 AWS Secrets Manager 中創建一個密鑰。為此,我們可以使用 AWS CLIaws secretsmanager create-secret 命令。

在這種情況下,我們將密鑰命名為 test/secret/”,並創建兩個 API 密鑰對:api-key1apiKeyValue1,以及 api-key2 與值 apiKeyValue2

aws secretsmanager create-secret \ 
--name test/secret/ \ 
--secret-string "{\"api-key1\":\"apiKeyValue1\",\"api-key2\":\"apiKeyValue2\"}"

作為迴應,我們應該獲取創建的密鑰的 ARN、名稱和版本 ID:

{
    "ARN": "arn:aws:secretsmanager:eu-central-1:111122223333:secret:my/secret/-gLK10U",
    "Name": "test/secret/",
    "VersionId": "a04f735e-3b5f-4194-be0d-719d5386b67b"
}

3.2. Spring Boot 應用集成

為了獲取我們的新密鑰,我們需要添加 spring-cloud-starter-aws-secrets-manager-config 依賴項:

<dependency>
    <groupId>io.awspring.cloud</groupId>
    <artifactId>spring-cloud-starter-aws-secrets-manager-config</artifactId>
    <version>2.4.4</version>
</dependency>

下一步是添加一個屬性到我們的 application.properties 文件中:

spring.config.import=aws-secretsmanager:test/secret/

這裏我們提供剛剛創建的秘密名稱。 確認設置完畢後,讓我們在應用程序中使用這些新的秘密並驗證其值。

要做到這一點,我們可以通過使用 @Value 註解將秘密注入到應用程序中。 在註解中,我們指定了我們在秘密創建過程中提供的秘密字段的名稱。 在我們的例子中,它們是 api-key1api-key2

@Value("${api-key1}")
private String apiKeyValue1;

@Value("${api-key2}")
private String apiKeyValue2;

為了驗證本示例中的值,我們只需在 Bean 屬性初始化後在我們的 @PostConstruct 中打印它們:

@PostConstruct
private void postConstruct() {
    System.out.println(apiKeyValue1);
    System.out.println(apiKeyValue2);
}

我們應該注意的是,將秘密值輸出到控制枱是不好的實踐。但是,在這個例子中我們可以看到,當我們運行應用程序時,我們的值已經被正確加載:

2023-03-26 12:40:24.376  INFO 33504 [main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
apiKeyValue1
apiKeyValue2
2023-03-26 12:40:25.306  INFO 33504 [main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''

4. 數據庫憑據的特殊秘訣

AWS Secrets Manager 中有一種特殊類型的憑據,用於存儲數據庫憑據。我們可以從 AWS 支持的數據庫中選擇,例如 Amazon RDS、Amazon DocumentDB 或 Amazon Redshift。對於非 Amazon 數據庫,還可以提供服務器地址、數據庫名稱和端口。

藉助在我們的 Spring Boot 應用程序中使用的 aws-secretsmanager-jdbc 庫,我們可以輕鬆地向數據庫提供這些憑據。 此外,如果我們在 Secrets Manager 中輪轉憑據,aws-提供的庫會自動 在收到身份驗證錯誤時,使用先前憑據檢索一個新的憑據集

4.1. 數據庫密鑰創建

為了在 AWS Secrets Manager 中創建數據庫類型的密鑰,我們將再次使用 AWS CLI:

$ aws secretsmanager create-secret \
    --name rds/credentials \
    --secret-string file://mycredentials.json

在上述命令中,我們使用 mycredentials.json 文件,其中指定了我們數據庫的所有必要屬性:

{
  "engine": "mysql",
  "host": "cwhgvgjbpqqa.eu-central-rds.amazonaws.com",
  "username": "admin",
  "password": "password",
  "dbname": "db-1",
  "port": "3306"
}

4.2. Spring Boot 應用集成

一旦我們創建了密鑰,我們就可以將其用於我們的 Spring Boot 應用中。為此,我們需要添加一些依賴項,例如 aws-secretsmanager-jdbcmysql-connector-java

<dependency>
    <groupId>com.amazonaws.secretsmanager</groupId>
    <artifactId>aws-secretsmanager-jdbc</artifactId>
    <version>1.0.11</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.32</version>
</dependency>

最後,我們還需要在 application.properties文件中設置一些屬性:

spring.datasource.driver-class-name=com.amazonaws.secretsmanager.sql.AWSSecretsManagerMySQLDriver
spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
spring.datasource.url=jdbc-secretsmanager:mysql://db-1.cwhqvgjbpgfw.eu-central-1.rds.amazonaws.com:3306
spring.datasource.username=rds/credentials

spring.datasource.driver-class-name 中,我們指定要使用的 驅動程序 的名稱。

下一個是 spring.jpa.database-platform,在這裏我們提供數據庫方言。

當我們指定數據庫 URL 在 spring.datasource.url 中,必須在 URL 前面添加 jdbc-secretsmanager 前綴。這是因為我們與 AWS Secrets Manager 集成。在這個例子中,我們的 URL 指向一個 MySQL RDS 實例,儘管它可以指向任何 MySQL 數據庫。

spring.datasource.username 中,我們只需要提供我們之前設置的 AWS Secrets Manager 的密鑰。根據這些屬性,我們的應用程序將嘗試連接到 Secrets Manager 並檢索用户名和密碼,然後再連接到數據庫。

在應用程序日誌中,我們可以看到我們成功地獲得了數據庫的連接,並且 EntityManager 已被初始化:

2023-03-26 12:40:22.648  INFO 33504 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-03-26 12:40:22.697  INFO 33504 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.6.12.Final
2023-03-26 12:40:22.845  INFO 33504 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
2023-03-26 12:40:22.951  INFO 33504 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-03-26 12:40:23.752  INFO 33504 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-03-26 12:40:23.783  INFO 33504 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
2023-03-26 12:40:24.363  INFO 33504 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-03-26 12:40:24.376  INFO 33504 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'

此外,我們還創建了一個簡單的 UserController,其中可以創建、讀取和刪除用户。

我們可以使用 curl 創建用户:

$ curl --location 'localhost:8080/users/' \
--header 'Content-Type: application/json' \
--data '{
    "name": "my-user-1"
}'

我們得到了成功的響應:

{"id":1,"name":"my-user-1"}

5. 結論

在本文中,我們學習瞭如何將 Spring Boot 應用程序與 AWS Secrets Manager 集成,以及如何檢索數據庫憑據和其他類型秘密。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.