Adatbázist használó webalkalmazás telepítése Azure környezetbe. Azure menedzsment eszközök megismerése, pl. Azure portál, Azure Cloud Shell. Azure erőforrások létrehozása és konfigurálása. ADO.NET alapú adatelérés (az önálló részben).
A labor elvégzéséhez szükséges eszközök:
- parancssori eszközök
- .NET 6 SDK (Visual Studio 2022 általában telepíti) - telepítési útmutató
- EF Core Tools v6 vagy későbbi - telepítési útmutató
- Azure CLI - telepítési útmutató
- Windows-on terminálnak ajánlott a Windows Terminal használata (Windows 11-ben ez az alapértelmezett terminál) vagy a Visual Studio Code beépített terminálja
- PowerShell 7 parancsértelmező - telepítési útmutató
- böngésző
A labor alapvetően cross-platform (pl. bizonyos linux disztribúciókon is elvégezhető), azonban a leírás néhány helyen Windows-specifikus (pl. elérési útvonalak megadása).
Amit érdemes átnézned:
- Azure előadások anyaga
A közös rész és az önálló rész gyakorlatilag független, bármilyen sorrendben elvégezhető.
Használhatjuk az évente megújítható hallgatói előfizetést vagy egy rövid életű, korlátozott sandbox előfizetést is.
Ezesetben ezt a Sandbox előfizetést használjuk. Amint a visszaszámlálás megjelent, nyissuk meg az Azure portált külön böngészőfülön. A portálon állítsuk be a megfelelő tenant-ot: Microsoft Learn, és érdemes a portál nyelvét is angolra állítani, a leírás az angol nyelvű felületet követi.
A Sandbox előfizetés korlátai miatt
- minden erőforrást csak az előre létrehozott learn- kezdetű erőforráscsoprtba hozhatunk létre. Saját erőforráscsoportot nem hozhatunk létre!
- bizonyos erőforrásokat csak a Central US vagy East US régióban lehet létrehozni. Minden erőforrást lehetőleg tegyünk ugyanabba a régióba!
Aktiválható egyetemi email címmel (@edu.bme.hu). A BME tenantban jön létre, így általában nem kell tenantot váltani.
Minden erőforrást tegyünk ugyanabba a régióba, például nyugat-európaiba (West Europe).
Hozzunk létre egy üres erőforráscsoportot a labor számára, például AcmeShop néven. Ezt használjuk mindenhol, ahol erőforráscsoportot kell megadnunk.
Előfizetés | Sandbox | Hallgatói |
---|---|---|
Tenant | Microsoft Learn | BME |
Erőforráscsoport | learn-* (kötött) |
AcmeShop (választható) |
Régió | ált. Central US (némileg kötött) |
West Europe (választható) |
Csatlakozzunk az Azure fiókunkhoz terminálból:
az login
Ha több előfizetés van a fiókunk alatt, akkor érdemes explicit kijelölni az Azure CLI által használatos alapértelmezett előfizetést. A használni kívánt előfizetés azonosítóját kell megadnunk, amit az Azure portálról is másolhatunk.
az account set -s subscriptionid
Használjuk az MVC-s labor megoldását (gyakorlatvezető biztosítja)!
A solution könyvtárában állva adjuk ki a parancssorban.
dotnet build
Ellenőrizzük, hogy lefordul-e.
Navigáljunk ide: Azure portál SQL szolgáltatásválasztó
Adatbázis neve: AcmeShop
Szerver neve: <neptun kód>dbsrv (egyedinek kell lennie Azure-ban!)
Authentikáció: SQL
Admin felhasználó neve: acmeadmin
Admin felhasználó jelszava: ami megfelel a szabályoknak, pl. XXDBAdm1n456.
Elastic pool: nem
Workload: Development
Compute + storage: ha a fentit Development-re állítottuk, akkor itt már eleve a jó értéknek (General Purpose - Serverless) kell lennie.
Backup storage redundancy: locally-redundant
Connectivity method: Public endpoint
Allow Azure services and resources to access this server: igen
Add current client IP address: igen
A többi lapon nem kell átállítani semmit, pl. ne töltessük fel adattal előre az adatbázist (Use existing data)
Navigáljunk ide: Azure portál App Service űrlap
App neve: <neptun kód>acmeshop (egyedinek kell lennie Azure-ban!)
Publish: Code
Runtime stack: .NET 6
OS: Linux
Linux plan neve: acmeplan (Create new linkre kattintva lehet megadni)
Plan: Free F1
Egy előfizetésben csak korlátozott számú F1 plan lehet, de ez a Sandbox előfizetés esetén általában nem probléma.
Enable Application Insights: nem
A többi lapon nem kell átállítani semmit.
Kapcsolódjunk az Azure portálba beépített kezelő eszközzel. Lekérdezést még nem tudunk írni, mert üres az adatbázis.
Ezzel ellenőrizzük, hogy
- jól tudjuk-e kapcsolódási adatokat (felhasználónév, jelszó)
- a gépünk IP-je engedélyezett-e az adatbázis szerver tűzfalán
A jelszót kivéve mindent megtudhatunk a portálról.
A jelszót nem lehet lekérdezni, de felül lehet írni.
Utólag is hozzáadhatunk tűzfalszabályt az SQL Server erőforráshoz.
A webes projekt könyvtárában állva inicializáljuk az adatbázist az EF Core migrációs eszközzel. A macskaköröm között a valós connection string-et adjuk meg. Egy nem valós jelszót tartalmazó connection string az Azure portálról beszerezhető. Figyeljünk rá, hogy a valós jelszó kerüljön végül a parancsba:
dotnet ef database update --connection "connection string"
Az appsettings.json-ból nézzük meg, hogy az app milyen nevű connection string-et vár (pl. AcmeShopContext). Ezzel a névvel vegyünk fel egy SQLAzure típusú connection string-et az App Service konfigurációba (Environment variables menüpont).
A connection string értéke legyen ugyanaz, mint az adatbázistartalom inicializálásakor, de ne legyen benne/körülötte macskaköröm.
Ne felejtsünk menteni a konfigurációs oldalon!
Generáltassuk a projekt linuxra telepíthető verzióját. A webes projekt mappájában:
dotnet publish -r linux-x64 --no-self-contained -o ..\publish
A webes projekt mappájával egy szinten jön létre egy publish nevű mappa. Tömörítsük, de maga a mappa ne kerüljön a zip-be, csak a tartalma. A publish mappában állva:
Compress-Archive .\* publish.zip
Jöhet a telepítőcsomag csomag feltöltése az App Service-be. A resource group (resource-group paraméter) és az App Service nevét (name) cseréljük le a saját környezetünknek megfelelően. A publish mappában állva:
az webapp deploy --resource-group acmegroup --name acmeshop --src-path publish.zip --type zip
Próbáljunk ki egy adatbázis módosítással és/vagy beszúrással járó műveletet. A művelet eredményét ellenőrizzük a kapcsolódó listázó felületen.
Ha sandbox előfizetést használunk, akkor nem szükséges, egyébként töröljük az erőforráscsoportot.
Biztonsági szempontból nem teljesen modern a megoldásunk, de a gyakorlat keretében sokszor kénytelenek voltunk az egyszerűbb megoldást választani.
- az ajánlások szerint az adatbázis elérést már hálózati szinten kizárólag az App Service-re (pontosabban az App Service és az adatbázisszerver közös virtuális hálózatára) korlátozzák. Ez körülményesebbé teszi az adatbázisséma létrehozását, módosítását. Egy ilyen megoldásra példa.
- érdemes az adatbázisban az SQL alapú azonosítás helyett az Azure AD alapút választani, ezzel teljesen kiváltható a connection string jelszó és ennek teljes kezelése.
- érdemes az alkalmazásnak (App Service-nek) az adminisztrátor(ok)tól teljesen külön (Azure AD-s) adatbázisfelhasználót létrehozni és ennek a felhasználónak csak annyi adatbázisos jogot adni, amire az alkalmazásnak feltétlenül szüksége van. Az alkalmazás kizárólag ezen felhasználóval kapcsolódjon, míg az adminisztrátorok az adminisztrátori felhasználóval elvégzik a séma módosítását, amikor szükséges. Egy ilyen megoldásra példa.
Az alábbi online tananyagot kell elvégezni az edu.bme.hu-s fiókotokkal belépve. Magyar Angol
Amelyik lecke/unit címe nem azzal kezdődik, hogy Gyakorlat/Exercise, azt nem kell végrehajtani, csak el kell olvasni - hiába szólít fel erre a szöveg.
Sajnos néhány helyen már elavult az anyag, ezért néhány dolgot máshogy kell csinálni:
- a .NET6-ra frissített kiinduló projektet klónozzuk:
git clone https://github.com/BMEVIAUBB04/mslearn-develop-app-that-queries-azure-sql.git education
- az adatbázis létrehozásakor válasszuk a
Development
Workload environment-et (ez az alaphelyzet) - a portálon több ADO.NET-es connection string is található, azt használjuk, amiben ki van hagyva a hely a jelszónak (
Password={your_password};
) - a
code
parancs helyettvim
vagynano
ajánlott, a code parancs Cloud Shell-ben gyakran nem működik. Acode
parancs kipróbálásához ráadásul át kell váltani a régi felületre, ami miatt az összes beállított shell változónk elveszik! A nano, vim billentyűparancsai mások, mint a code-é, ezért vim / nano használatakor az anygban írt billentyűprancsokat ne vegyük figyelembe. - kódszínező támogatás a vim-hez a következő parancsokkal kapcsolható be
VIMVERSION=$(vim --version | awk 'NR==1 {v=$5; FS="-"} NR == 2 {t=$2} END {print v "." t}')
wget -O - https://github.com/vim/vim/archive/refs/tags/v${VIMVERSION}.tar.gz | tar -C ~/.vim -xzf - vim-${VIMVERSION}/runtime/ --strip-components=2
- nem mindig van szabad erőforrás a CentralUS régióban, így hiba esetén (quota error) érdemes más régióval próbálkozni, pl. East Us (az
az webapp up
parancsban pl.--location centralus
--location eastus
) - a kimásolható parancsok kódjában néha rosszul szerepel az erőforrsácsoport neve, emiatt
Forbidden
hibát kaphatunk, ilyenkor ellenőrizzük, hogy a--resource-group learn-XXX
egyezik-e annak a resource groupnak a nevével, amiben az adatbázisunk is van - az
az webapp up
telepítési hibánaplói megtalálhatók az Azure portálon a web app erőforrásDeployment Center
menüpontja alatt aLogs
fülön
Pár hasznos vim billentyűparancs:
- kilpés mentés nélkül (ha szerkesztési módban vagyunk, előbb ki kell lépni a módból Esc billentyűvel!):
:q!
- kilépés mentéssel (ha szerkesztési módban vagyunk, előbb ki kell lépni a módból Esc billentyűvel!)
:x
- insert típusú szerkesztési módba belépés
i
- insert típusú vagy bármilyen szerkesztési módból kilépés Esc
- beillesztés Ctrl + Ins
Az itt található oktatási segédanyagok a BMEVIAUBB04 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet.
Az anyagok a tárgy keretében oktatott kontextusban értelmezhetőek. Az anyagokért egyéb felhasználás esetén a szerző(k) felelősséget nem vállalnak.