Вступ
Міграції схем баз даних часто виконуються вручну, вимагаючи підвищених прав доступу до бази даних від адміністраторів БД (DBAs). Традиційно, розробники діляться SQL файлами з командою DBAs, які безпосередньо виконують їх на серверах баз даних. Цей процес включає створення запитів на зміни, очікування схвалень та координацію з командою DBAs, що робить його часозатратним і схильним до помилок. Крім того, зазвичай немає належного механізму контролю версій або відстеження змін бази даних.
Інтегруючи Flyway у Jenkins pipeline і використовуючи HashiCorp Vault для динамічного отримання секретів, ми можемо автоматизувати міграції схем, усунувши ручне втручання і зменшивши ризики безпеки доступу. Flyway забезпечує деплоями з контролем версій, надаючи можливість відстежувати зміни бази даних, а Vault динамічно керує обліковими даними, підвищуючи безпеку та ефективність. Такий підхід модернізує міграції баз даних, узгоджуючи їх з найкращими практиками DevOps.
Запропоноване рішення
Щоб подолати обмеження традиційних процесів міграції схем баз даних, я розробив рішення, яке інтегрує Jenkins, Flyway та HashiCorp Vault. Ця інтеграція автоматизує міграції схем при одночасному забезпеченні безпеки та ефективності.
- Jenkins Pipeline: Оркеструє весь процес міграції, ініціюючи виконання Flyway CLI для оновлення бази даних.
- Flyway CLI: Обробляє міграції схем із контролем версій, забезпечуючи консистентність і відстежуваність змін на всіх середовищах.
- HashiCorp Vault: Надає динамічні, обмежені в часі облікові дані для бази даних, усуваючи потребу в жорстко закодованих або статичних облікових даних, що підвищує безпеку.
Рис. 1: Архітектура інтеграції Jenkins, Flyway та HashiCorp Vault.
Пояснення робочого процесу
- Завантаження SQL файлів: Спочатку розробник повинен завантажити версіоновані SQL файли до репозиторію міграцій бази даних. Конфігурація Flyway вимагає дотримання певної конвенції іменування.
- Ініціація пайплайну: Процес починається, коли Jenkins ініціює пайплайн, вручну або через запланований чи подієвий тригер.
- Клонування спільної бібліотеки та репозиторію БД: Щоб легко отримати доступ до файлів, ми клонуємо або копіюємо функції спільної бібліотеки та папку репозиторію БД в поточну робочу директорію.
- Динамічне отримання облікових даних: Jenkins спілкується з HashiCorp Vault для динамічного отримання облікових даних для бази даних через Vault API. Engine Vault для бази даних генерує облікові дані, обмежені в часі.
- Виконання міграції схеми: Пайплайн використовує Flyway CLI в Docker контейнері для виконання міграцій SQL зі збереженням версій проти бази даних, використовуючи динамічно отримані облікові дані.
Кроки реалізації
1. Налаштування HashiCorp Vault для керування секретами бази даних
- Встановлення та налаштування Vault: Розгорніть HashiCorp Vault і увімкніть Engine секретів бази даних.
- Налаштування підключення до бази даних: Налаштуйте з'єднання з базою даних у Vault із ролями, які генерують динамічні облікові дані, обмежені в часі.
Коренева конфігурація підключення до БД для створення та керування ролями:
vault write database/config/flytest \
plugin_name=postgresql-database-plugin \
allowed_roles="flytest" \
connection_url="postgresql://{{username}}:{{password}}@:5432/?sslmode=disable" \
username="admin-user" \
password="admin-password"
Створіть роль, яка визначатиме політики облікових даних:
Тут ми використовуємо статичну роль, оскільки хочемо, щоб ім'я користувача\ролі бази даних залишалося статичним, але обертання облікових даних буде керуватися Vault DB Engine.
Спочатку створіть роль PG на екземплярі бази даних з достатнім доступом для запуску міграційних файлів, а потім створіть роль у Vault за допомогою кореневого з'єднання.
vault write database/roles/flytest \
db_name=my-database \
creation_statements="ALTER ROLE db-migrate WITH PASSWORD '{{password}}';" \
default_ttl="1h"
2.
Налаштування спільних бібліотечних функцій Jenkins
Ми використовуємо спільні бібліотечні функції для модульного поділу та спрощення етапів пайплайну:
Етап 1: Клонування репозиторію Flyway для бази даних
- Реалізуйте бібліотечну функцію для клонування репозиторію Flyway з Git.
## Приклад спільної бібліотечної функції Groovy:
def call() {
def repoUrl = 'https://github.com/xxxxxxx/flyway_deplyoments.git'
def branch = 'main'
withCredentials([usernamePassword(credentialsId: 'jk_clone', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
sh """
rm -rf ${env.WORKSPACE}/flyway-repo
git clone --branch ${branch} https://${GIT_USERNAME}:${GIT_PASSWORD}@${repoUrl.replace('https://', '')} "${env.WORKSPACE}/flyway-repo"
"""
}
}
Етап 2: Отримання облікових даних Vault користувача
- Використовуйте Vault API в спільній бібліотеці для динамічного отримання облікових даних для бази даних.
def call(Map config) {
withCredentials([string(credentialsId: 'vault-token-id', variable: 'VAULT_TOKEN')]) {
def tempScript = 'vault_script.py'
sh "chmod +x ${tempScript}"
def output = sh(script: "python3 ${tempScript} --db_name=${config.dbName} --vault_token=${VAULT_TOKEN}",returnStdout: true).trim()
def credentials = [:]
output.split('\n').each { line ->
def keyValue = line.split('=')
if (keyValue.length == 2) {
credentials[keyValue[0]] = keyValue[1]
}
}
return credentials
}
}
Етап 3: Виконання міграцій Flyway для бази даних
- Налаштуйте спільну бібліотечну функцію для виконання команд Flyway, використовуючи агент Docker.
def call(Map config) {
def tempScript = 'flyway_script.sh'
wrap([$class: 'MaskPasswordsBuildWrapper', varPasswordPairs: [[password: env.DB_PASSWORD]]]) {
// Запуск скрипту Flyway із обліковими даними Vault
sh """
chmod +x ${tempScript}
./${tempScript} "${config.dbName}" "${config.schemaName}" "${config.dbConnection}" "${config.version}" "${config.action}" "${env.DB_USERNAME}" "${env.DB_PASSWORD}"
"""
}
}
Код для Jenkins File можна знайти в наступному репозиторії Github -
[
JenkinsLab/flyway-deployer/Jenkinsfile at main · VenkateshShiga/JenkinsLab
Внесіть свій вклад у розробку VenkateshShiga/JenkinsLab, створивши обліковий запис на GitHub.
github.com
](https://github.com/VenkateshShiga/JenkinsLab/blob/main/flyway-deployer/Jenkinsfile?source=post_page-----8cb516de4cd3--------------------------------)
Тестування та виконання
Пайплайн приймає основні параметри, як показано нижче:
Зміст репозиторію бази даних Flyway:
Flyway вимагає файл конфігурації та місце для зберігання файлів міграції.
Flyway вимагає файл конфігурації для виконання міграцій відповідно до налаштувань конфігурації
Код міграції бази даних та імена файлів відповідно до конфігураційного файлу
Етап 2: Динамічне отримання паролів із Vault за допомогою API та токена користувача
Етап 3: Завантаження образу Flyway з DockerHub та запуск його як агента.
Цей етап є дуже важливим, оскільки ми не встановлюємо та не конфігуруємо жодного плагіна для Flyway. Ми безпосередньо витягуємо образ Flyway з DockerHub та запускаємо його як агента, що дає нам всі необхідні компоненти для виконання команд Flyway CLI без будь-якої попередньої налаштування.
Цей етап викликає скрипт Flyway з параметрами, які передано, виконуючи команди info, baseline або migrate.
Нижче наведено зображення виконання команди baseline Flyway, яка ініціалізує таблицю історії міграцій Flyway в схемі, яка повинна керуватися Flyway.
Після того як схема буде базовою, поточний стан схеми отримає номер версії, у нашому випадку це Версія 1.
Тому ми називаємо наші майбутні міграції наступною версією, тобто
2.
Тепер ми виконуємо команду flyway migrate для застосування міграцій до версії 2
Наведені скріншоти показують зміни, що були застосовані до бази даних Postgres.
Висновок
Це рішення інтегрує Jenkins, Flyway CLI та HashiCorp Vault, створюючи надійну, безпечну та автоматизовану інфраструктуру для міграцій схем баз даних. Завдяки виключенню ручних втручань, рішення значно скорочує час розгортання, знижує ризики використання підвищеного доступу до бази даних і забезпечує відслідковуваність завдяки міграціям з контролем версій. Також підвищується безпека завдяки динамічному отриманню облікових даних, що відповідає сучасним практикам DevOps.
Основні переваги включають:
- Автоматизація: Спрощене розгортання з мінімальним втручанням людини.
- Покращена безпека: Динамічні облікові дані для бази даних з обмеженим терміном дії.
- Контроль версій: Відслідковуваність змін у схемах через Flyway.
- Масштабованість: Переносна інфраструктура, адаптована до різних середовищ.
Перекладено з: Secure Database Deployments: Automating Flyway Migrations with Jenkins and Dynamic Vault Credentials