Ви не помічаєте блокування, коли панель управління зелена, а інженер з продажу все ще відповідає менше ніж за п’ять хвилин.
Ви помічаєте його, коли збій тягнеться довго, бо єдині, хто може це виправити — команда ескалації постачальника в іншому часовому поясі,
а ваш «стандартний експорт» виявляється ввічливо відформатованою запискою з вимогами.
Блокування рідко — це одне погане рішення. Це складні відсотки малих зручностей: пропрієтарні API, керовані додатки,
спеціальні драйвери, непрозорий білінг і контракти, написані так, ніби їх створював ентузіаст лабіринтів.
Що таке залежність від постачальника насправді (і чим вона не є)
Залежність від постачальника — це не «ми використовуємо продукт». Це «ми не можемо піти, не зазнавши серйозного простою, фінансового удару або порушення відповідності».
Різниця важлива, бо кожна серйозна система залежить від постачальників. Мета — не чистота. Мета — важіль впливу.
Три види блокування (і як розпізнати кожен)
-
Технічне блокування: пропрієтарні API, формати, драйвери або контрольні площини, що вбудовуються в ваш додаток і операції.
Ви розпізнаєте його, коли «міграція» означає «переписати». -
Економічне блокування: збори за виведення даних, довгострокові зобов’язання або моделі ціноутворення, що карають за переносимість.
Ви розпізнаєте його, коли фінансовий директор раптом з’являється на архітектурних нарадах. -
Операційне блокування: лише персонал постачальника може відлагодити певні режими відмови, або ваша команда втрачає розуміння системи, бо постачальник її приховує.
Ви розпізнаєте його, коли в каналі інцидентів з’являється фраза «чекаємо на постачальника».
Блокування не завжди зло. Часто це просто неоплачений борг.
Частина блокування — це свідома торгівля: «Ми приймаємо пропрієтарні фічі, бо швидкість важливіша за переносимість».
Це може бути раціонально — якщо ви врахуєте витрати виходу наперед, зберігатимете дані портативними та триматимете реальний шлях виходу.
Більшість команд нічого з цього не робить. Вони трактують «ми завжди зможемо мігрувати пізніше» як фічу, а не як проєкт.
Практичний евристичний тест: якщо ви не можете пояснити свій план виходу за десять хвилин, у вас немає плану виходу. У вас є надія.
Факти та історичний контекст для нарад
Трохи історії допоможе, бо блокування — не винахід сучасної хмари. Це стара схема в новому одязі.
Ось конкретні тези, які можна використати на нарадах, щоб впливати на рішення не з позиції страху.
-
1960–1970-ті: «запакування» IBM сформувало індустрію. Відділення програмного забезпечення від апаратного створило екосистему,
але також навчило постачальників, що контрольні площини та пропрієтарні інтерфейси — це влада. -
1980-ті: розквіт пропрієтарних варіантів Unix. Портативність існувала, але «портативне» часто означало
«перекомпілюй і молись», з поступовим впровадженням вендор-специфічних інструментів. -
1990-ті: масиви корпоративного зберігання стали екосистемами. Ви купували не просто диски; ви купували ПО управління,
реплікаційні функції і спеціальну прошивку — плюс ідею, що вихід буде неприємним. -
Початок 2000-х: віртуалізація зменшила деяке блокування і створила нове. Стало легше переміщувати робочі навантаження як VM,
але екосистеми гіпервізорів (плагіни для бекупу, драйвери, оркестрація) стали «липкими». - 2010-ті: хмара зробила портативність привабливою — доки не з’явилась гравітація даних. Перемістити обчислення зазвичай можна за вихідні. Перенести багато петабайт — це сезон, інколи цілий фінансовий рік.
-
Контейнери відродили мрію про портативність. Але справжнє блокування часто перемістилося в керовані контрольні площини
(IAM, керовані БД, додатки Kubernetes, пропрієтарні інструменти спостереження). -
API S3 став де-факто стандартом. Це допомогло портативності об’єктного сховища, але не охопило пов’язані
політики життєвого циклу, інтеграцію ідентифікації, івентинг та аналітику. -
«Open source» не означає автоматично «портативність». Керовані сервіси на базі open source все одно можуть вас прив’язати через
пропрієтарні розширення, моделі білінгу та операційну залежність від провайдера.
Перефразована ідея, приписувана Werner Vogels (CTO Amazon): Все ламається, весь час — тож проєктуйте під відмову як стандартний стан.
Блокування — це те, що відбувається, коли ви проєктуєте лише на успіх.
Режими відмов: де блокування вдаряє по операціях першими
1) Ваші дані «можна експортувати», але їх неможливо «використати»
Постачальники люблять слово «експорт». Експорт у якому форматі? З якими метаданими? З якими контрольними сумами? З якими гарантіями порядку?
Чи зберігає це ACL, часові мітки, версії об’єктів, блоки утримання, юридичні холди, контекст KMS та аудиторські сліди?
Якщо ваша історія відповідності залежить від цього — «експорт» без достовірності — це майбутнє порушення.
2) Контрольна площина стає одноточковою точкою відмови
Багато керованих сервісів операційно надійні, поки не настане день, коли контрольна площина збійне.
Якщо ви не можете обертати креденшали, створювати томи, пересаджувати ноди, переглядати метрики або відкривати запити підтримки через проблеми з SSO — вітаю,
ваш план реагування на інциденти тепер залежить від веб-інтерфейсу.
3) «Кероване» означає «у вас немає ручок, які потрібні під час інциденту»
У випадку інциденту зі сховищем вам потрібні обмежувачі IOPS, контроль глибини черги, обмеження по орендарю, видимість відставання реплікації
і можливість ізолювати галасливих сусідів. У керованому сервісі ці ручки можуть існувати лише як «зверніться в підтримку».
Це не ручка. Це тікет.
4) Білінг — прихований ризик доступності
Платежі за egress та за запити можуть змінити архітектурні рішення під тиском. Команди починають робити небезпечні речі — наприклад відключати реплікацію,
відкладати стиснення логів або розтягувати вікна збереження — бо хтось злякався несподіваного рахунку.
Коли вартість стає сюрпризом, надійність стає предметом переговорів.
Жарт №1: Блокування постачальником — як мінібар у готелі: ви не помічаєте ціни, поки не станете вже спраглими й без варіантів.
5) Втрата навичок: команда перестає розуміти, як працює система
Блокування — це не лише про технології. Це про пізнавальний аспект. Якщо «чорна скринька» постачальника працює «добре» два роки, команда забуває,
як запустити її еквівалент самостійно. Потім постачальник змінює умови, знищує фічу або має регіональний інцидент. Раптом ви мігруєте
з командою, що втратила необхідні навички.
6) У таймлайні інциденту з’являється «закупівля»
Коли ваш план DR потребує екстреної ліцензії, переукладення або затвердження від менеджера акаунта постачальника — у вас немає DR-плану.
У вас є мотиваційний плакат.
Три короткі історії з корпоративного фронту
Міні-історія №1: Відмова через хибне припущення (пастка «стандартного API»)
Середній фінтех перебудував конвеєр документів навколо «S3-сумісного» об’єктного сховища від спеціалізованого постачальника, який обіцяв
низьку затримку й інтегровані функції відповідності. Команда розробки була обережною: вони використовували S3 SDK, уникали вендор-специфічних кінцевих точок
і навіть писали інтеграційні тести проти локального емулювальника S3. Вони вважали це портативним.
Потім юридичний відділ попросив повний експорт підмножини об’єктів з доказами незмінності — версії об’єктів, режим збереження і журнали доступу — через аудит.
Команда припустила, що може витягнути це через стандартні S3 API. Постачальник дійсно підтримував базові об’єктні API, звісно. Але ланцюжок доказів відповідності
знаходився в пропрієтарних сервісах метаданих і в пропрієтарному пайплайні аудиту.
Експорт «даних» був простим. Експорт «даних плюс доказів» — ні. Вони витратили дні, збираючи ланцюжок відповідальності вручну,
парсивши CSV-дампи від постачальника та сперечаючись про точність часових міток. Тим часом реліз був заблокований, бо відділ відповідності не підписався.
Помилка була не в технічній некомпетентності. Це було припущення: «Якщо API даних стандартний, то й операційна семантика стандартна».
Вона такою не є. S3-сумісність може покривати читання й запис, у той час як усе, що важливо в регульованих середовищах — збереження, юридичні холди, аудит-трейси, управління ключами — лишається пропрієтарним.
Виправлення було болючим, але прояснюючим: вони визначили «контракт портативності» для сховища, включно з тим, які метадані мають бути екстраговані,
у якому форматі й як це буде валідовано. Вони також почали дзеркалити журнали відповідності в незалежну систему під своїм контролем, навіть якщо постачальник зберігав об’єкти.
Більше витрат. Значно більше важеля впливу.
Міні-історія №2: Оптимізація, що обернулась проти (інцидент «використаємо магічну фічу постачальника»)
Компанія електронної торгівлі мала велику ферму PostgreSQL і багато читальних навантажень. Вони перейшли на керовану БД і відразу закохались
у фічу від постачальника: майже нульова конфігурація для масштабування читань з пропрієтарними репліками для читання та прозорим шаром маршрутизації.
Продуктивність покращилася. Команда святкувала. Потім вони розслабились: направили читально-важкі навантаження, аналітичні запити та навіть деякі критичні API-ендпоінти
через маршрутизатор постачальника. Це було зручно. Це також стало новою залежністю, що не була видима в коді застосунку.
Під час регіонального мережевого інциденту шар маршрутизації деградував у спосіб, який не виглядав як проблема бази даних. З’єднання приймалися, а потім зависали.
Таймаути множилися. Додаток автоскейлився, погіршуючи ситуацію. У їхньому рукбуці було написано «переключитись на самоуправляємі репліки». Але додаток
більше не мав простого рядка підключення для цього. Роутер став контрактом.
Вони вийшли з ситуації, додавши явний шар доступу до бази в платформу: кінцеві точки підключення були абстраговані за внутрішнім DNS,
і маршрутизатор постачальника став однією з реалізацій, а не єдиною. Вони також додали аварійний шлях «прямо до primary» і тестували його щоквартально.
Урок: оптимізації, що забирають ручки з ваших рук — не оптимізації. Це передача зовнішньому управлінню вашої здатності імпровізувати.
Міні-історія №3: Нудна, але правильна практика, яка врятувала ситуацію (перемога «репетиції виходу»)
SaaS у сфері охорони здоров’я використовував мікс хмарних сервісів і on‑prem сховища, і у них була глибоко непрезентабельна правило: щоквартально
робити «репетицію виходу» для однієї критичної залежності. Не повна міграція. Репетиція. Мета була довести, що можна перемістити репрезентативний фрагмент продакшен-даних,
валідовати його та запустити ключове навантаження в іншому середовищі.
Вони підтримували другий конфігурацію identity provider у «холодному стендбаї», тримали Terraform-модулі провайдер-агностичними де можливо,
і зберігали матеріал ключів шифрування так, щоб його можна було відновити поза одним хмарним KMS. Вони також записали нудні дрібниці:
які квоти сервісів потрібні для попереднього погодження, які зміни DNS потрібні і які команди мають надати підпис.
Одного року їхній основний хмарний провайдер мав інцидент контрольної площини, що блокував провізіювання і ламав частини їхнього CI/CD.
Не катастрофа, але це тривало бізнес-години, а у сфері охорони здоров’я це довго бути «сумнівно недоступним».
Їхня реакція не була героїчною. Вона була процедурною. Вони переключили підмножину робочих навантажень клієнтів на альтернативне середовище за допомогою попередньо спланованих ваг DNS,
відновили з безперервно реплікованих бекапів і зберегли роботу системи. Ніхто не писав вірусний постмортем. Ось у чому суть.
Нудна практика, яка їх врятувала, була щоквартальною вправою, яку колись ставили під сумнів керівники. Після цього інциденту ніхто більше не сумнівався.
Плейбук швидкої діагностики: знайдіть вузьке місце, перш ніж звинувачувати постачальника
Коли все йде не так, блокування постачальником підсилює паніку, бо зменшує ваші варіанти. Ваше завдання — відокремити
«система повільна» від «ми в пастці». Ось швидкий порядок триажу, який я використовую в продакшені.
Перше: підтвердіть радіус ураження і чи це контрольна чи дата-площина
- Симптоми контрольної площини: не можна створювати ресурси, не можна змінювати конфіг, зламаний auth/SSO, панелі недоступні, API викликають помилки швидко.
- Симптоми дата-площини: читання/записи таймаутяться, стрибки латентності, зростає відставання реплікації, пропускна здатність падає.
Друге: ідентифікуйте клас вузького місця
- Мережа: втрата пакетів, невідповідність MTU, проблеми TLS, дивні маршрути між регіонами, насичені лінки.
- Сховище: обмеження IOPS/пропускної здатності, глибина черги, тротлінг, галасливий сусід, зворотний тиск реплікації.
- Обчислення: CPU steal, тиск пам’яті, паузи GC, виснаження пулів потоків, обмеження ядра.
- Ліміти сервісів: квоти, rate limit-и, обмеження з’єднань, API-тротлінг.
- Поведінка додатка: шторм повторів, thundering herd, поганий rollout, неефективні запити.
Третє: вирішіть, чи потрібен аварійний вихід зараз
Аварійний вихід — це не «мігрувати все». Це «швидко зменшити залежність». Приклади:
переключити читання на кешовані відповіді, переключитись на простіший DB-ендпоінт, тимчасово зупинити некритичні записи,
або маршрутизувати завантаження об’єктів через CDN під вашим контролем замість кінцевої точки постачальника.
Жарт №2: Кращий час спроєктувати стратегію виходу був минулого року. Другий кращий — до того, як ваш пейджер почне складати поезію.
Практично: 14 реальних завдань для вимірювання блокування і плану виходу
Це навмисно практично. Кожне завдання містить: команду, реалістичний вивід, що це означає і яке рішення ухвалювати.
Запускайте їх на репрезентативному хості (або в CI) і вставляйте результати в нотатки архітектури.
Завдання 1: Проведіть інвентар пропрієтарних агентів і демонів постачальника
cr0x@server:~$ systemctl list-units --type=service --state=running | egrep -i 'agent|vendor|backup|snap|replic|monitor' | head
vendorx-agent.service loaded active running VendorX Node Agent
backup-appliance-connector.service loaded active running Backup Appliance Connector
node-exporter.service loaded active running Prometheus Node Exporter
Що це означає: У критичному шляху щонайменше один вендор-специфічний агент. Це не обов’язково погано, але це залежність.
Рішення: Для кожного пропрієтарного сервісу задокументуйте: що зламається, якщо він зупиниться, як його видалити і що замінить його функцію.
Завдання 2: Визначте модулі ядра/драйвери, що прив’язують вас до платформи
cr0x@server:~$ lsmod | egrep -i 'nvme|virtio|vendor|mlx|zfs' | head
nvme 57344 2
virtio_net 45056 0
mlx5_core 942080 0
zfs 4157440 3
Що це означає: Стандартні модулі — норм. Вендор-специфічний модуль ядра — це ризик міграції (інші ядра, підпис, підтримка).
Рішення: Якщо ви бачите вендор-драйвер, заплануйте тест завантаження без нього в стейджінгу і валідовування продуктивності/функціональності.
Завдання 3: Квантифікуйте гравітацію даних (скільки треба перемістити)
cr0x@server:~$ df -hT | egrep -v 'tmpfs|overlay'
Filesystem Type Size Used Avail Use% Mounted on
/dev/nvme0n1p2 ext4 1.8T 1.2T 530G 70% /
/dev/nvme1n1 ext4 7.0T 6.6T 110G 99% /data
Що це означає: 6.6T «гарячих» даних — це не «просто скопіювати». Це час, пропускна здатність і валідація. При 200 MB/s ефективно це ~9.2 години мінімум, без перевірки та повторів.
Рішення: Класифікуйте набори даних: треба мігрувати, можна відтворити, можна видалити. Плани виходу виграють тим, що ви видаляєте дані, а не копіюєте їх.
Завдання 4: Виміряйте реальну продуктивність диска проти очікувань
cr0x@server:~$ fio --name=randread --filename=/data/fio.test --size=8G --direct=1 --rw=randread --bs=4k --iodepth=32 --numjobs=4 --runtime=30 --time_based --group_reporting
randread: (groupid=0, jobs=4): err= 0: pid=2213: Tue Feb 4 10:21:31 2026
read: IOPS=58.2k, BW=227MiB/s (238MB/s)(6815MiB/30001msec)
slat (usec): min=3, max=612, avg=12.1, stdev=6.3
clat (usec): min=121, max=48912, avg=2188.4, stdev=1330.2
lat (usec): min=138, max=48926, avg=2200.9, stdev=1330.5
Що це означає: Тепер ви можете порівняти виміряні IOPS/латентність з заявами постачальника та з вашими SLO. Висока хвостова латентність (max ~49ms) може зашкодити базам даних.
Рішення: Якщо хвостова латентність висока, не приймайте платформену функцію, що передбачає прогнозовану латентність сховища (деякі керовані рівні БД так роблять).
Завдання 5: Виявіть тротлінг сховища або IO wait під навантаженням
cr0x@server:~$ iostat -xz 1 5
avg-cpu: %user %nice %system %iowait %steal %idle
12.30 0.00 3.10 24.80 0.00 59.80
Device r/s w/s rkB/s wkB/s await svctm %util
nvme1n1 820.0 410.0 98000 42000 18.4 0.9 98.7
Що це означає: Високий %util і високе await свідчать, що пристрій насичений або тротлиться. Якщо цей пристрій «керований», у вас може не бути ручок.
Рішення: Якщо насичення часте, плануйте шлях міграції до сховища, де можна масштабувати IOPS незалежно або додати кешування.
Завдання 6: Перевірте файлові системи та опції монтування, що можуть блокувати портативність
cr0x@server:~$ findmnt -no TARGET,SOURCE,FSTYPE,OPTIONS /data
/data /dev/nvme1n1 ext4 rw,noatime,nodiratime,discard
Що це означає: Опції монтування як discard, noatime — портативні; але деякі файлові системи (або фічі як reflinks, стиснення) можуть змінювати вимоги до інструментів міграції.
Рішення: Стандартизуйтесь на портативних можливостях файлової системи для «переносимих» даних; зарезервуйте складні фічі для даних, які можна відновити заново.
Завдання 7: Підтвердіть, що ви можете експортувати і відновити базу даних логічно
cr0x@server:~$ pg_dump --format=custom --file=/tmp/appdb.dump --dbname=postgresql://app@db01/appdb
pg_dump: dumping contents of database "appdb" ...
pg_dump: finished
Що це означає: Логічні дампи портативні в багатьох середовищах (з застереженнями). Якщо pg_dump занадто повільний або занадто великий — ви покладаєтесь на фізичні снапшоти, часто прив’язані до постачальника.
Рішення: Якщо ви не можете завершити логічний дамп у вашому RTO/RPO, інвестуйте в логічну реплікацію або шаблони dual-write перед тим, як вас змусить міграція.
Завдання 8: Перевірте, чи ваша інфраструктура прив’язана до одного провайдера через Terraform state і провайдери
cr0x@server:~$ terraform providers
Providers required by configuration:
.
├── provider[registry.terraform.io/hashicorp/aws] ~> 5.0
├── provider[registry.terraform.io/hashicorp/kubernetes] ~> 2.0
└── provider[registry.terraform.io/hashicorp/helm] ~> 2.0
Providers required by state:
provider[registry.terraform.io/hashicorp/aws]
Що це означає: Якщо стейт домінує один провайдер, міграція вимагає або імпорту в новий стейт, або перебудови — обидва ризиковані під тиском часу.
Рішення: Введіть межу абстракції: модулі, що можуть таргетити різні бекенди, і розділяйте стейти по середовищах та класах залежностей.
Завдання 9: Визначте образи контейнерів, прив’язані до реєстру постачальника або базового образу
cr0x@server:~$ crictl images | head
IMAGE TAG IMAGE ID SIZE
vendor.registry.local/platform/app 1.42.0 9b1d0c4a2f3e 312MB
docker.io/library/nginx 1.25 e34f3c9c7b7a 187MB
Що це означає: Залежність від реєстру постачальника може стати продакшен-аутажем, якщо авторизація зламається або реєстр впаде.
Рішення: Дзеркаліть критичні образи в реєстр під вашим контролем і фіксуйте по digest для відтворюваності.
Завдання 10: Підтвердіть, чи ваш Kubernetes кластер залежить від вендор-специфічних CRD/контролерів
cr0x@server:~$ kubectl get crd | egrep -i 'vendor|ingress|certificate|backup' | head
backups.vendorx.io
snapshots.vendorx.io
certificaterequests.cert-manager.io
Що це означає: Вендорські CRD підказують, що ваші робочі навантаження і бекапи можуть не бути портативними «як є».
Рішення: Віддавайте перевагу upstream API (CSI snapshots, стандартний Ingress), де можливо; для вендорських CRD задокументуйте відповідність і карту міграції.
Завдання 11: Перевірте CSI драйвери та класи зберігання на предмет портативності
cr0x@server:~$ kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION
fast-ssd csi.vendorx.io Delete WaitForFirstConsumer true
standard kubernetes.io/no-provisioner Delete Immediate false
Що це означає: Вендорський CSI provisioner може прив’язати життєвий цикл PV і механіки снапшот/відновлення.
Рішення: Переконайтеся, що ви можете відновити дані PV поза кластером (бекап на рівні файлів) і що ви протестували перенесення stateful навантаження на інший CSI бекенд.
Завдання 12: Переконайтеся, що бекапи реально відновлюються без апарату постачальника
cr0x@server:~$ borg list /backup/borg::appdb-2026-02-04
appdb-2026-02-04 Tue, 2026-02-04 02:00:02 [d2d84c4c7b3a] 18.42 GB
Що це означає: Це незалежний, файловий формат бекапу, який можна відновити будь-де, де можна запустити borg. Якщо ваші бекапи відновлюються лише через UI постачальника — ви заблоковані.
Рішення: Вимагайте принаймні одного шляху бекапу, незалежного від постачальника, і тестуйте CLI-відновлення.
Завдання 13: Оцініть експозицію egress, вимірявши вихідний трафік
cr0x@server:~$ sar -n DEV 1 3 | egrep 'IFACE|eth0'
IFACE rxpck/s txpck/s rxkB/s txkB/s
eth0 1420.00 1890.00 9820.50 21540.25
eth0 1411.00 1922.00 9750.10 21910.80
eth0 1468.00 1855.00 10020.90 21010.40
Що це означає: Ваш стійкий вихідний показник ~21 MB/s (txkB/s). Помножте на години/день і приблизно прикиньте місячний egress, якби довелося виводити дані або обслуговувати трафік між зонами.
Рішення: Якщо egress — матеріальна стаття витрат, додайте кешування/CDN, стискайте відповіді і проєктуйте для локальності перед тим, як вам знадобиться вихід.
Завдання 14: Знайдіть вендор-специфічні кінцеві точки, захардкоджені в конфігах
cr0x@server:~$ grep -R --line-number -E 'vendorx|\.cloudprovider\.internal|kms|s3-' /etc /opt/app 2>/dev/null | head
/opt/app/config.yaml:17: endpoint: https://s3-us-east-1.cloudprovider.internal
/opt/app/config.yaml:22: kms_key_id: arn:cloud:kms:us-east-1:acct:key/1234abcd
/etc/systemd/system/vendorx-agent.service:5:ExecStart=/usr/local/bin/vendorx-agent --region us-east-1
Що це означає: Жорстко захардкоджені кінцеві точки і ідентифікатори KMS — міни для міграції. Вони гарантують сюрпризи.
Рішення: Перенесіть це в шар інденції: DNS-імена під вашим контролем, змінні конфігурації з перехресними оверрайдами середовищ і систему секретів, яка може переключати бекенди.
Типові помилки: симптом → коренева причина → виправлення
1) Симптом: «Ми не можемо переключитись, бо керований сервіс не дозволяє змінити X»
Коренева причина: Ви проєктували навколо контрольної площини, якою не володієте (IAM, маршрутизація, провізія) і не зберегли ручний шлях.
Виправлення: Тримайте задокументований break‑glass шлях: статичні креденшали в безпечному сховищі, альтернативні кінцеві точки та протестована процедура запуску основних навантажень з меншим набором фіч.
2) Симптом: «Експорт пройшов, але відновлена система не має дозволів/історії версій»
Коренева причина: Ви експортували об’єкти/рядки, але не семантику (ACL, збереження, аудит-трейси, розширення схеми, тригери, користувачі).
Виправлення: Визначте маніфест експорту: дані + метадані + валідація. Проводьте відновлювальні репетиції, що перевіряють безпеку, а не лише контрольні суми.
3) Симптом: «Оцінки міграції постійно зсуваються; ми відкриваємо приховані залежності»
Коренева причина: Немає графа залежностей. Команди неформально використовували SDK і платформенні фічі постачальника.
Виправлення: Побудуйте інвентар: SDK, API, CRD, IAM-політики, KMS-ключі, DNS-імена, мережеві залежності та операційні рукбуки. Зробіть це частиною рев’ю змін.
4) Симптом: «Витрати під час інцидентів зростають; керівництво вимагає ризикових урізань»
Коренева причина: Модель ціноутворення пов’язана з діями з надійності (egress для DR, міжрегіональна реплікація, додаткові логи, додаткові читання).
Виправлення: Попередньо затвердіть бюджет на надійність. Розглядайте DR-трафік як резервну ємність, а не як сюрприз.
5) Симптом: «Підтримка каже, що це наша помилка, ми кажемо — їхня, нічого не рухається»
Коренева причина: Немає спільної спостережуваності. Ви не можете надати докази, бо телеметрія захована в їхній платформі.
Виправлення: Експортуйте метрики/логи/трейси в систему під вашим контролем (або дуплюйте). Під час інциденту докази перемагають суперечки.
6) Симптом: «Ми не можемо змінити провайдерів, бо наш IaC прив’язаний до провайдера»
Коренева причина: Terraform-модулі відображають примітиви одного провайдера, а не намір вашої платформи.
Виправлення: Перепишіть модулі навколо наміру («мережа», «кластер», «db», «об’єктне сховище») і тримайте реалізації провайдера за інтерфейсами. Розділяйте state‑файли.
7) Симптом: «Бекапи зелені, але відновлення лякає»
Коренева причина: Бекапи покладаються на пропрієтарні формати снапшотів або апарати без незалежних інструментів відновлення.
Виправлення: Додайте принаймні один портативний бекап: файл‑рівневий, логічні дампи або відкриті формати, і запускaйте відновлення за розкладом. Ставте час відновлення як SLO.
8) Симптом: «Наш додаток не може працювати поза цією хмарою через припущення IAM/KMS»
Коренева причина: Ідентичність і шифрування реалізовані через провайдер-специфічні конструкти, прямо згадані в коді/конфігах.
Виправлення: Запровадьте внутрішню абстракцію ідентичності (межі OIDC/SAML) і абстракцію ключів (envelope encryption з можливістю rewrap). Використовуйте інденцію для ідентифікаторів.
Чеклісти / покроковий план: як чисто вирватися
Крок 1: Визнайте, до чого ви прив’язані (інвентар + класифікація)
- Шар даних: бази даних, об’єктне сховище, блочне сховище, системи бекапу, черги.
- Контрольна площина: IAM, KMS, DNS, секрети, CI/CD, управління Kubernetes.
- Операційний шар: спостереження, інструменти інцидентів, робочі процеси on‑call, рукбуки, контракти підтримки.
Складіть просту таблицю для кожної залежності:
що вона робить, хто від неї залежить, як працювати без неї 24 години,
як виглядає вихід, які дані мають переміститись.
Крок 2: Визначте стандарти «портативні за дизайном»
- Протоколи: віддавайте перевагу стандартним протоколам і API (PostgreSQL wire protocol, S3 core API, CSI, OIDC).
- Формати: використовуйте експортовані формати (Parquet/CSV там, де доречно, логічні дампи БД, відкриті формати бекапу).
- Ідентифікатори: уникайте хардкодження ARN/ID постачальника в конфігах; використовуйте шар інденції.
- Секрети і ключі: проєктуйте для rewrap ключів і можливості змінити бекенд секретів.
Крок 3: Побудуйте «бюджет виходу» і отримайте його затвердження
Виходи коштують грошей: додаткове сховище для dual-write, додаткова пропускна здатність для реплікації, додаткові середовища для репетицій.
Розглядайте це як страхування. Якщо керівництво хоче портативності — керівництво фінансує портативність.
Крок 4: Оберіть патерн архітектури виходу (виберіть один, не змішуйте)
-
Cold standby: мінімальні ресурси десь ще; відновлення з бекапів.
Дешево, повільний RTO. Підходить для несексуальних сервісів. -
Warm standby: репліковані дані + періодично тестовані робочі навантаження.
Баланс вартості і швидкості. Часто найкращий дефолт. -
Active-active: подвійний запуск між провайдерами/регіонами.
Дорого й операційно складно. Варто робити для невеликої кількості критичних систем.
Крок 5: Зробіть портативність тестованою
Ви не можете керувати тим, чого не тестуєте. Додайте CI‑перевірки, які провалюють білд, коли хтось вводить хардкоджений ендпоінт,
вендор-специфічну API‑фічу або непортативну CRD‑залежність без явного винятку.
Крок 6: Виконайте поетапну міграцію (чистий підхід)
- Репетиція в не-проді: доведіть механіку відновлення і переключення.
- Міграція шляху читання першою: реплікуйте дані, обслуговуйте читання, валідовайте коректність.
- Впровадьте dual-write або change-data-capture: тримайте системи синхронними протягом контрольованого періоду.
- Переключіть записи: коротке вікно фризу, якщо потрібно; тримайте план відкату.
- Запустіть паралельну валідацію: порівняйте підрахунки, контрольні суми, вибіркові тести та бізнес-метрики.
- Декомуйнуйте обережно: тримайте визначене вікно збереження, потім приберіть доступ і витрати.
Крок 7: Інституціоналізуйте нудні практики
- Щоквартальні репетиції виходу для однієї залежності.
- Тести відновлення з виміряним RTO/RPO.
- Інвентар залежностей як частина архітектурного рев’ю.
- Чекліст при перегляді контрактів: допомога при припиненні, формати й терміни експорту даних, SLA підтримки під час припинення, положення про зміни цін.
FAQ
1) Чи означає мультихмара уникнення блокування?
Ні. Мультихмара може зменшити деякі види блокування, але також подвоїти вашу операційну складність і створити «блокування у власному безладі».
Краще цілитися в «здатність вийти»: ви можете піти у визначений час/за витратами.
2) Який найшвидший спосіб зрозуміти, чи ми прив’язані до керованої бази даних?
Спробуйте відповісти на три питання з доказами: Чи можете ви зробити логічний експорт/імпорт у потрібному масштабі? Чи можна запустити той самий рушій десь ще без втрати фіч?
Чи можете ви експлуатувати його (моніторинг, бекапи, failover) без консолі постачальника?
3) Чи «керовані сервіси на базі open source» захищають від блокування?
Більш безпечно, але не гарантовано. Вас все ще можуть прив’язати пропрієтарні розширення, операційні залежності або непрозорий білінг.
«Open source» зменшує одну категорію ризику: доступ до коду. Воно не дає автоматичну портативність операцій.
4) Які умови контракту дійсно важливі щодо блокування?
Допомога при припиненні, формати та терміни експорту даних, відповідь підтримки під час припинення, положення про зміни цін, передбачуваність egress-витрат,
і що станеться з ключами/логами/аудит-трейсами після припинення. Також: наскільки швидко можна підняти ліміти і чи потрібно для цього людське погодження.
5) Яка найбільша технічна пастка блокування в Kubernetes?
Вендор-специфічні CRD для основних робочих процесів (ingress, бекапи, політики, мережа) і пропрієтарні снапшоти сховища. Вони просочуються в маніфести і рукбуки.
Використовуйте upstream API де можливо і ставтесь до CRD як до коду, який доведеться мігрувати пізніше.
6) Як зменшити біль від egress без переписування всього?
Агресивно кешуйте, стискайте відповіді, тримайте дані локально до обчислень, уникайте балакучого міжрегіонального трафіку і використовуйте стратегії реплікації, що мінімізують повні перечитування.
Також: виміряйте вихідний трафік зараз, щоб потім вести переговори з фактами.
7) Який реалістичний термін «чистого виходу»?
Для помірних систем: тижні‑місяці. Для багатопетабайтних, регульованих господарств: квартали. Блокуючий фактор зазвичай — валідація даних і операційний паритет,
а не копіювання байтів.
8) Як утримати інженерів від використання пропрієтарних фіч?
Не покладайтесь на відчуття. Створіть політику портативності: які фічі дозволені, які вимагають явного погодження і який план виходу для них.
Додайте CI‑перевірки, що виявляють хардкоджені ендпоінти і вендор-API, і робіть винятки видимими.
9) Яка мінімально життєздатна стратегія виходу для маленької команди?
Портативний бекап, який можна відновити без постачальника, DNS‑інденція для кінцевих точок, визначення інфраструктури в VCS
і одна щоквартальна репетиція відновлення. Ви можете бути маленькими і все одно важко піддаватися пасткам.
Висновок: наступні кроки, які можна зробити цього тижня
Залежність від постачальника — це не моральна провина. Це прогнозований результат, коли зручність накопичується, і ніхто не оцінює вартість виходу.
Виправлення — не «ніколи не використовувати керовані сервіси». Виправлення — зберігати важіль: портативні дані, портативні операції і контракти, що не карають за вихід.
Зробіть ці кроки по порядку
- Запустіть інвентарні завдання вище на одному репрезентативному продакшен-хості та одному кластері. Створіть список залежностей, який можна захистити.
- Виберіть одну критичну залежність (база даних, об’єктне сховище, ідентифікація, бекапи) і заплануйте репетицію виходу протягом 30 днів.
- Додайте один портативний шлях бекапу, якщо його ще немає, і відновіть його в чистому середовищі.
- Запровадьте інденцію: DNS‑імена під вашим контролем, конфігураційно керовані кінцеві точки і процедура break‑glass доступу.
- Запишіть SLO виходу: «Ми можемо покинути цього постачальника за X днів за Y витрат з Z простоєм.» Потім зробіть це правдою.
Якщо ви нічого не робите більше: зробіть ваші дані незалежно відновлюваними і практикуйте це. Решта — обговорюване.