Миграция подписок в Azure–EA to CSP, PaYG to CSP и т.п.–часть 1, какая боль–теоретическая и политическая…


О сколько нам проблемок чудных готовит Microsoft’а дух!
И Windows, дитя ошибок трудных,
И Azure, парадоксов друг…
А.С.Пушкин, 2020

Еще немного про работу, ИТ и политику Microsoft по отношению к клиентам и партнерам – будет, скорее всего, в нескольких частях – эта часть первая, вступительная, рассказывающая о самой проблеме, которую Microsoft запросто создал на пустом месте и которую теперь приходится решать с огромными затратами сил.

И эта проблема называется – миграция в Azure. Нет, не та миграция, которая Lift-and-Shift и прочие там сценарии, когда вы берете локальные сервисы и мигрируете их в Ажур – это достаточно просто и вполне понятно с точки зрения логики и бизнеса.

Речь идет о другой миграции – внутри Azure – между разными подписками. Например, вы начали с Pay-as-you-Go и проект удался и вам теперь захотелось перейти на нормальную подписку типа CSP с договором и реквизитами (а не просто платить с чьей-то кредитки). Или, как вариант, с грабительского контракта AE на CSP в Azure.

И вот тут, оказывается, вы попали… У вас будет куда больше технических проблем с миграцией между двумя подписками внутри Azure, нежели с переносом локальных сервисом в Azure. Хотя, казалось бы – чего тут сложного с точки зрения миграции – просто переписать ID объектов – поменять в строке GUID старой подписки на GUID новой – и все…

НО НЕТ! ЭТО БЫЛО БЫ СЛИШКОМ ПРОСТО! Хотя бы потому, что Microsoft, создавая Azure десять лет назад – о таком даже и не думал, пытаясь загнать всех пользователей под одну, только ему удобную бизнес-модель, а индусы, которые все это кодили – вообще не склонны к созданию качественного продуманного продукта с универсальной архитектурой для будущего развития.

ИТАК, если вы вдруг в своей организации решите перейти с одной подписки в Azure на другую (EA to CSP, PaYG to CSP и наоборот), главное, что вы должны знать – это то, что любой технический «специалист» Microsoft, который скажет вам «это просто – там есть специальная кнопочка Move» – нажали и все перенеслось без остановки – или просто не является «техническим специалистом» и никогда не выполнял миграцию EA to CSP, или просто врет – потому гоните его от себя «ссаными тряпками» и пусть возвращается, только когда мигрирует минимум десяток разнообразных подписок с разными типами объектов в них. Да и вообще, как показал опыт, у Microsoft в «полях» ни одного такого «специалиста» просто нет.

В чем реальная проблема миграции EA to CSP или Pay-as-You-Go to CSP (и наоборот)? – правильно, в абсолютной непродуманности архитектуры Azure на этот счет и массе технических ограничений Azure для такой миграции. Давайте разберемся, каких именно и как эти ограничения можно обойти:

1. Все объекты служб, созданные из образов Azure Marketplace, не могут быть перенесены из-за технических ограничений Azure. К сожалению, вы не можем проверить наличие или возможность миграции этих объектов с помощью скриптов (с технической точки зрения они являются обычными объектами Azure и отличаются только способами оплаты на уровне подписки). Итак, вы должны знать свою инфраструктуру и идентифицировать подобные объекты «вручную». Как правило, это:

a. разные виртуальные сетевые устройства, такие как F5, CheckPoint, Cisco и прочие межсетевые экраны/шлюзы/маршрутизаторы

b. предварительно настроенные виртуальные машины с приложениями сторонних производителей, такими как CRM, ERP, CMS – например, виртуальные машины с веб-сайтами WordPress и т.д.,

c. Некоторые службы, такие как шлюзы SMTP/SMS/Мобильные уведомления и т.д. – например, SendGrid для отправки электронной почты непосредственно из приложений.

2. Все службы приложений Azure (веб-сайты Azure, Azure App Services) должны быть помещены в исходные группы ресурсов (Resource Groups), в которых они были созданы. Если какая-либо служба приложений была перемещена в другую группу ресурсов, а исходная группа ресурсов была удалена – невозможно перенести эту службу приложений Azure в другую подписку. Если изначальная группа ресурсов еще существует – достаточно вернуть приложение в оригинальную группу. Это связано с ограничениями самой архаичной архитектуры Azure App Services, которая не менялась в Azure еще со времен так называемого Classic Azure – Azure App Services привязаны к так называемому «штампу» в датацентре, который на уровне объекта прописан, как web space – это строка URL, которая, кроме всего прочего, содержит в себе и имя оригинальной ресурсной группы, в которой был создан объект приложения. Проверить это можно тем же скриптом через свойство объекта приложения serverFarmId и сравнив его с именем группы ресурсов или через мастер «Diagnose and solve problems» – там есть возможность проверить, возможна ли миграция данного приложения.

3. Все связанные между содой ресурсы каждого мигрируемого объемкта должны быть помещены в одну мигрируемую группу ресурсов. Это означает, что, например, объект виртуальной, объекты сетевого интерфейса этой виртуальной машины, объект VNET, к которому подключена виртуальная машина, объекты Public IPs для этой виртуальной машины, availability set, установленный для этой виртуальной машины, все виртуальные диски виртуальной машины, диагностические хранилища, объекты резервного копирования и их хранилища и т.д. должны быть помещены в одну группу ресурсов. Типичный пример проблемы миграции – одна VNET в одной группе ресурсов и много виртуальных машин подключены к этой VNET, но размещены в разных группах ресурсов. В этом случае все виртуальные машины и связанные ресурсы должны быть размещены вместе с VNET. Если окажется, кто к той же VNET будет подключено приложение из другой ресурсной группы, то мы не сможем выполнить миграцию без простоя, поскольку у VNET есть связанный объект из другой ресурсной группы, а перенести его в мигрируемую группу ресурсов мы не можем, поскольку миграция перемещенных из оригинальной ресурсной группы приложений невозможна. Значит, перед миграцией такой ресурсной группы с VNET, к которой подключены объекты других ресурсных групп – мы их должны отключить от сети, что и создаст простои. Тоже касается и таких вещей, как VNET peering с другими сетями в других ресурсных группах, что приведет к остановке трафика между сетями и простоям.

4. Некоторые типы объектов Azure вообще не могут быть мигрированы между подписками Azure. Вот такое вот вам планирование архитектуры Azure! Обычно, в реальной жизни – это типы Backup Recovery Points, некоторые SKU общедоступных IP-адресов, старые «классические» объекты Azure, которые существуют только для совместимости, если ранее у вас были «классические» развертывания. Все эти типы ДОЛЖНЫ быть отключены от существующих объектов и удалены. Наиболее проблемной частью является тип Backup Recovery Points, поскольку он является частью резервной копии виртуальной машины, и это означает, что все резервные копии с точками восстановления должны быть остановлены перед удалением объектов точки восстановления (данные резервной копии будут сохранены). Чтобы проверить подписку на эти объекты, я написал небольшой скрипт PowerShell, который использует в качестве источника список совместимых типов Azure на GitHub (надеюсь, его будут поддерживать в актуальном состоянии, поскольку на него ведет ссылка с сайта Microsoft).

[CmdletBinding()]

param (

[Parameter(Mandatory=$false)]

[string]

$SubsID,

[Parameter(Mandatory=$true)]

[string]

$RGName

)

if($SubsID)

{

Connect-AzAccount -Subscription $SubsID | Out-Null

}

else {

Connect-AzAccount | Out-Null

}

$res = Invoke-WebRequest -Uri https://raw.githubusercontent.com/tfitzmac/resource-capabilities/master/move-support-resources.csv -Method Get

$list = Convertfrom-csv -InputObject $res.Content

$resObjs = Get-AzResource -ResourceGroupName $RGName

foreach($obj in $resObjs)

{

$resName = $obj.Name;

$resType = $obj.ResourceType;

$resID = $obj.ResourceId;

$resList = $list -match $obj.ResourceType

if($resList)

{

$i = [int]$resList[0].’Move Subscription’

if($i -ne 1)

{

Write-Host “`n`t***`tOBJECT CAN _NOT_ BE MIGRATED: $resName has type $resType ($resID)” -ForegroundColor Yellow -BackgroundColor DarkRed

}

else {

Write-Host “`nOBJECT IS SUPPORTED FOR MIGRATION: $resName has type $resType ($resID)” -ForegroundColor Green

}

}

else {

Write-Host “UNKNOWN OBJECT’s TYPE: $resName has type $resType ($resID)” -ForegroundColor DarkRed -BackgroundColor Yellow

}

}

Read-Host “`n`n`n[INFO]Finished. Press Enter…”

«Переварите» и теперь «наслаждайтесь» той херней, которую породил Microsoft с подписками в Azure! Представили себе сложность процесса миграции, при том, что вы хотите просто получить более удобную для вас схему оплаты?! Иногда, затраты на миграцию между подписками превышают экономический эффект от перехода на новую подписку (более низкие цены) в течение года… А как же, Microsoft заботится о вас и, главное, ваших денежках!

А если вы еще не осознали после приведенных выше ограничений всей проблематичности, которая ожидает вас при миграции, приведу пару стратегий миграции и реальных примеров из жизни:

· Сценарии 2,3 потребуют только точного перемещения связанных объектов виртуальных машин/сетей/служб приложений в соответствующие группы ресурсов, как описано выше, на основе информации из самописных скриптов, которые рекурсивно проверяют все цепочки зависимостей. Т.е. здесь мы тратим время наших админов. НО! Есть некоторые сценарии, когда будет наблюдаться простой или недоступность ваших ресурсов при миграции. Самый типичный тому пример – это две группы ресурсов, в каждой из которых находятся «свои» ВМ, подключенные к «своей» сети VNET. А чтобы обеспечить взаимодействие ВМ в разных VNET по сети – между сетями созданы соединения – VNET Peering. В таком случае – миграция групп ресурсов будет невозможна, поскольку их VNET имеют связанные ресурсы в виде VNET в другой группе ресурсов. И для миграции – потребуется удаление VNET Peering, что приведет к отключению ВМ в мигрируемой группе ресурсов от ВМ в других группах ресурсов и простою на уровне доступности сервисов – примерно на 30 минут, как показывает опыт. После переноса группы ресурсов в новую подписку временно (или постоянно, в зависимости от плана миграции) можно установить VNET Peering между двумя сетями VNET в новой и старой подписках. Хоть что-то хорошее есть – ресурсы, находящиеся в разных подписках – могут обмениваться данными без проблем.

· Сценарий 4 – список объектов должен быть пересмотрен. Как правило, это ненужные или не важные объекты, которые не влияют на доступность решения (например, некоторые счетчики производительности / предупреждения для мониторинга) и могут быть удалены перед миграцией и воссозданы в новой подписке после миграции. Т.е. здесь мы тратим время наших админов.

· Сценарий 1 наихудший из всех, отнимает много времени при планировании и приводит к простоям решения при миграции. Есть несколько способов перенести объекты Marketplace в другую подписку:

o При помощи снимков дисков – хорошо для НЕ интенсивных операций записи в сервисах, которые обслуживаются виртуальными машинами. Создаем снимки существующих виртуальных машин, переносим снимки в новую подписку, создаем там новую виртуальную машину из того же самого образа Marketplace в новой подписке, подключаем/меняем диски новой виртуальной машины на имеющиеся снимки дисков ВМ из старой подписки. Далее начинается время простоя – если сервис имел публичные IP – нам либо нужно будет отключить публичные IP от старой ВМ и перенести в новую подписку и подключить к новой ВМ, либо поменять DNS записи. Потери данных в таком случае будут за промежуток времени с момента получения снимка.

o Служба восстановления сайтов Azure – ASR обеспечивает репликацию данных в реальном времени для виртуальных машин Azure. Это позволяет создавать непрерывную реплику необходимых виртуальных машин в новой подписке и переключаться, когда это потребуется. Время простоя только для разрешения нового публичного IP в DNS или переноса существующего Public IP между подписками, как это указано выше.

o Некоторые объекты из Marketplace нельзя перенести технически – если это не виртуальная машина, а некоторые службы Azure, такие как SoftGrid. В этом случае сервис должен быть удален и заново создан / переконфигурирован в новой подписке вручную. В случае, если вызовы API / строки подключения и т. Д. Этой службы жестко закодированы в других виртуальных машинах / службах приложений – потребуется пересмотреть коды / вызовы.

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

Основной риск / проблема для миграции с EA на CSP – это объекты Marketplace, такие как Virtual Network Appliances, такие как брандмауэр / маршрутизаторы, особенно без возможности технической миграции (заблокированные поставщиком, например F5).

Давайте рассмотрим следующий действительно распространенный сценарий миграции:

1. Инфраструктура Azure имеет следующие объекты:

a. Общая VNET с разными подсетями в группе ресурсов RG01

b. Виртуальные машины в RG02 / RG03 подключены к VNET в RG01

c. Одна из виртуальных машин содержит CMS (из Marketplace) для корпоративного сайта

d. База данных SQL Azure для CMS

e. VNA F5 (из Marketplace), обеспечивающая безопасную публикацию / доступ к виртуальным машинам и подключенную к VNET

2. Соображения:

a. Мы не можем перенести F5 при помощи снимков из-за лицензионного ограничения, нам нужно пересоздать его.

b. Мы не можем перенести VNET из-за подключенного к нему F5, это означает, что мы должны отключить F5 перед миграцией других объектов.

c. Мы не можем отключить F5 от VNET, только полностью удалив виртуальную машину F5.

d. Мы не можем воссоздать F5 в новой подписке из-за отсутствия VNET до миграции других виртуальных машин и т. Д. Таким образом, это означает, что будет время простоя между удалением F5 из VNET и до тех пор, пока новый F5 не будет создан и настроен вручную в новой подписке в существующая VNET, которую необходимо перенести до новой подписки со всеми зависимыми виртуальными машинами.

e. То же самое, мы должны отключить (удалить) CMS VM перед миграцией VNET. Мы можем делать снимки дисков VM и переносить снимки в новую подписку. Виртуальная машина CMS может быть легко и быстро воссоздана из снимков после первоначальной миграции VNET.

f. Другие виртуальные машины могут быть перенесены напрямую, поскольку они будут перемещены из своих групп ресурсов в VNET RG01.

3. Процесс миграции:

a. Переместить все виртуальные машины / SQL в одну общую RG01 (где размещена VNET)

b. Очистить / удалить все неподдерживаемые типы объектов (отключить резервное копирование и т.п.) в RG01

c. Создание снимков для CMS VM

d. Удалить CMS VM (время простоя веб-сайта CMS начинается)

e. Создать резервную конфигурацию для F5 VNA.

f. Удалить виртуальную машину F5 (время простоя для всех служб начинается)

g. Запустить стандартный процесс миграции группы ресурсов Azure (всех остальных VM, подключенных к общей VNET, от которой уже отключили VNA и CMS) в новую подписку и дождаться его завершения.

h. Создать новую CMS VM из Marketplace, подключить к перенесенной VNET и заменить ее диски на оригинальные снимки со старой подписки.

i. Создать новую виртуальную машину F5 из Marketplace, подключить ее к перенесенной VNET, подключить перенесенные Public IP (чтобы не менять DNS) и восстановить конфигурацию/правила и т.д. из бекапа конфигурации оригинала.

j. На этом время простоя закончено.

Что, после такого объяснения все стало окончательно запутано?! Так вот так оно в Azure с миграцией между подписками и есть… Немного лучше, если у вам архитектура IaaS сделана «правильно», с центральным хабом и подключенным к нему по Peering VNET’ов для отдельных сервисов/приложений – тогда ломать приходится только центральный хаб и можно переключать отдельные VNET с меньшими простоями (как я уже писал выше). Но, в любом случае – для сложной инфраструктуры миграция ресурсов между EA и CSP подписками очень даже мучительная.

«Погоди Игорь! Видел у себя в подписке кнопочку Transfer to CSP – правда, она неактивная, «серенькая»…» – скажут некоторые. И будут правы – кнопочка есть, и она неактивна. Microsoft таким образом создает нездоровую атмосферу на рынке путем «перехвата подписок» – захочет, и предоставит право какому-то «избранному» партнеру, и тот очень легко и без такой вот головной боли, описанной выше, сможет запросто «воровать» подписки клиентов у конкурентов. Подумайте, к кому из двух партнеров Microsoft пойдет клиент, чтобы перейти с Pay-as-You-Go на CSP, если у одного партнера клиенту предлагают такую головоломную процедуру миграции, а второму партнеру Microsoft за какие-то «заслуги» «подарила» кнопочку «сделать все сразу и без головняка»??? Как выбираются партнеры – Microsoft «сам решает, выбирая крупных и лучших» … Такая себе отличная лазейка для коррупции, как, впрочем, и нынешнее полностью коррупционное «человеческое наполнение» Microsoft (я про это писал уже ранее в нескольких своих постах – http://bit.ly/35YRYy4 и http://bit.ly/2REMPHh )… О чем это я? – да о том, кому из партнеров какого клиента отдать на подписку – решает только аккаунт менеджер Microsoft, на основе своих личностных предпочтений, и, естественно, уровня «подмазывания» партнером. Ведь подписка – это вообще – просто продажа воздуха, она ни каким образом не отображает технические навыки того или иного партнера. Таким образом, менеджеры по работе с клиентами Microsoft вообще избавлены от какой-либо ответственности насчет передачи подписок клиентов кому-либо – они просто выбирают «карман», в который будет платить клиент (и который будет получать процент с прибыли как реселлер), и никакой технической ответственности ни партнер, ни менеджер Microsoft не несут. Т.е., как я уже писал выше – менеджер Microsoft выбирает, кому «дать заказ» только из критерия «кто лучше его «подмазал»», а как известно, во всем мире «лучше всего подмазать» – это «отблагодарить нужного человека лично», финансово простимулировать. Это насчет вопроса «про кнопочку» …

А как же технические специалисты Microsoft, неужели они не помогут своим клиентам (даже не партнерам) в такой миграции? Опять же, я уже писал выше, что такого понятия, как «технический специалист», который реально способен решать практические вопросы и имеет практический hands-on опыт работы с теми же продуктами Microsoft – в локальных офисах Microsoft нет. Все, что знают нынешние «технические специалисты» в региональных офисах Microsoft – это заученные мантры уровня технического маркетинга, и не более. Мало того – таких специалистов нет и в технической поддержке Microsoft – пример тому, моя статья про то, как я общался с поддержкой Microsoft на предмет аутентификации пользователей в Azure Functions. А если копнуть чуть глубже, на предмет технических знаний «технических специалистов» Microsoft непосредственно о миграции между EA и CSP подписками в Azure – то там уже совсем мрак-мрачный, многие даже не знают о самой проблеме, типа – «да никаких проблем, все переносится на ура», не говоря уже о понимании ограничений и сценариях миграции – только маркетинговый посыл «у нас все работает, у нас все классно».

И тут самое время перейти ко второй части повествования про миграцию – технической. Тут искушенные в миграции между подписками люди скажут, что непосредственно перед самой миграцией группы ресурсов Azure выполняет проверку на валидность всех объектов и их связей для миграции. Но вот воспользоваться этой опцией в Azure отдельно от самого процесса миграции – для создания плана миграции и понимания блокирующих компонентов – не получится, Azure сразу после проверки начинает зачем-то сразу мигрировать ресурсы (это отдельный вопрос к индуским «архитекторам» Azure – ЗАЧЕМ?! – нельзя было разделить на 2 операции – проверка и если все прошло хорошо – кнопочка Продолжить и Отменить, чтобы оценить миграцию не отдельной группы ресурсов, а инфраструктуры в целом).

Но есть возможность создать глобальный скрипт, который проверяет все ограничения по миграции сразу – чтобы потом оценить инфраструктуру и выработать удобоваримый план миграции с минимальным временем простоя. Для этого нужно воспользоваться тем же API, который вызывает и портал Azure для проверки перед миграцией. Но если вы считаете, что вызов данного API в Azure – дело простого скрипта – могу сказать, что у меня «простой» скрипт на PowerShell разросся до 260 строк кода, а документация по API и какие-либо осмысленные примеры кода (даже отдельных важных фрагментов общего алгоритма) у Microsoft просто отсутствует.

Поэтому – читайте следующий пост, в котором я попробую немного осветит эту казуистическую «индускую логику», в которой даже простой вызов API теперь делается через …

Друге посты и видео по теме Azure и ИТ-карьеры: