Один из наиболее распространенных способов настраивать конфигурацию базы данных 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.
Читайте также:
- Создание динамического кластера ECS с помощью Terraform
- Spring Boot: реализация фабричного метода
- Как создать самообновляющийся заголовок Twitter с динамическим контентом
Читайте нас в Telegram, VK и Дзен
Перевод статьи Dev INTJ Code: Spring Boot Externalized Database Configuration with AWS Secrets Manager