Один из наиболее распространенных способов настраивать конфигурацию базы данных Spring Boot  —  через свойства приложения. Для некоторых смена пароля к базе данных может быть редкостью, но лучше периодически его менять.

Традиционно изменение паролей к базам данных означает перезапуск сервиса после внесения изменений в свойства приложения (это также можно сделать с помощью переменных среды). Чем чаще это делается, тем выше вероятность сбоев в обслуживании пользователей.

К счастью, благодаря интеграции с AWS Secrets Manager нет необходимости перезапускать сервис каждый раз, когда пароль к базе данных меняется. Secrets Manager даже предоставляет возможность автоматически менять пароль через определенный период.


Шаг 1. Создайте учетные данные к БД в AWS Secrets Manager

Перейдите в консоль AWS и найдите “Secrets Manager”. Затем выполняйте последующие шаги до тех пор, пока секрет не будет создан.


Шаг 2. Добавьте зависимости в pom.xml

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws.secretsmanager</groupId>
<artifactId>aws-secretsmanager-jdbc</artifactId>
<version>${aws-secretsmanager-jdbc.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
</dependencies>

<properties>
<aws-secretsmanager-jdbc.version>1.0.5</aws-secretsmanager-jdbc.version>
</properties>

Примечание: зависимость spring-boot-starter-data-jpa взаимозаменяема с spring-boot-starter-jdbc. Используйте то, что удобнее для вас.


Шаг 3. Сконфигурируйте файл со свойствами приложения

spring.datasource.driver-class-name=com.amazonaws.secretsmanager.sql.AWSSecretsManagerPostgreSQLDriver
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.datasource.url=jdbc-secretsmanager:postgresql://postgres-db.cjqt4bf02oy9.ap-northeast-2.rds.amazonaws.com:5432/postgres-db
spring.datasource.username=dev/dbCreds/demo

Во-первых, для свойства driverclassname мы использовали класс драйвера AWS Secrets Manager PostgreSQL. Обратите внимание, что он взят из зависимости aws-secrets manager-jdbc.

Далее, для свойства spring.jpa.database-platform используется PostgreSQLDialect из зависимости postgresql.

Также стоит отметить изменение в префиксе для datasource url (URL-адреса источника данных)  —  теперь это jdbc-secretsmanager.

Наконец, для свойства datasource username (имя пользователя для источника данных) мы воспользовались секретным именем из AWS Secret Manager.


Шаг 4. Проверьте подключение базы данных сервера и менеджера секретов.

Что касается базы данных, попробуйте команду psql:

Вот несколько ошибок, с которыми можно столкнуться.

  • psql not installed: спокойно устанавливайте его с помощью менеджера пакетов, которым пользуетесь.
  • Connection timeout: убедитесь, что экземпляр EC2 и база данных находятся на одном и том же виртуальном облачном сервере. Кроме того, присоедините группу безопасности базы данных к экземпляру EC2  —  это даст доступ к серверу для подключения к базе данных.

Что касается менеджера секретов, воспользуйтесь aws-cli и попробуйте вывести список секретов:

Вот какие ошибки могут встретиться.

  • The region is not defined: используйте aws configure для настройки этого параметра. При этом можно пропустить часть, связанную с секретными ключами, поскольку обычно хранить ключи на экземпляре сервера небезопасно.
  • The EC2 instance does not have access to AWS Secrets Manager: вместо того, чтобы настраивать секретные ключи непосредственно в EC2, в качестве более безопасного подхода создайте роль с политикой доступа на чтение для Secrets Manager, а затем присоедините ее к экземпляру EC2.

Шаг 5. Запустите приложение и проверьте доступ к базе данных

На основе этих журналов можно подтвердить, что подключение к базе данных успешно установлено. Более того, если мы попытаемся сменить пароль, то все равно сможем подключиться к базе данных без каких-либо простоев благодаря механизму кэширования в AWS Secrets Manager.

Исходный код этого примера находится на Github.

Читайте также:

Читайте нас в TelegramVK и Дзен


Перевод статьи Dev INTJ Code: Spring Boot Externalized Database Configuration with AWS Secrets Manager

Предыдущая статьяJava 17: что нового по сравнению с Java 11
Следующая статьяЭволюция кортежей в C#