Skip to content

Latest commit

 

History

History
184 lines (150 loc) · 8.48 KB

appservice.md

File metadata and controls

184 lines (150 loc) · 8.48 KB

AppService SQL adatbázissal

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.

Azure SQL

  • 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

Példaprojekt beüzemelése

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

Web App / App Service

Egy előfizetés-régió-OS kombináción belül egyetlen free plan lehet.

App Service Configuration

  • A portálról másoljuk ki a connection string-et
  • Configuration / App Settings
  • adjuk meg a connection stringet a secretnek megfelelően

Deployment

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

  • Diagnose & solve problems > Application Logs

SQL AD Auth MSI-vel

  • 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>

Csatlakozás fejlesztői gépről AD felhasználóként

  • 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)!

Application Insights w Log Analytics Workspace

https://learn.microsoft.com/en-us/azure/azure-monitor/overview#overview

Deployment slots

  • 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 az az webapp deploy parancshoz
  • swap a két slot között

Azure Load test & scale-out lehetőségek

Labor végén/után

  • App Service Plan visszaskálázás (előbb egy kivételével minden slot-ot törölni kell) vagy törlés