MS Certificering: AZ-204, deel 10

Ingediend door Dirk Hornstra op 15-dec-2021 10:38

Ik ben bezig met certificering voor AZ-204 van Azure, waarbij ik de lessen/uitleg/instructies van Azure zelf volg via deze flow: link. Ik was bij blok 4 begonnen: link, daarna heb ik blok 1 uitgevoerd: link. Vervolgens heb ik blok 2 afgerond: link.

Tijd voor blok 3, Store data in Azure: link.

Het eerste blok is "Choose a data storage approach in Azure": link.

In dit hoofdstuk gaan we leren wat de beste oplossing voor jouw probleem is, Azure Storage, Azure SQL Database en/of Azure Cosmos DB.

Het voorbeeld wat gegeven wordt is een fotograaf, zo is er data die betrekking heeft op de zaak (boekhoudkundige (financiële) informatie), foto's en video's en de productcatalogus. Allemaal verschillende soorten data de niet per se in één en dezelfde data-oplossing opgeslagen hoeven worden.

Zo kun je de data classificeren naar het type, gestructureerd, deels (semi) gestructureerd en ongestructureerd.

Gestructureerde data wordt ook al "relationele data" genoemd. Op basis van tabellen met kolommen en rijen kan de informatie opgeslagen worden.

Semi-gestructureerde data is data die als key-valuepairs, graph of documenten opgeslagen wordt, ook wel "noSQL data" genoemd. De data wordt beheerd door een serialization language, oftewel JSON, XML, YAML.

Onder ongestructureerde data vallen bestanden, afbeeldingen, Word en PDF documenten, tekst- en logbestanden.

Operation and latency (laten we het op werking en wachttijden houden):

Er zijn een aantal vragen om te bepalen wat voor oplossing je nodig hebt:

  • Zoek je data op basis van een ID veld?
  • Moet je een query uitvoeren om 1 of meer velden op te vragen?
  • Hoeveel create, update en delete acties verwacht je uit te moeten voeren?
  • Moet je complexe analytische query's uitvoeren?
  • Hoe snel moeten deze acties uitgevoerd worden?


Transacties

Soms zijn er acties die uit meerdere stappen bestaan en die allemaal uitgevoerd moeten worden of allemaal niet uitgevoerd moeten worden. Dat zijn de enige 2 opties. Transacties voldoen aan de eisen van ACID:

  • Atomicity: een transactie wordt 1x uitgevoerd en moet "atomic" zijn, of alles wordt uitgevoerd of niets wordt uitgevoerd.
  • Consistency: de data is zowel voor als na de transactie consistent.
  • Isolation: zorg dat de ene transactie geen invloed heeft op een andere transactie.
  • Durability: wijzigingen die door de transactie uitgevoerd zijn, zijn definitief doorgevoerd in het systeem. Mocht na het afronden van een transactie het systeem crashen en opnieuw opstarten dan is die eindstatus de nieuwe beginstatus van het systeem.


Transactionele databases worden meestal OLTP genoemd (OnLine Transaction Processing). Deze systemen ondersteunen veel gebruikers, zijn snel en kunnen veel data verwerken. Hebben minimale downtime en de transacties die ze uitvoeren zijn meestal "klein".

Aan de andere kant heb je OLAP (OnLine Analytical Processing) systemen. Deze hebben weinig gebruikers, hebben langere response-tijden, zijn minder beschikbaar en moeten vaak zware processen en transacties uitvoeren.

In de voorbeeld-case wordt productdata als semi-gestructureerd beschouwd, omdat er regelmatig nieuwe velden bij komen. Cosmos DB ondersteunt dit. Cosmos ondersteunt TSQL, nieuwe velden worden geïndexeerd, ACID compliant en data kan wereldwijd gerepliceerd worden.

Door naar het volgende blok, Create an Azure Storage account: link.

We gaan dus aan de slag met Storage Accounts. De site komt met het voorbeeld van een koekjesfabriek. De bereidingswijze, instructiefilmpjes, spreadsheets zijn bedrijfskritisch en moeten dus niet verloren gaan. De kosten hiervoor gaan naar de hoofdvestiging. De verkopers hebben hun eigen filmpjes en promotiemateriaal, dat is niet bedrijfskritisch, kosten daarvan gaan naar het sale-team.

Je hebt meerdere manieren om data op te slaan. Onder de noemer "Azure Storage" vallen de vier diensten: Azure Blobs, Azure Files, Azure Queue's en Azure Tables. SQL en Cosmos DB vallen hier buiten.

Een Storage Account is een container die 1 of meerdere van deze storage-items bevat. Hierdoor kun je ze als een groep behandelen.

In een Storage Account kun je bepaalde zaken instellen:

  • Abonnement: welke afdeling ontvangt de factuur?
  • Locatie: welk datacenter gaat de data opslaan?
  • Performance: Standard: Blob, File, Queue, Table en op magnetische disk / Premium: extra opties zoals Block blobs en append blobs, premium file shares en allemaal op SSD schijven.
  • Replicatie: minimaal 3 kopieën in hetzelfde datacenter: Locally Redundant Storage (LRS). Je kunt updaten naar Geo Redundant Storage (GRS).
  • Access tier: hoe snel je toegang hebt tot je data, hot: snel, cool: iets langer wachten.
  • Secure transfer required: of je via HTTPS wilt benaderen (sommige externe diensten ondersteunen dat (nog) niet en daarom kun je hier HTTP instellen.
  • Virtual Networks: hiermee kun je instellen dat inbound verkeer alleen vanaf dit netwerk mag komen.


Als je data divers is, heb je meestal meerdere storage accounts nodig (1 voor Europa, 1 voor US, 1 voor publieke data, 1 voor afgeschermde data via Virtual Network).

Elk Storage Account heeft een unieke naam. Minimaal 3, maximaal 24 karakters. Alleen cijfers en letters.

Een Storage Account heeft een deployment model. Standaard is de Resource Manager: het huidige model dat de Azure Resource Manager API gebruikt en je hebt nog een legacy optie (niet meer gebruiken dus), de Classic variant, die gebruikt de Azure Service Management API. Storage accounts, virtual machines en virtual networks ondersteunen beide, dus hier moet je mogelijk een keuze maken.

Er zijn 3 type accounts waar je uit kunt kiezen:

  • StorageV2 (general purpose v2): de huidige standaard die alle storage types ondersteunt en alle features bevat.
  • Storage (general purpose v1): een legacy type, ondersteunt alle storage types, maar ondersteunt niet alle features. Kosten voor transacties zijn hier lager.
  • Blob storage: nog een legacy type, ondersteunt alleen block blobs en append blobs.


Je kunt op verschillende manieren een Storage Account aanmaken:

  • Azure Portal
  • Azure CLI (Command-line interface)
  • Azure PowerShell
  • Management client libraries


We gaan een opdracht uitvoeren. De case heb ik wel eens eerder gezien, je bent een bedrijf wat surfplanken verkoopt en biedt een coole feature, op jouw site kunnen surfers zien hoe het weer op bepaalde plekken is. Surfers kunnen hun foto's en video's uploaden. Dit kan soms een zware belasting zijn en data moet up-to-date blijven. In deze case maken we een Storage Account aan. De uploads moeten doorgezet worden naar een Blob-storage.

Maar, bij het aanmaken volgens de specs blijf ik de foutmelding houden "That's not quite right", dus ik kan mijn punten voor deze module niet halen.
Foutmelding met gegevens naar Microsoft gestuurd, kijken of het wat oplevert. Ik blijf op deze pagina dus "hangen". Eerst maar door met het volgende deel;

https://docs.microsoft.com/en-us/learn/modules/create-azure-storage-account/5-exercise-create-a-storage-account
Update: de volgende dag exact hetzelfde gedaan. En toen lukte het wel. Dus ik vermoed dat er "iets" niet goed ging, punten in de pocket!

Door met het volgende blok, hopelijk lukt dat wel. Titel is Connect an app to Azure Storage, link.

Het voorbeeld hier is dat je een fotodienst hebt. Gebruikers uploaden afbeeldingen en kunnen ze via jouw dienst delen. Iets wat stabiel moet draaien.

Microsoft Azure Storage is een beheerde dienst die durable, secure, scalable opslag in de cloud aanbiedt.

  • Managed: Microsoft voert het onderhoud en lost kritieke problemen voor je op.
  • Durable: Door redundantie gaat geen data verloren door een storing. En met replicatie tussen verschillende datacenters of geo-locaties maak je het nog robuuster.
  • Secure: Je data is geëncrypt. En met Azure kun je inrichten wie wel (en niet) bij je data mag komen.
  • Scalable: Veel bezoekers, dan gaan we opschalen.
     

1 Azure abonnement (subscription) kan 250 storage accounts per regio hebben, elke account heeft een maximum opslaglimiet van 5 PiB.

Azure Storage bestaat uit 4 types data:

  • Blob: Een grote opslaglocatie voor tekst en binaire data. Kan ondersteuning leveren aan Azure Data Lake Storage Gen2.
  • Files: Beheerde file-shares voor cloud of on-premise (dus binnen het bedrijf van de klant) deployments.
  • Queues: Een berichtendienst voor het betrouwbaar uitwisselen van berichten tussen componenten.
  • Table Storage: Een noSQL-opslagdienst voor gestructureerde of ongestructureerde data. Wordt in deze module niet behandeld.


Blobs

Prima te gebruiken voor:

  • Locatie om afbeeldingen en documenten op te slaan die je in de browser kunt opvragen, bijvoorbeeld in een statische website.
  • Opslaan van bestanden om deze te kunnen distribueren.
  • Streamen van video en audio.
  • Opslaan van data voor back-up en herstel, herstel na rampen en archiveren van data.
  • Opslaan voor analyse door een on-premise of in Azure gehoste dienst.


Je hebt 3 smaken blobs:

  • Block blobs: 50.000 blobs van 100 MB per stuk (dus totaal 5 TB), te gebruiken voor tekst of binaire bestanden. Wordt gebruikt voor bestanden die je van begin tot eind leest, bijvoorbeeld afbeeldingen voor een website. Is het bestand groter dan 100 MB, dan wordt deze in stukken verdeeld.
  • Page blobs: random-access bestanden die 8 TB per stuk kunnen zijn. Voornamelijk gebruikt als back-up voor VHD schijfbestanden, gebruikt voor Virtuele Machines. Worden page blobs genoemd omdat ze random read/write toegang tot 512-byte pagina's leveren.
  • Append blobs: lijkt wel een beetje op block blobs, maar geoptimaliseerd voor toevoegen van data. Bijvoorbeeld om logging uit 1 applicatie die op meerdere VM's draait naar hetzelfde blob-item te laten schrijven. Een append blob kan maximaal 195 GB groot zijn.


Files

Een standaard netwerk file-share die benaderbaar is via SMB. Use-cases hiervoor zijn:

  • Opslaan gedeelde configuratiebestanden tussen verschillende VM's, tools, ondersteunende software zodat iedereen dezelfde versie gebruikt.
  • Plaats voor logbestanden, diagnostics, metrieken en crash dumps.
  • Gedeelde data tussen on-premise programma's en Azure VM's om een migratieproces van apps naar de cloud voor een bepaalde periode te ondersteunen.


Queues

Hebben we al behandeld, kan miljoenen berichten bevatten, een bericht is maximaal 64 KB.

Tables

De site verwijst naar deze pagina voor meer informatie: link.

Bij het aanmaken van een Storage Account heb je de keuze uit 3 smaken:

  • General-purpose v2 (GPv2): ondersteunt alle nieuwste features, prijs is ingesteld om de laagste per GB te zijn.
  • General-purpose v1 (GPv1): bevat niet de nieuwste features, kan ook wel eens iets duurder zijn. Cool Storage en Archive wordt niet ondersteund. Transactie-kosten zijn wel lager, dus als er veel lees-acties e.d. zijn kan dit een goedkopere dienst zijn dan de V2.
  • Blob storage accounts: legacy account-type. Zelfde specs als V2, maar ondersteunt alleen blocks en append blobs. Prijzen zijn over het algemeen bijna gelijk aan V2.

Deze data is wereldwijd via HTTP en HTTPS bereikbaar. Azure biedt SDK's aan voor interactie.

We maken een nieuw .NET core project. Vervolgens gaan we de tools testen/gebruiken. Zo krijgen we het overzicht hoe de verschillende data-types te benaderen zijn:

Blobs: https://[name].blob.core.windows.net/
Queues: https://[name].queue.core.windows.net/
Table: https://[name].table.core.windows.net/
Files: https://[name].file.core.windows.net/

Met een connectie-string en key kunnen je tools verbinding maken. Een connectie-string ziet er als volgt uit:


DefaultEndpointsProtocol=https;AccountName={your-storage};
   AccountKey={your-access-key};
   EndpointSuffix=core.windows.net

Er zijn 2 keys en dat heeft een reden: zo kun je zonder downtime "rotatie" uitvoeren. Je gebruikt de 1e sleutel, gebruikt daarna de 2e sleutel, waarbij je voor de 1e sleutel een nieuwe waarde laat genereren. En zo schakel je later over van 2 naar 1 en laat je voor 2 een nieuwe waarde genereren. De site adviseert om Azure Key Vault te gebruiken. Je werkt dan niet rechtstreeks met die waardes en het roteren kan Key Vault automatisch voor jou uitvoeren!

We gaan door met onze app, de connectie-string van ons aangemaakte Storage Account moeten we opvragen voor appsettings.json:


az storage account show-connection-string \
  --resource-group resource-groep-naam \
  --query connectionString \
  --name <name>

We maken met deze applicatie een container aan. Maar de dotnet run geeft bij mij nog een foutmelding. Door eerst een dotnet build te doen werkt het wel.

Met het commando az storage container list --account-name <name> krijg je een stuk JSON en kun je zien dat de container aangemaakt is.

We gaan vervolgens een afbeelding uploaden. Die gaan we eerst downloaden, deze afbeelding wordt daarvoor gebruikt: link. En zo zie ik dat Microsoft Docs ook op Github zit, met 1800 repo's. Mogelijk later nog eens bekijken, hier alvast de: link.

We kunnen inderdaad de upload uitvoeren, na  de upload wordt een controle gedaan en zie je een overzicht van geüploade bestanden. Meer informatie over de Blobs client library kun je hier vinden: link.

Na een aantal vragen komt er nog een overzicht met handige linkjes:

SDK Tools documentatie-site: link

Azure REST API Referentie: link

Shared Access Signatures: link

Key Vault benaderen met server apps: link

Broncode van de Azure SDK's: link

Storage Client Library voor Javascript: link

Door met het volgende blok, Secure your Azure Storage account: link.

In deze module gaan we kijken welke methodes en technieken Azure toepast om je data te beveiligen. Access-keys, afgeschermde netwerken, Advanced Threat Protection voor monitoring.

We beginnen met de Azure Storage security features. Data wordt beschermd "in rust", dus op het moment dat het opgeslagen is en er niets mee gedaan wordt, "in transit", dus al je data als verkeer "over de lijn gaat", browser cross-domain access, beheren wie toegang heeft tot de data en audit van toegang tot de data, zodat je kunt zien wie er toegang gehad heeft.

Encryption at rest: Storage Service Encryption, SSE met 256 bit Advanced Encryption Standard cipher (AES), FIPS 140-2 compliant. Bij het lezen wordt automatisch decryptie uitgevoerd, volgens de specs geen negatieve invloed op performance.

Azure Disk Encryption wordt gebruikt bij VHD schijfbestanden voor VM's. Bitlocker voor Windows machines, dm-crypt voor Linux. Hierbij wordt Azure Key Vault gebruikt, dus zou iemand de bestanden kunnen downloaden, dan heeft hij/zij geen sleutel(s) en kan er dus niets mee.

Bij "in transit" moet je dat over HTTPS doen. Je kunt aanvinken dat "secure transfer" aan staat: link. Hiermee dwing je het af, HTTP wordt dan geweigerd. SMB 3.0 wordt dan gebruikt.

CORS ondersteuning: via GET kun je bestanden alleen opvragen als het domein vrijgegeven is via CORS, anders niet.

Om toegang te krijgen tot afgeschermde zaken kan gebruik worden gemaakt van Role Based Access (RBAC), door bijvoorbeeld gebruik te maken van Azure Active Directory. Je kunt een security principal of beheerde identiteit voro Azure resources via RBAC roles toegang geven, waarbij deze een scope hebben voor een abonnement, resource groep, storage account of losse container of queue.

Via Storage Analytics kun je het audit bekijken, wie heeft wanneer toegang gehad tot een bepaalde resource?

Met Storage Account Keys (2 stuks) heb je toegang tot alles in het account. De site geeft een aantal redenen waarom je deze zou hergenereren;

  • Je hebt een (goede) security-policy waarin geregeld is dat je regelmatig je keys laat hergenereren;
  • Als iemand een applicatie hackt en daar de hard-coded sleutel bemachtigt, dan moet je een nieuwe genereren. De sleutel geeft namelijk volledig toegang tot jouw account :scream
  • Als je team een Storage Explorer applicatie gebruikt (en daar de storage account key voor gebruikt) en één van de teamleden verlaat het bedrijf, hergenereer de sleutel, anders kan het oude teamlid mogelijk nog toegang hebben tot jouw account.


Die Storage Account Keys gebruik je dus NIET om een externe partij toegang te geven tot jouw Storage Account. Hier gebruik je Shared Access Signature (SAS) voor. Dat is een token die je via de URL mee kunt geven. Je kunt iemand een SAS geven om een afbeelding naar een Blob-storage te uploaden, iemand anders kun je een SAS geven om de afbeeldingen die in een Blob-storage staan uit te lezen.

Je kunt met een service -level SAS iemand toegang geven tot een specifiek deel van een Storage Account.

Met een account-level SAS heeft iemand dezelfde toegang, maar ook extra opties, bijvoorbeeld het aanmaken van bestandssystemen.

We zien nog het voorbeeld van een Front End Proxy Service die het uploaden en doorgeven van bestanden afhandelt (en ook de validatie of deze persoon afbeeldingen mag uploaden). Als er veel requests zijn, boel moet opgeschaald worden, dan wil je dat die Front End Proxy niet meer laten doen. Je laat een SAS provider service dit afhandelen, die geeft een legitieme partij een SAS token waarmee die rechtstreeks kan uploaden naar de Blob-storage.

Standaard staat Azure Storage open voor elk netwerk, dat is dus het eerste wat je moet doen: afschermen. Dat kan op IP-basis, ranges of virtuele netwerken.

Microsoft Defender for Storage houdt in de gaten of er malafide requests op jouw storage wordt afgevuurd. De security alerts gaan via de Microsoft Defender for Cloud en via mails naar de admin(s). Microsoft Defender for Storage is beschikbaar voor blobs, Azure Files en Azure Data Lake Storage Gen2. Microsoft Defender for Cloud is beschikbaar voor general-purpose v2, block blob en Blob storage accounts. Microsoft Defender for Storage is beschikbaar in alle publieke clouds en het deel voor de US overheid, maar niet andere cloud regionen.

Als er onregelmatigheden voorvallen bevat de waarschuwingsmail die je ontvangt de volgende items:

  • Nature of the anomaly
  • Storage account name
  • Event time
  • Storage type
  • Potential causes
  • Investigation steps
  • Remediation steps
  • Email also includes details about possible causes and recommended actions to investigate and mitigate the potential threat


Bij Azure Data Lake Storage kun je met RBAC zaken beveiligen. Ook wordt ACL (Access Control Lists) ondersteund - POSIX compliant. Met OAuth 2 bearer tokens.

De belangrijkste analytische services die Data Lake Storage gebruiken (Azure Databricks, HDInsight, Azure Synapse Analytics) ondersteunen standaard deze zaken.

Tijd voor het laatste onderdeel, Store application data with Azure Blob storage: link.

We krijgen uitleg wat blobs zijn, in het kort "zijn het bestanden voor de cloud". Applicaties werken met deze bestanden zoals ze dat ook zouden doen met "gewone bestanden op schijf", alleen staan ze nu in de cloud en zijn ze (overal) te bereiken. Niet geschikt om als een soort "database" te gebruiken, want daar heb je over het algemeen iets met structuur voor nodig. Maar voor opslag van profielfoto's is een blob prima geschikt.

De site geeft nog een aantal voorbeelden;

  • Als apps een grote hoeveelheid data verzenden moet met een message systeem wat alleen kleine berichten ondersteunt. De app kan de data in blobs opslaan en de blob URL's in de berichten versturen.
  • Het kan gebruikt worden als een soort file-systeem op documenten en andere persoonlijke data op te slaan en met andere mensen te delen.
  • Statische afbeeldingen kunnen hier gebruikt worden en beschikbaar gemaakt worden voor publieke download alsof het bestanden op een web server zijn.
  • Veel Azure componenten gebruiken blobs achter de schermen. Bijvoorbeeld Azure Cloud Shell slaat je bestanden en configuratie op in blobs en Azure Virtual Machines gebruiken blobs voor de opslag van harde schijven.


Blobs worden verschillend gebruikt. Sommige apps maken, wijzigen en verwijderen blobs aan de lopende band, bij andere apps zijn de blobs statisch en gebeurt er weinig mee.

Blob storage maakt onderdeel uit van een container. Blobs en containers kunnen beide metadata bevatten (key-value-pair). Waar je trouwens niet op kunt zoeken!

De Blob-Storage API is gebaseerd op REST en kan met client-library's aangeroepen worden.

Standaard zijn blobs dat ze met authenticatie bereikbaar zijn. Die optie is uit te zetten voor zaken ie je publiek downloadbaar wilt maken. Blobs zijn opzet met een platte structuur. Maar om toch een soort bestandssysteem op te bouwen kun je een bestand documenten\financieel\2021\budget.doc noemen, deze komt dan in een map-structuur, een virtual directory.

We gaan weer een storage account aanmaken. Ditmaal via de Cloud Shell, dus niet via de portal:


az storage account create \
  --kind StorageV2 \
  --resource-group resource-group-name \
  --location westeurope \
  --name [your-unique-storage-account-name]

https://docs.microsoft.com/en-us/learn/modules/store-app-data-with-azure-blob-storage/4-create-storage-resources

En verrek, ik krijg hier nu dezelfde foutmelding over dat iets niet goed gaat. Later checken dus.

Door met het volgende punt, het verbinding maken via een client-applicatie. Met C# begin je meestal op deze manier:


BlobServiceClient blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.FileContainerName);

We beginnen met een project van Github: link.

We vullen de functies en gaan vervolgens de app aanmaken en de boel uploaden:


az appservice plan create \
--name blob-exercise-plan \
--resource-group resource-group-naam \
--sku FREE --location centralus

az webapp create \
--name <your-unique-app-name> \
--plan blob-exercise-plan \
--resource-group resource-group-naam

CONNECTIONSTRING=$(az storage account show-connection-string \
--name <your-unique-storage-account-name> \
--output tsv)

az webapp config appsettings set \
--name <your-unique-app-name> --resource-group resource-group-naam \
--settings AzureStorageConfig:ConnectionString=$CONNECTIONSTRING AzureStorageConfig:FileContainerName=files

dotnet publish -o pub
cd pub
zip -r ../site.zip *

az webapp deployment source config-zip \
--src ../site.zip \
--name <your-unique-app-name> \
--resource-group resource-group-naam

// bekijk jouw website (https://app-name.azurewebsites.net/
// upload en download bestanden.
// bekijk in console wat er geüpload is:

az storage blob list --account-name <your-unique-storage-account-name> --container-name files --query [].{Name:name} --output table
 

Tip, als je GetBlockBlobReference met de naam van een blob aanroept, dan wordt er lokaal een blob aangemaakt.

En nog een tip, ik ga nu terug naar de stap waar de controle (weer) fout ging. En nu gaat de controle wel goed. Punten binnen, door naar het volgende blok!