Skip to content

BMEVIAUBB04/gyakorlat-azure

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

42 Commits
 
 
 
 
 
 

Repository files navigation

Azure alapú webhoszting

Célkitűzés

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).

Előfeltételek

A labor elvégzéséhez szükséges eszközök:

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

Gyakorlat menete

A közös rész és az önálló rész gyakorlatilag független, bármilyen sorrendben elvégezhető.

Közös rész

Előkészítés - Előfizetés

Használhatjuk az évente megújítható hallgatói előfizetést vagy egy rövid életű, korlátozott sandbox előfizetést is.

Sandbox előfizetés esetén

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!

Hallgatói előfizetés esetén

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.

Kivonat

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ó)

Előkészítés - Azure CLI

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

Előkészítés - Telepítendő alkalmazás

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.

Feladat 1 - Azure SQL adatbázis létrehozása

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

Network lap

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)

Képes segédlet

Feladat 2 - Azure App Service létrehozás

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.

Monitoring lap

Enable Application Insights: nem

A többi lapon nem kell átállítani semmit.

Feladat 3 - Adatbázis kapcsolódás ellenőrzés

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.

Feladat 4 - Adatbázistartalom inicializálása

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"

Feladat 5 - App Service konfigurálása

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!

Feladat 6 - Alkalmazás telepítése

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

Feladat 7 - Kipróbálás

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.

Erőforrások felszabadítása

Ha sandbox előfizetést használunk, akkor nem szükséges, egyébként töröljük az erőforráscsoportot.

Epilógus

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.

Önálló rész

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 helyett vim vagy nano ajánlott, a code parancs Cloud Shell-ben gyakran nem működik. A code 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ás Deployment Center menüpontja alatt a Logs 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.