Tekst: Kristijan Sekereš

Azure Cloud Services (Extended Support) se gasi 31. marta 2027: kako preseliti web i worker role

Redovi serverskih ormana osvetljeni plavom svetlošću u data centru

Microsoft je Azure Cloud Services (extended support) proglasio zastarelim 31. marta 2025, a potpuno ga gasi 31. marta 2027. Ako neka vaša poslovna aplikacija radi kao web role i worker role, pre tog datuma mora da radi negde drugde na Azureu. Pitanja i odgovori o gašenju bez okolišanja odgovaraju na dva pitanja koja svi prvo postave: Microsoft „ne može da odobri zahteve za produženje" i „ne postoji alat za migraciju jednim klikom."

Od danas, 3. oktobra 2026, to ostavlja šest meseci.

Za koga je ovaj tekst

Tipičan slučaj: ASP.NET aplikacija na .NET Frameworku, web rola napred i jedna ili dve worker role iza nje koje obrađuju redove, koje je neka agencija napravila pre osam ili deset godina. Agencija je često otišla dalje, aplikacija i dalje vodi obradu porudžbina ili portal za klijente, a fajl .csdef niko nije otvorio od poslednje migracije.

Da proverite da li ste pogođeni, otvorite Azure portal i izlistajte resurse tipa „Cloud services (extended support)". Microsoftovo obaveštenje o gašenju vodi pravo na taj prikaz. Ako je prazan, završili ste.

Ovaj tekst nije o Cloud Services (classic), koji je ugašen 2024. Ako proizvod za vas hostuje dobavljač, migracija je njegov posao: tražite njegov datum pismeno. Sve u nastavku je za timove koji poseduju kod, ili ga poseduju na papiru i moraju da pronađu nekoga ko ga razume.

Zašto je ovo teže od selidbe iz 2024. godine

Mnoge kompanije prešle su na extended support 2024, kada je classic ugašen. Taj prelazak je namerno bio jeftin. Microsoftov pregled extended supporta kaže da se fajlovi .csdef, .cscfg i .cspkg „prenose dalje i nema promena u formatima" i da „nisu potrebne izmene koda za izvršavanje". Postojala je čak i migracija na licu mesta. Ista stranica je extended support preporučivala za aplikacije koje se ne razvijaju dalje, jer „pruža brz put migracije."

Ovog puta ne postoji istovetno odredište. Rečima Microsofta, Cloud Services „se odnosi na postavljanje aplikacija kao virtuelnih mašina. Kod koji pišete čvrsto je vezan za instancu virtuelne mašine". Vaš kod zna da radi u roli. Konfiguraciju čita iz role, prostor na disku nalazi preko role, sertifikate mu instalira rola, a skripte za podešavanje pokreće kao administrator pre nego što rola krene. Sve to mora da se zameni.

Još jedna stvar pre nego što pročitate zvanična uputstva. Microsoftovo obaveštenje o gašenju i pitanja i odgovori imenuju jedno odredište, Service Fabric managed cluster. Stranica sa pregledom navodi pet, a Microsoftova sopstvena matrica za odlučivanje o migraciji poredi sedam. Service Fabric je podrazumevani izbor, a ne obaveza, i za mnoge web role je pogrešan.

Odredišta i kada koje odgovara

Web i worker role ne moraju da završe na istom mestu. Birajte odredište po roli.

App Service (Windows). Najbliže web roli za ASP.NET aplikaciju. Windows instance dolaze sa instaliranim podržanim verzijama .NET Frameworka, pa Web Forms i MVC 5 rade bez ponovnog pisanja. Worker role mogu da ih prate kao WebJobs, koji rade „na istoj instanci kao web aplikacija" bez dodatnog troška. Ograničenje je sama mašina: Microsoft aplikacije kojima trebaju COM komponente, pristup registry-ju ili MSI instaleri usmerava na Managed Instance, pa podignuti startup taskovi na standardnom planu nemaju gde da odu.

App Service Managed Instance. Napravljen za nasleđene Windows web aplikacije. Prema Microsoftovom pregledu, „opšte je dostupan za Windows web aplikacije u odabranim regionima", ograničen na planove Pv4 i Pmv4, sa unapred instaliranim .NET Frameworkom 3.5 i 4.8 i PowerShell instalacionim skriptama koje mogu da registruju COM komponente, upisuju ključeve u registry, pokreću MSI instalere i konfigurišu IIS. To pokriva većinu onoga što su radili podignuti startup taskovi. Ograničenja: samo web aplikacije (bez WebJobs), bez kontejnera, samo Entra ID i managed identity (bez pridruživanja domenu, NTLM-a ili Kerberosa), a u trenutku pisanja jedini navedeni evropski region je North Europe.

Container Apps. Dobro za worker role kada su već na modernom .NET-u: skaliranje prema redu, zakazani poslovi i poslovi pokrenuti događajima, skaliranje na nulu. Ali zahtevi za kontejnere kažu „Potrebne su kontejnerske slike zasnovane na Linuxu (linux/amd64)." Kod na .NET Frameworku tamo ne radi dok se ne prenese.

Azure Kubernetes Service. Pokreće Windows Server kontejnere u Windows node poolovima, pa .NET Framework rola može da se kontejnerizuje i preseli. Matrica za odlučivanje i složenost migracije i operativno opterećenje ocenjuje kao visoke. Odgovara ako već koristite Kubernetes, a ne kao prvi klaster za jednu nasleđenu aplikaciju.

Virtual Machine Scale Sets. Matrica ga opisuje kao „bliže modelu Cloud Services, uz lakši lift-and-shift". Dobijate nazad virtuelnu mašinu, zajedno sa zakrpama, pravljenjem slika i podešavanjem IIS-a koje je rola ranije radila za vas.

Service Fabric managed cluster. Odredište koje Microsoft imenuje. Worker role se na njega čisto mapiraju. Web role često ne: Service Fabric „ne podržava IIS", a vodič za konverziju ASP.NET Web Forms navodi kao nepodržan, sa konverzijom u ASP.NET Core MVC kao putem. Vodič za migraciju na Service Fabric dodaje da managed klasteri „trenutno ne podržavaju kontejnere", pa aplikaciji koja zavisi od IIS-a treba tradicionalni klaster, sa više posla oko održavanja.

Tabela za odlučivanje

Vaša rola izgleda ovakoVerovatno odredišteGde odlazi posao
ASP.NET Web Forms ili MVC 5 web rola, startup taskovi trivijalni ili ih nemaApp Service (Windows)Konfiguracija, sertifikati, pipeline za isporuku
Web rola čiji startup taskovi instaliraju COM komponente, MSI pakete ili ključeve u registryApp Service Managed InstancePrepisivanje startup taskova u instalacione skripte; provera regiona i plana
.NET Framework worker rola koja čita red, umereno opterećenjeWebJob pored web aplikacijeZamena RoleEntryPoint konzolnim hostom
Worker rola koju ste spremni da prenesete na moderni .NETContainer AppsSam prenos, zatim kontejnerska slika
Mnogo rola i tim koji već vodi KubernetesAKS sa Windows node poolovimaSlike, rad sa klasterom
Teške nativne zavisnosti, bez volje za izmenama kodaVM Scale SetsZakrpe operativnog sistema i održavanje slika, trajno
Sistem sa mnogo workera, web sloj već na ASP.NET CoreService Fabric managed clusterUčenje platforme; bez IIS-a, bez kontejnera

Šta se menja u kodu

Pretražite rešenje na Microsoft.WindowsAzure.ServiceRuntime. Svaki fajl koji ga uvozi je na listi.

RoleEntryPoint

Worker rola je klasa koja nasleđuje RoleEntryPoint i redefiniše OnStart, Run i OnStop. Ako se Run završi, instanca se reciklira. Service Fabric sva tri spaja u jedan RunAsync, koji treba da se zaustavi „kada CancellationToken metode RunAsync bude signaliziran". Na App Serviceu ili u kontejneru ista logika postaje konzolna aplikacija ili hostovani pozadinski servis sa petljom i tokenom za otkazivanje.

Deo koji ljudi propuste je gašenje. OnStop vam je davao trenutak da završite poruku koju obrađujete. Proverite da novi host prosleđuje signal za otkazivanje i da je poruka napuštena usred obrade bezbedna za dvostruku obradu.

Web role često imaju i svoju, obično WebRole.cs. Ako njen OnStart išta radi (podešavanja IIS-a, zagrevanje keša), utvrdite šta pre nego što je obrišete.

RoleEnvironment

RoleEnvironment.GetConfigurationSettingValue("Key") čita podešavanja iz .cscfg. Ništa van Cloud Servicesa to ne obezbeđuje. Pre nego što bilo šta preselite, umotajte svaki poziv u jedan mali konfiguracioni interfejs, a zatim taj interfejs na novom hostu usmerite na app settings, promenljive okruženja ili Key Vault. To je najjeftinija izmena u projektu, a ostatak čini moguće testirati na laptopu.

Još tri upotrebe koje treba potražiti:

  • RoleEnvironment.Changed, koji je primenjivao izmene konfiguracije bez ponovnog pokretanja. Service Fabric ima ekvivalentan događaj. Drugde pretpostavite da izmena podešavanja ponovo pokreće proces i testirajte šta to radi poslu koji je u toku.
  • RoleEnvironment.CurrentRoleInstance korišćen za izbor jedne instance za zakazani posao. Triggered WebJobs rade na jednoj instanci; continuous rade na svim instancama, osim ako nisu ograničeni. Odlučite izričito.
  • Grane sa RoleEnvironment.IsAvailable i IsEmulated. One razdvajaju „cloud" putanju od „lokalne", a jedna od njih upravo postaje mrtav kod.

.cscfg i .csdef

.cscfg sadrži podešavanja po okruženju, broj instanci i otiske sertifikata. .csdef sadrži krajnje tačke, veličinu virtuelne mašine, lokalno skladište, startup taskove, skladišta sertifikata, a ponekad i nekoliko IIS sajtova unutar jedne web role. Prođite kroz oba red po red i zapišite gde će svaka stavka živeti posle selidbe: u app settingu, u referenci na Key Vault, u kodu infrastrukture ili nigde. Interne krajnje tačke preko kojih role direktno pozivaju jedna drugu traže zamenu, bilo adresu servisa, bilo red.

Sertifikati

Extended support je već nametnuo sertifikate u Key Vaultu, pa se taj deo posla iz 2024. sada isplati. Menja se način na koji ih kod pronalazi. .csdef instalira sertifikate u imenovano skladište, često LocalMachine. Na Windows App Serviceu podešavanje WEBSITE_LOAD_CERTIFICATES ih čini dostupnim u Current User\My. Kod koji otvara skladište LocalMachine ne nalazi ništa, a prvi poziv kome treba sertifikat pada. U Linux kontejnerima umesto toga ga učitajte iz Key Vaulta pri pokretanju.

Startup taskovi

Otvorite Startup.cmd. Tu žive iznenađenja, obično pokrenuta sa executionContext="elevated": fontovi za generisanje PDF-a, COM komponenta, IIS rewrite modul, izmena registry-ja zbog TLS-a. Svaki red ima tri moguće sudbine: više nije potreban, premešta se u instalacionu skriptu na Managed Instanceu ili se ugrađuje u sliku kontejnera ili virtuelne mašine.

Lokalno skladište

Resurs LocalStorage u .csdef, čitan preko RoleEnvironment.GetLocalResource, davao je svakoj instanci privremeni disk. Za prave privremene fajlove koristite privremeni direktorijum platforme. Sve što mora da preživi ponovno pokretanje, uključujući fajlove za koje je neko pretpostavio da su trajni, ide u Blob Storage.

Web Forms

Ovo je odluka koja određuje sve ostalo. Web Forms je izgrađen na System.Web i nema ASP.NET Core verziju, pa selidba Web Forms aplikacije na Service Fabric ili Container Apps znači ponovno pisanje korisničkog interfejsa. App Service, Managed Instance, Windows kontejner ili scale set mogu da je pokreću bez izmena. Preselite je kakva jeste, a modernizaciju učinite zasebnim projektom sa sopstvenim budžetom. Ponovno pisanje interfejsa ne pripada kritičnoj putanji ka datumu gašenja.

Ostalo

VIP swap između dva cloud servisa postaje deployment slotovi na App Serviceu ili revizije na Container Appsu. Logovi koji su slati preko diagnostics (WAD) ekstenzije trebaju novo odredište, obično Application Insights. Standardni App Service i Container Apps ne nude udaljenu radnu površinu; Managed Instance je dozvoljava preko Azure Bastiona, samo za dijagnostiku.

Plan od šest meseci

Računajući unazad od 31. marta 2027, sa decembarskim praznicima u sredini.

Oktobar: popis i izbor odredišta. Navedite svako extended support postavljanje. Za svaku rolu zabeležite verziju .NET Frameworka, Web Forms ili MVC, svaki poziv RoleEnvironment, startup task, resurs lokalnog skladišta, sertifikat i krajnju tačku. Zatim proverite neprijatan deo: možete li da napravite postavljeni paket iz izvornog koda koji imate? Kod sistema koje su pravile agencije odgovor je ponekad ne, a oktobar je mesec da se to sazna. Izaberite odredište po roli.

Novembar: jedna rola, od početka do kraja. Dodajte konfiguracioni omotač, opišite ciljno okruženje kao kod infrastrukture i pokrenite jednu rolu (obično najjednostavniji worker) u test okruženju, sa logovima, sertifikatima i pipelineom.

Decembar i januar: prenos ostatka. Zamenite ulazne tačke, startup taskove i lokalno skladište. Testirajte opterećenje staging okruženja sa podacima sličnim produkcionim: WebJob ili kontejner možda neće dostići propusnost namenske virtuelne mašine za rolu.

Februar: paralelni rad. Pokrenite novo okruženje sa stvarnim saobraćajem. Za workere koji dele red sa starim rolama, ili prvo učinite obradu idempotentnom, ili zaustavite stare workere pre pokretanja novih.

Početak marta: prelazak. Prebacite DNS sa dovoljno rezervnog vremena. Staro postavljanje držite zaustavljeno, ali netaknuto nedelju ili dve, a zatim ga obrišite. Ne zakazujte prelazak za poslednju nedelju marta: neuspeo prelazak tada nema drugi pokušaj.

Ako umesto toga počinjete u januaru, potpuno odustanite od modernizacije. Izaberite odredište koje traži najmanje izmena koda (App Service, Managed Instance ili scale setove), preselite se i refaktorišite posle.

Šta nije jasno

Microsoft kaže da će servis biti „potpuno ugašen" i da je migracija potrebna „da bi se izbegao prekid usluge". Stranice koje smo pročitali ne kažu šta se dešava sa postavljanjem koje i dalje radi 1. aprila 2027. Ne planirajte da to saznate. Regioni i planovi za Managed Instance verovatno će se menjati u narednim mesecima, pa ih proverite kada odlučujete, a ne iz ovog teksta.

Gde potražiti pomoć

Preuzimamo aplikacije koje su napravili drugi, utvrđujemo kako rade i selimo ih: popis, odredište po roli, izmene RoleEnvironment poziva i startup taskova i prelazak. Naš rad na održavanju nasleđenih sistema pokriva .NET Framework i Web Forms; ako migraciju radi vaš tim i treba mu još ljudi, pogledajte proširenje tima.

Ako imate Cloud Services postavljanje i datum za šest meseci, pišite na office@c9group.dev.