Як я видалив базу на продакшені, а бекапів не було. Best practices як робити «Cloud native» бекапи (на прикладі Azure + Terraform)

💡 Усі статті, обговорення, новини про DevOps — в одному місці. Приєднуйтесь до DevOps спільноти!

Дисклеймер

УВАГА! Всі персонажі та описані події є вигаданими. Будь-який збіг з реальними людьми чи подіями є випадковістю. Усі дії виконувались «професіоналами», тож не намагайтесь повторити їх у реальному житті.

Ця стаття складатиметься з двох частин: перша про те, як краще робити «Cloud native» бекапи, а друга — «вигадана» історія, як мій «товариш» видалив базу даних на продакшені, а бекапу не було. Тож приємного перегляду...

Дані — це найбільша цінність, що існуватиме довше, ніж сама система. Дані — найважливіший актив компанії

Перш за все слід розуміти різницю між бекапами та Disaster Recovery планом.

Disaster Recovery план передбачає повне відновлення всієї інфраструктури (hardware, software, networking, data) в разі масштабних колапсів (вихід з ладу датацентра, регіону, проблеми з мережею, хакерські атаки, повені, пожежі тощо). DR дублює всю вашу основну інфраструктуру в інші регіони, передбачає її обслуговування, перевірку на доступність та має чітку послідовність дій для переключення трафіку в разі аварій. Головною метою DR є зменшення даунтайму та якомога скоріше відновлення всієї системи.

Бекапи ж натомість є лише копією даних з подальшою можливістю їх відновлення.

В цій статті мова йтиме саме про бекапи (адже Disaster Recovery є значно ширшим поняттям, яке охоплює не лише бази даних, і для нього однієї статті буде замало).

Насамперед сформулюємо найважливіші критерії, за якими оцінюється ефективність бекапу:

  • швидкість виконання;
  • зручність його запуску та обслуговування;
  • кількість грошей, яку ми витрачаємо на зберігання даних;
  • захищеність місця, де ми зберігаємо бекап;
  • рівень доступності в разі аварій.

Пропоную почати з останніх двох пунктів. Адже, як зазначено в книзі SRE від Google: «Неважливо, наскільки корисна твоя система, якщо ніхто не може нею користуватись».

Дійсно, який сенс від бекапу, якщо він зберігається в тому ж датацентрі, де ваша база «вмерла» в результаті торнадо? Чи допоможе вам блискавична швидкість резервного копіювання, якщо зловмисник видалить його разом з базою, використовуючи ті ж самі доступи, що і для бази?

Тож перша порада — зберігайте бекапи в іншому датацентрі/регіоні (територіально) та надавайте права до них за принципом «zero trust». Ми можемо дозволити адмінам працювати з ними, але заборонити зміну чи видалення (Write Once Read Many). Можемо використовувати двухфакторку, енкриптити бекапи (що в клаудах є опцією ‘out-of-the-box’), зберігати їх в ізольованій мережі, упевнившись, що доступ до них є лише через певні «канали» (наприклад, через VPN та Private Endpoint або через використання РІМ з підтвердженням запиту на доступ від іншого члена команди)...

Що ж до швидкості резервного копіювання, зручності його обслуговування, а також зменшення коштів на його зберігання, немає нічого кращого, на мою думку, ніж вже готові та заздалегідь оптимізовані рішення від популярних клаудів.

В Azure, до прикладу, для «ізоляції» бекапу найкраще підійде окремий Subscription з налаштованим RBAC (інкапсуляція від іншої інфраструктури на рівні доступів) та додаткова копія бекапу в регіон, що відмінний від регіону продакшн-бази. Слід зазначити, що для Azure Backup Vault доступна також реплікація бекапів поміж Availability-зонами всередині одного регіону, а не лише між Geo-регіонами.

Стоп, а що таке цей Backup Vault?

Azure Backup Vault — це тип сховища в Azure для автоматизації та зберігання бекапів. Наразі він підтримує резервне копіювання таких ресурсів, як Azure Database for PostgreSQL flexible server, Azure Database for MySQL flexible server(preview), Azure Disks, Azure Blobs, та Kubernetes services (preview).

Але за бажанням можна спочатку «перегнати» дані за допомогою Azure Data Factory з інших ресурсів (наприклад, з CosmosDB) в Azure Blobs, а потім так само бекапити їх в Backup Vault (що додасть, звісно, трохи складності у випадку з CosmosDB). Та натомість ми отримуємо зрозумілий, зручний, і нативний для Azure механізм з реалізації резервного копіювання — тобто задовольняємо перші два пункти зі списку вище. Отже, з інкапсуляцією, сусуріті, швидкістю та зручністю розібрались. А як щодо костів?

Враховуючи, що в будь-якому разі нам необхідна буде якась VM (чи інший workload) для виконання pg_dump/pg_restore, а також місце (storage), де ми зберігатимемо дампи..., зменшення часу на обслуговування цих речей за рахунок використання Azure Backup Vault (чи його аналогів в інших клаудах) автоматично зменшує і кости.

Та ми можемо зменшити їх ще більше! Ні для кого не секрет, що чим більше даних зберігаєш — тим більше платиш. Тож нашою ціллю буде зменшити кількість бекапів, при цьому не зменшуючи проміжок часу, який вони покривають. Часто знадобиться безліч резервних копій за певний проміжок часу, щоб відповідати вимогам різних регуляторок по типу GDPR/PSIDSS, та щоб мати змогу «рекурсивно» розбирати інциденти, пов’язані з даними, знайти стан бази, коли ці проблеми почались.

Для таких цілей ми будемо користуватись бекап rotation схемою «Grandfather-Father-Son». До прикладу, якщо вам необхідно мати бекапи за весь попередній рік, не обов’язково зберігати всі 365 бекапів. Достатньо всього 17 (в моєму варіанті). Як це працює:

  1. Спочатку ми бекапимо нашу базу кожного дня протягом тижня (загалом 7 бекапів).
  2. Через тиждень ми «перезаписуємо» бекапи, вік яких перевищує 7 днів, але продовжуємо зберігати «weekly» бекапи (резервні копії за понеділок) протягом останнього місяця. Тобто з приходом вівторка бекап за попередній вівторок видаляється і замінюється на новий. При цьому до наших 7 бекапів за останній тиждень додається ще 3 бекапи, зроблених по понеділкам попередніх тижнів місяця.
  3. Через місяць ми «перезаписуємо» ці «weekly» бекапи новими (якщо такий бекап старіший 30 днів), зберігаючи при цьому лише бекап понеділка першого тижня кожного місяця («monthly» backup) протягом останніх пів року. Це ще плюс 5 бекапів, на додачу до 10 з попередніх степів.
  4. Після старіння «monthly» бекапів більш ніж на 6 місяців ми видаляємо їх — крім тих, які є «quarterly» бекапами (що були зроблені в перший понеділок першого місяця в кварталі). Таким чином ми зберігаємо ще плюс 2 бекапи.
  5. Ну і наостанок, через рік ми остаточно видаляємо «quarterly» бекапи — окрім того, що був зроблений в перший понеділок першого місяця першого кварталу за минулий рік.

Таким чином ми маємо ~17 бекапів під кінець року, які покривають стан нашої бази за останні 365 днів, але при цьому не коштують всіх грошей світу (і їх ми кладемо в Azure Backup Vault з Geo-Redundancy фічею).

А ось приклад як такий Backup Vault з «GeoRedundant» виглядатиме в Terraform-коді:

./root_module/vars_values.tfvars (add alias «source_data_subscription» in providers.tf first ).

backup_subscription_id = "h47fq8f0-648f-4fj6-9jg7-85ht0cc75h77"
source_data_subscription_id = "24759666-4yr5-4586-976h-hfy56c3fjg68"
environment = "back"
 
# Source MSQL servers to backup and their resource groups where they are located
source_mysql_servers = {
   "mysql-projectname-eus2-prod" = "data-projectname-prod",
   "mysql-projectname-eus2-dev"  = "data-projectname-dev",
}

./root_module/variables.tf

variable "backup_subscription_id" {
   type = string
}

variable "source_data_subscription_id" {
   type = string
}

variable "environment" {
 type = string
}

variable "source_mysql_servers" {
 description = "A map of MYSQl server names and their resource groups to backup."
 type    = map(string)
}

./root_module/data.tf

data "azurerm_mysql_flexible_server" "mysql" {
 for_each = var.source_mysql_servers
 provider = azurerm.source_data_subscription

 name                = "${each.key}"
 resource_group_name = "${each.value}"
}

data "azurerm_resource_group" "mysql" {
 for_each = var.source_mysql_servers
 provider = azurerm.source_data_subscription

 name = "${each.value}"
}

./root_module/main.tf

locals {
 source_mysql_servers = {
   for name, server in data.azurerm_mysql_flexible_server.mysql :
   name => {
     id           = server.id
     server_rg_id = data.azurerm_resource_group.mysql[name].id
   }
 }
}

module "resource_group" {
   source      = "../modules/resource_group"
   environment = var.environment
}

module "backup_vault" {
   source      = "../modules/backup_vault"
   environment = var.environment

   resource_group_name = module.resource_group.resource_group_name

   source_mysql_servers = local.source_mysql_servers
}

./modules/backup_vault/variables.tf

variable "environment" {
 type = string
}

variable "project" {
 type = string
 default = "projectname"
}

variable "location" {
 type    = string
 default = "East US 2"
}

variable "short_location" {
 type = string
 default = "eus2"
}

variable "resource_group_name" {
 type = string
}

variable "source_mysql_servers" {
 description = "A map of MySQL server names and their resource groups for backups."
 type = map(object({
   server_rg_id = string
   id           = string
 }))
}

./modules/backup_vault/azure_backup_vault.tf

resource "azurerm_data_protection_backup_vault" "backup" {

 name = "bvault-${var.project}-${var.short_location}-${var.environment}"
 resource_group_name = var.resource_group_name
 location            = var.location
 datastore_type      = "VaultStore"
 redundancy          = "GeoRedundant"

 identity {
   type = "SystemAssigned"
 }
 tags = {
   environment = var.environment
 }
}

# These roles are needed to grant permissions for Backup Vault to retrieve data from the source MySQL Flexible Server
resource "azurerm_role_assignment" "vault_to_mysql_server_rg" {
 for_each = var.source_mysql_servers

 scope                = each.value.server_rg_id
 role_definition_name = "Reader"
 principal_id = azurerm_data_protection_backup_vault.backup.identity.0.principal_id
}

resource "azurerm_role_assignment" "vault_to_mysql_server" {
 for_each = var.source_mysql_servers

 scope                = each.value.id
 role_definition_name = "MySQL Backup And Export Operator"
 principal_id = azurerm_data_protection_backup_vault.backup.identity.0.principal_id
}

resource "azurerm_data_protection_backup_policy_mysql_flexible_server" "mysql" {
 for_each = var.source_mysql_servers

 name                            = "bkpol-${each.key}"
 vault_id                        = azurerm_data_protection_backup_vault.backup.id
 backup_repeating_time_intervals  = ["R/2026-01-05T07:00:00+00:00/P1D"] # Backup every 24 hours (once daily)

 #Retention rule for daily backups (store for 7 days)
 default_retention_rule {
   life_cycle {
     duration        = "P7D"
     data_store_type = "VaultStore"
   }
 }

 # Retention rule for weekend backups (store for 1 month)
 retention_rule {
   name     = "weekend-backup-rule"
   priority = 4

   criteria {
     absolute_criteria = "FirstOfWeek"
   }

   life_cycle {
     data_store_type = "VaultStore"
     duration        = "P1M"
   }
 }

 # Retention rule for monthly backups (store for 6 months)
 retention_rule {
   name     = "monthly-backup-rule"
   priority = 3

   criteria {
     absolute_criteria = "FirstOfMonth"
   }

   life_cycle {
     data_store_type = "VaultStore"
     duration        = "P6M"
   }
 }

 # Retention rule for quarterly backups (store for 1 year)
 retention_rule {
   name     = "quarterly-backup-rule"
   priority = 2

 criteria {
   months_of_year    = ["January", "April", "July", "October"]
   weeks_of_month    = ["First"]
   days_of_week      = ["Monday"]
 }
   life_cycle {
     data_store_type = "VaultStore"
     duration        = "P1Y"
   }
 }

 # Retention rule for yearly backups (store for 3 years)
 retention_rule {
   name     = "yearly-backup-rule"
   priority = 1

   criteria {
     absolute_criteria = "FirstOfYear"
   }
   life_cycle {
     data_store_type = "VaultStore"
     duration        = "P3Y"
   }
 }

depends_on = [
   azurerm_role_assignment.vault_to_mysql_server_rg,
   azurerm_role_assignment.vault_to_mysql_server,
 ]
}

resource "azurerm_data_protection_backup_instance_mysql_flexible_server" "mysql" {
 for_each = var.source_mysql_servers

 name             = "${each.key}"
 location         = var.location
 vault_id         = azurerm_data_protection_backup_vault.backup.id
 server_id        = each.value.id
 backup_policy_id = azurerm_data_protection_backup_policy_mysql_flexible_server.mysql[each.key].id
}

Звісно, просто робити бекапи — замало! Потрібно постійно тестувати їх, оновлювати runbook, по якому ви будете реанімувати свою базу в разі чого, напрацьовувати навички... Адже наявність резервної копії ще не означає, що ви можете ефективно і швидко її використати за потребою.

Може виникнути питання, навіщо робити ці бекапи, якщо такі ресурси, як Azure MySQL Flexible server вже «out-of-the-box» мають можливість «point-in-time» відновлення до того стану, якими вони були в будь-який момент часу раніше.

Відповідь: це не задовольняє вимогу мати бекапи в окремому захищеному місці з обмеженим доступом на випадок того, що ваші дані будуть скомпроментовані та пошкоджені. Крім того, це не вберігає від видалення всього серверу.

І от саме про такий кейс я і хочу вам розповісти.

Що робити, якщо випадково видалив базу даних на продакшені в Azure, а бекапів немає?

Насправді причин випадкового видалення бази може бути безліч. Починаючи з банального «переплутав, не те клацнув» та закінчуючи новим Terraform-кодом, який «forces replacement» ресурс через зміну значення immutable проперті.

І якщо від останнього кейсу вас може вберегти continuous-delivery реліз-стратегія (а також уважність при перегляді Terraform-плану) чи банальні terraform tests, то у випадку з «переплутав, не те клацнув» вельми маловірогідно, що блокування ресурсу за допомогою «management lock» зупинить максимально рішучу людину з девізом «Fail fast — recovery fast!»

І це ми не беремо до уваги вірогідність того, що така людина виявиться хакером з намірами видалити АБСОЛЮТНО ВСЕ.

Отож, баз немає, реплік немає, бекапів немає, то що ж тепер робити (в контексті Azure)?

Першим логічним рішенням буде спроба відновити нашу базу за допомогою «Restore Blade» в порталі Azure.

Але цей «Restore Blade» доступний лише для баз даних, які мають «Continuous» backup стратегію (тобто реплікуються системою Azure ‘неперервно‘ та можуть бути відновлені до будь-якого ‘point-in-time‘ снепшоту їхнього життя протягом останніх 7-ми або 30-ти днів), що цілком прогнозовано коштує більше грошей, ніж звичайний «Periodic» backup за розкладом.

Тож нам нічого не залишається робити, окрім як завести технічний тікет на відновлення бази до того моменту, коли був зроблений останній «Periodic» backup. На розгляд такого тікету може піти близько години часу, а ще слід врахувати той час, який піде на відновлення самих даних.

І навіть в цьому випадку може виникнути інша проблема (що якраз виникла в мого «товариша») — ви можете не мати відповідного «Support plan», що дає вам право на створення технічних тікетів. Тож ви зіткнетесь з таким обмеженням, довго чекатимете отримання «Owner» ролі задля можливості підвищення цього «Support plan», а потім виявиться, що ваша компанія/продукт «входить» в іншу компанію/групу_компаній, які «об’єднались» задля заключення спільного Service Agreement із Azure для подальшої економії коштів.

Якщо простими словами: ви не можете створити технічний тікет, тому що у вас немає відповідного «Support plan» для цього, але і «Support plan» ви змінити не можете, адже менеджер, відповідальний за спілкування по вашому Service Agreement, вже закінчив свій робочий день та не відповідає на ваші повідомлення... І що тепер?

Не знаю, як би ви вчинили в такій ситуації, але знаю, що робив би я. Тобто не я, а мій «товариш» з «вигаданої» історії.

Тож створювати технічні тікети ми не можемо... Але нам ніхто не забороняє створювати billing-тікети! І хоч на розгляд такого тікету йде до 8-ми РОБОЧИХ годин, я запевняю, що вказавши в ньому ваше «щире» бажання купити ресурсів на мільйон доларів, ви будете приємно вражені тією швидкістю, з якою вам зателефонують.

А там вже діло ваше, як ви поясните, чому вам перед купівлею ресурсів треба відновити базу даних на продакшені. Наприклад: немає бази — немає бізнесу — немає грошей — ніхто не купить ресурсів на мільйон доларів :)

P.S: Головне не кажіть, що ресурси ніхто купувати не збирається....

Сподобалась стаття? Підписуйтесь на автора, щоб отримувати сповіщення про нові публікації на пошту.

👍ПодобаєтьсяСподобалось10
До обраногоВ обраному1
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Best practices
бекапи бази на продакшені
pg_dump/pg_restore

як то кажуть, тут я сам винен що заплатив за Інтернет і це побачив...

Якраз щоб люди не робили pg_dump/pg_restore ця стаття і написана. Не розумію що вас смутило....

Таким чином ми маємо ~17 бекапів під кінець року, які покривають стан нашої бази за останні 365 днів

Не-а, мы имеем просто 17 состояний БД за последний год. Потому что, если тебе нужно будет состояние БД даже за один день вне этих 17 (не говоря уже о динамике за некоторый промежуток) — ты будешь иметь бледный вид :-)

використання Azure Backup Vault (чи його аналогів в інших клаудах) автоматично зменшує і кости

Не-а: 250 ГБ на Azure Blob Storage стоят $5.2/мес, а те же 250 ГБ бекапа Azure Backup Vault — $13.1/мес. Стоимость виртуалки для бэкапов можно проигнорировать: её нужно включать и, соответственно, платить только на время проведения бекапа, а много памяти и процессора ей не нужно -> это будет очень дешёвая VM.

якщо зловмисник видалить його разом з базою, використовуючи ті ж самі доступи, що і для бази?

Тогда статья мимо: в описанном тобой решении бэкапы, злоумышленно или по ошибке, удалит человек с теми же доступами, что их разворачивал :-)
Ну и от удаления облачного аккаунта (привет от UniSuper :-) ) решение не поможет :-)

1. Тобто ви хочете сказати, що вартістю такої VM можна знехтувати? А як же ви будете її включати/виключати, якщо ви хочете АВТОМАТИЗАЦІЮ процесів? Де ж тоді DevOps підхід і best practices? Виходить, ця віртуалка має мати cron, і працювати 24/7 ? Чи я не правий? Бо якщо ні — то що ж виходить, ви вручну все запускатимете і контролюватимете як виконується pg_dump/pg_restore зі швидкістю 2 равлика на годину? І, якщо мені пам’ять не підводить, то година роботи хорошого девопса коштує приблизно від $30-$50.... То, виходить, ваш варіант з вимиканням VM набагаааатоооо дорожчий.....
2. Як людина видалить бекапи, якщо створював їх Service principal ? Переплутає terraform apply з terraform destroy, і не буде дивитись в план?
3. Якщо навіть їх і видалять, то чим це страшно, коли не видалена оригінальна база (треба, виходить, вже ламати доступи до ДВОХ людей, бо в одному subscription права в одних людей/SP, а в іншому — в інших) ? «різний RBAC» має бути, як я писав...
4. З приводу видалення аккаунту — ну давайте за такою логікою взагалі нічого робити не будемо, все одно ж НЕ можна абсолютно від всього захиститись

людина тобі хоче сказати, що ти взагалі ніяким місцем не Senior не розумієш навіть якихось елементарних речей на кшталт RPO і схоже навіть не чув про Transaction Log

1. До чого тут RPO? Яке це має відношення до теми статті? Кількість в 17 бекапів взято для прикладу, і там про це сказано. Ви можете налаштовувати будь-яку періодичність, яка вам потрібна, як забажаєте. Ця стаття для того щоб показати суть підходу, а не для CtrlC+CtrV
2. Transaction Log наразі є в усіх основних клаудних базах з коробки, це і є механізм за допомогою якого реалізується «point-in-time», про який я писав. Але він ніяк вам не допоможе, якщо вам знесуть весь сервер.
Ну ладно я «ніяким місцем не Senior»..., а хто ж тоді ті люди, які придумали всі ці «Grandfather-father-son» схеми i Azure Backup Vault ?)

Ви можете налаштовувати будь-яку періодичність, яка вам потрібна, як забажаєте. Ця стаття для того щоб показати суть підходу

Оно-то, конечно, так, но зачем ты писал

~17 бекапів під кінець року, які покривають стан нашої бази за останні 365 днів

, если это прямой обман? Потому что

щоб мати змогу «рекурсивно» розбирати інциденти, пов’язані з даними, знайти стан бази, коли ці проблеми почались.

GFS-схема подходит только в ретроспективе последней недели. 1+ месяц тому — и ты не определишь даже длительное воздействие на данные в БД.

Ще раз повторюсь:
1. Для рекурсивних розборів існує опція «point-in-time» в усіх основних БД.
2. Вам ніхто не заважає збільшити періодичність бекапів. Кількість в 17 бекапів взята просто як приклад того, як можна «вписатись» в різні регуляторки, не витрачаючи всіх грошей світу.

КОМБІНАЦІЯ цих двох механізмів дає результат! І я в статті пишу про ОБИДВА !

1. Для рекурсивних розборів існує опція «point-in-time» в усіх основних БД.

Которая в Azure ограничена 35 днями назад.

Кількість в 17 бекапів взята просто як приклад того, як можна «вписатись» в різні регуляторки, не витрачаючи всіх грошей світу.

Замечание только о том, что утверждение

покривають стан нашої бази за останні 365 днів

— ложно: ты получаешь только 17 бэкапов в выбранных временных точках года. Соответствует такая стратегия регулированию или нет — надо смотреть на политику регулирования.

Кстати, было бы интересно почитать о требованиях GDPR и PCI DSS (в названии стандарта из 6 букв ты допустил две ошибки) к ретеншену бекапов.
Облегчу тебе задачу — таких требований эти стандарты, хоть ты на них и ссылаешься, не содержат :-)

Тобто ви хочете сказати, що вартістю такої VM можна знехтувати?

Я об этом прямо пишу, если ты не заметил:

Стоимость виртуалки для бэкапов можно проигнорировать
А як же ви будете її включати/виключати, якщо ви хочете АВТОМАТИЗАЦІЮ процесів?

Любая cron — задача, которая умеет управлять VM. Ты, походу не слышал о Azure Logic Apps или Azure Automation :-)
Ну и вишенкой на торте: какая ВМ тебе понадобится для бекапа БД родными средствами? А сколько она стоит за месяц непрерывной работы?
Это всё я к тому, что утверждение

автоматично зменшує і кости

является некоторым преувеличением и было бы неплохо хотя бы на пальцах показать как именно уменьшается стоимость резервных копий.

Як людина видалить бекапи, якщо створював їх Service principal ?

У тебя всё запускается из одного Terrafrom-кода, а значит все креды, чтобы похерить и БД, и бекапы имеет та учётка, под которой запускается деплой.

Якщо навіть їх і видалять, то чим це страшно, коли не видалена оригінальна база (треба, виходить, вже ламати доступи до ДВОХ людей, бо в одному subscription права в одних людей/SP, а в іншому — в інших) ? «різний RBAC» має бути, як я писав...

Ещё раз: одна учетка, под которой ты запускаешь свой код, имеет полный доступ и к БД, и к бекапам. Почему так — тебе, как сеньору, несложно будет понять :-)

З приводу видалення аккаунту — ну давайте за такою логікою взагалі нічого робити не будемо, все одно ж НЕ можна абсолютно від всього захиститись

Достаточно просто не хранить все яйца в одной корзине и не писать статьи о том, как это классно ;-)
Кстати, UniSuper спасло только то, что бекапы они хранили вне облака Google.

Azure Backup — ещё один инструмент со своими достоинствами и недостатками. Полезная статья — это не вольный пересказ документации Microsoft, но именно анализ сильных и слабых сторон, сравнение с другими решениями.

1.

Ещё раз: одна учетка, под которой ты запускаешь свой код, имеет полный доступ и к БД, и к бекапам. Почему так — тебе, как сеньору, несложно будет понять :-)

- гарна спроба, але в вас не вийшло!) Ви хочете наголосити, що SP має мати права і там і там, щоб мати змогу дати Azure Backup Vault необхідні ролі для читання з БД. І так, це дійсно правда — ви праві. Але є дві невеликі деталі: перша — існують такі RBAC ролі як «Reader» та «User Access Administrator», що не дають прав менеджити ресурси (і саме ці ролі має мати SP на продакшн базу). Друга деталь — є така штука як protected branch, і обмеження/правила самого CI/CD. Створюєте правило, що запуск пайплайни можливий ЛИШЕ з «prod» гілки, а git push в неї можливий лише після МR та 2-х апрувів від інших членів команди — і ви нічого випадково чи навмисно не «похерете» (треба лише прибрати «terraform destroy» опцію). А роль, яка ці CI/CD правила налаштовує — ховаєте за «Eligible assignments» в Azure РІМ з апрувом від членів команди (благо, з усіма основними CI/CD системами в Azure Entra Id вже є інтеграція").
І якраз в різних корзинах яйця по фіналу і лежать....
2. З точки зору ціни — так, згоден з тим, що тут не все однозначно, і ваші коменти є абсолютно валідними. Проте, процитую сам себе:

немає нічого кращого, на мою думку, ніж вже готові

.... Тобто, я не стверджую, що це 100% дешевше! Я натомість кажу, що, НА МОЮ ДУМКУ, всі ті зусилля і час, які ви витратите на створення самописних скриптів, деплой і мейнтененс віртуальних машин та стореджів (написання їх Terraform модулів, плюс ціну за їх хостинг), конфігурацію Azure Logic Apps/Azure Automation... — це все нівелює ті гроші, які ви зекономите на власній інфраструктурі.... Моя думка — дешевше буде написати за пів дня один єдиний Терраформ модуль для Azure Backup Vault і все....

існують такі RBAC ролі як «Reader» та «User Access Administrator», що не дають прав менеджити ресурси (і саме ці ролі має мати SP на продакшн базу)

Что мешает с ролью «User Access Administrator» выдать роль «Owner» любой учётке?

Створюєте правило, що запуск пайплайни можливий ЛИШЕ з «prod» гілки, а git push в неї можливий лише після МR та 2-х апрувів від інших членів команди... А роль, яка ці CI/CD правила налаштовує — ховаєте за «Eligible assignments» в Azure РІМ з апрувом від членів команди

Если у вас так классно настроена безопасность, что никакой хакер или «чайник» с кривым кодом никак не пролезет, то откуда берётся

безліч причин випадкового видалення бази.

? Ведь это невозможно в принципе. Как и твой практический кейс :-)

Тобто, я не стверджую, що це 100% дешевше!

А это кто писал:

зменшення часу на обслуговування цих речей за рахунок використання Azure Backup Vault (чи його аналогів в інших клаудах) автоматично зменшує і кости.

? Неужто не ты?

1. Так, саме так у мене безпека і налаштована. І ви вірно сказали, в мене:

никакой хакер или «чайник» с кривым кодом никак не пролезет

2. Інцидент з видаленням бази стався на чужому проєкті, де мене просили зробити міграцію ;)
3.

Что мешает с ролью «User Access Administrator» выдать роль «Owner» любойучётке?

Взагалі не актуально, адже дивіться пункт 1 вище (ви праві, такі махінації в мене «невозможно в принципе»!!!)
4. Вам не здається, що ви видираєте мої слова з контексту, і потім ними ж «маніпулюєте»? Чи мені тільки так здається?)
P.S: тяжко сперечатись з людиною, яка НЕ бачить слів «на мою думку»

такі махінації в мене «невозможно в принципе»!!!

А... Ну тогда зачем переживать за сохранность БД? Настроить процессы как у тебя — и всё, можно в ус не дуть, твой практический кейс становится не актуальным, а весь текст статьи после «Насправді причин випадкового видалення бази може бути безліч» можно не писать, ведь удалить БД «невозможно в принципе»!!! ©, :-)

P.S: тяжко сперечатись з людиною, яка НЕ бачить слів «на мою думку»

Тяжело пытаться убедить человека, который в своём тексте после «на мою думку» через несколько абзацев императивно пишет «автоматично зменшує і кости», давать хоть какое-то подтверждение своим словам :-)

Дякую гарна стаття, особливо про трюк із «гарячою лінією для бекапів», хитрість це гнучкість розуму!

Підписатись на коментарі