A gyakorlat menete hasonló, de több helyen eltér ettől a gyakorlatanyagtól.
A telepítendő alkalmazásként egy MS példaalkalmazást használunk.
- válasszuk: serverless (Development workload)
- Networking (a szerveren) - állítsuk be a saját IP-nket (Add Client IP) és engedélyezzük az Azure hozzáférést is (Allow Azure services and resources to access this server )
- nézzük meg:
- a szerver és az adatbázis erőforrásokat
- skálázás (db)
- backup (szerver)
- connection strings (db)
- Replication (db)
- Add Azure Search (db)
- a webes Query Editor-ban ellenőrizzük, hogy üres az adatbázis
- Töltsük le a példaprojektet
- Azure-os connection string dotnet user secret-be, majd EF Migrations beüzemelése. A projektfájl (.csproj) könyvtárában:
dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:MyDbConnection" "connectionstringünk"
dotnet tool install -g dotnet-ef
dotnet ef database update --connection "connectionstringünk"
- jelszót ne felejtsük el beírni a connection string-be!
- futtat, próba. Ellenőrizzük weben az adatbázis tartalmat.
- https://docs.microsoft.com/en-us/azure/architecture/guide/technology-choices/compute-decision-tree
- https://azure.microsoft.com/en-us/pricing/details/app-service/plans/
- Publish: code
- Runtime stack: .NET 6
- OS: Linux vagy Windows
- Region: WEU
- Free (F1) legyen
- App Insights: nem kell (még)
Egy előfizetés-régió-OS kombináción belül egyetlen free plan lehet.
- A portálról másoljuk ki a connection string-et
- Configuration / App Settings
- adjuk meg a connection stringet a secretnek megfelelően
Aletrnatívaként a gyakorlatanyagból az Azure CLI-s megoldás is jó lehet.
A solution könyvtárában álljunk!
git init
git add --all
(.gitignore már van a projektben)git commit
- Deployment Center-ben a Local git deployment (with kudu) beállítása (https://github.com/projectkudu/kudu)
git remote add <remote név> <git deployment url>
- push (
git push --set-upstream az master
), push során adjuk meg a portálról a git repo app szintű jelszót (\ utáni rész kell csak a usernévből)- ha elrontottuk, akkor Windows-on a Windows Credentials Manager-rel töröljük (Windows Credentials fül)
- Diagnose & solve problems > Application Logs
- Kapcsoljuk be az App Service-ben a system managed indetity-t (Identity lap)
- Kapcsoljuk be az SQL Server-en az AD integrációt (Active Directory admin lap), saját magunkat adjuk meg
- Osszunk jogokat az SQL Server-ben az MSI-nek
- Az identitás neve App Service esetében az App Service neve
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
-
Állítsuk át a connection string-et
"Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;"
-
Frissítsük az SqlClient-et:
dotnet add package Microsoft.Data.SqlClient --version 5.1.2
(nem! System.Data.SqlClient) Újra publikálás, -
Ellenőrző szkript felhasználók listázásához
select name as username,
create_date,
modify_date,
type_desc as type,
authentication_type_desc as authentication_type
from sys.database_principals
where type not in ('A', 'G', 'R', 'X')
and sid is not null
order by username;
- Ellenőrző szkript jogosultságok listázásához
-- List of database roles for the MSI user
SELECT dp.name AS principal_name, dp.type_desc AS principal_type, r.name AS role_name
FROM sys.database_role_members AS m
JOIN sys.database_principals AS dp ON m.member_principal_id = dp.principal_id
JOIN sys.database_principals AS r ON m.role_principal_id = r.principal_id;
-- List of object-level permissions for the MSI user
SELECT d.name AS object_name, dp.name AS principal_name, dp.type_desc AS principal_type, p.permission_name
FROM sys.database_permissions AS p
JOIN sys.database_principals AS dp ON p.grantee_principal_id = dp.principal_id
LEFT JOIN sys.objects AS d ON p.major_id = d.object_id
WHERE dp.name NOT IN ('dbo','public');
- Ellenőrző szkript - ki járt az adatbázisban
SELECT connection_id,
c.client_net_address,
c.session_id,
connect_time,
client_net_address,
client_tcp_port,
host_name,
program_name,
login_name,
original_login_name,
nt_user_name,
row_count
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s ON s.session_id = c.session_id
WHERE DATETRUNC(d, s.login_time)= DATETRUNC( d, GETDATE())
- Ellenőrző szkript - session login name visszafejtése
az ad sp show --id <a login_name @ előtti része>
- csproj fájlban a user secrets kezelést kikapcsolni
<!--<UserSecretsId>...</UserSecretsId>-->
appsettings.Development.json
-be connection stringet átírni:"Server=tcp:<server-name>.database.windows.net,1433;Authentication=Active Directory Default;Database=<database-name>;"
- tokenforrást beállítani; VSCode Azure account extension. A tokenforrások sorrendje nem függ attól, hogy milyen alkalmazásban fejlesztünk éppen (VSCode-ban dolgozva is a VS tokenjét használjuk, ha van)!
https://learn.microsoft.com/en-us/azure/azure-monitor/overview#overview
- Log Analytics Workspace létrehozása
- Application Insights létrehozása és hozzákötése a workspace-hez
- Auto instrumentation már Linuxos ASP.NET Core alkalmazásokhoz is (támogatott keretrendszerek)
- navigáljunk pár nemlétező oldalra (pl. /phpmyadmin)
- kis idő múlva figyeljük meg, hogy megjelennek a hibás (404) hívások
- Kusto Query Language (KQL) - https://docs.microsoft.com/en-us/azure/kusto/query/, https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/tutorial
- Azure Monitor pricing - https://azure.microsoft.com/en-us/pricing/details/monitor/
- fel kell skálázni S1 szintre (0,085 EUR/óra költség!)
- hozzunk létre új slot-ot test néven, klónoztassuk a configot az eredetiből
- ez egy új app, Identity-t be kell kapcsolni + fel kell venni az SQL adatbázisba a slot felhasználót
[<appnév>/slots/<slotnév>]
- legyen egy kis eltérés, pl. a _Layout.cshtml-be:
<li class="nav-item"> <a class="nav-link text-dark" asp-area="" asp-controller="Todos" asp-action="Index">Todos</a> </li>
- Ha git-tel publikálunk: deployment opciókat inicializálni, majd push
- Ha Az CLI-vel publikálunk:
--slot slotnév
hozzáadása azaz webapp deploy
parancshoz - swap a két slot között
- Load Test erőforrás és egyszerű load test létrehozása
- Load Test lefutás real-time megfigyeléssel (App Insights Live Metrics)
- Scale-out lehetőségek bemutatása
- App Service Plan visszaskálázás (előbb egy kivételével minden slot-ot törölni kell) vagy törlés