Azure AZ-303 – Skills Outline

I’ve been wondering about the differences between the (free) Microsoft-Azure Online-Training and the (paid) AZ-303 Instructor-Led Training. After having a quick look at the „AZ-303 Exam Skills Outline“ there seems to be an 1:1-Mapping between „Exam Skills Outline“ and the instructor led training.

Exam Skills Outline

According to https://query.prod.cms.rt.microsoft.com/cms/api/am/binary/RE4psD6 the exam is made up from 15 modules:

The changes to the schedule starting at 25th of May 2021 are of cosmetic nature, Microsoft fixed some typos and removed some minor AAD-sub-topics…

1) Implement and Monitor an Azure Infrastructure (50-55%)
1.1) Cloud infrastructure monitoring
1.2) Storage accounts
1.3) VMs for Windows and Linux
1.4) Automate deployment and configuration of resources
1.5) Virtual networking
1.6) Azure Active Directory
1.7) Implement and manage hybrid identities (~Azure AD Connect)

2) Implement Management and Security Solutions (25-30%)
2.1) Manage workloads in Azure
2.2) Load balancing and network security
2.3) Implement and manage Azure governance solutions
2.4) Manage security for applications

3) Implement Solutions for Apps (10-15%)
3.1) Implement an application infrastructure
3.2) Container-based applications

4) Implement and Manage Data Platforms (10-15%)
4.1) Implement NoSQL databases
4.2) Implement Azure SQL databases

AZ303 Instructor-Led Training

The official Microsoft Instructor-Led Training for AZ303 is made up of 15 Modules:

  • there is an 1:1 mapping – but the order of modules has been „shuffled“
  1. Azure Active Directory => 1.6
  2. Hybrid Identities => 1.7
  3. Networking => 1.5
  4. VMs => 1.3
  5. Load Balancing and Network Security => 2.2
  6. Storage Accounts => 1.2
  7. NoSQL Databases => 4.1
  8. Azure SQL Databases => 4.2
  9. Automate Deployment and Configuration of Resources => 1.4
  10. Azure Governance Solutions => 2.3
  11. Security for Applications => 2.4
  12. Manage Workloads in Azure => 2.1
  13. Container-Based Applications => 3.2
  14. Implement an Application Infrastructure => 3.1
  15. Cloud Infrastructure Monitoring => 1.1

Let’s go

It should be possible to repeat a 5day class within 28 days

AZ-303 Schedule

Azure Regions on Request

According to https://docs.microsoft.com/en-us/azure/best-practices-availability-paired-regions there is a Regional-Pair to „Germany West Central“ called „Germany North“ which is missing at https://azure.microsoft.com/en-us/global-infrastructure/geographies since access is restricted to support specific customer scenarios, for example in-country disaster recovery. These regions are available only upon request by creating a new support request in the Azure portal

Germany North could be found in the list (https://azure.microsoft.com/en-us/global-infrastructure/geographies/#new-regions) so it might be coming soon for general availability.

List available Azure-Locations

C:\RH> az account list-locations --query "[].{name:name}" -o table
Name
-------------------
eastus
eastus2
southcentralus
westus2
australiaeast
southeastasia
northeurope
uksouth
westeurope
centralus
northcentralus
westus
southafricanorth
centralindia
eastasia
japaneast
jioindiawest
koreacentral
canadacentral
francecentral
germanywestcentral
norwayeast
switzerlandnorth
uaenorth
brazilsouth
centralusstage
eastusstage
eastus2stage
northcentralusstage
southcentralusstage
westusstage
westus2stage
asia
asiapacific
australia
brazil
canada
europe
global
india
japan
uk
unitedstates
eastasiastage
southeastasiastage
centraluseuap
eastus2euap
westcentralus
westus3
southafricawest
australiacentral
australiacentral2
australiasoutheast
japanwest
koreasouth
southindia
westindia
canadaeast
francesouth
germanynorth
norwaywest
switzerlandwest
ukwest
uaecentral
brazilsoutheast

Azure-CLI: Download File from Fileshare

ronald@Azure:~$ az storage file list -s FILESHARE -o table
Name               Content Length    Type    Last Modified
-----------------  ----------------  ------  ---------------
DEMO.TXT           9                 file

ronald@Azure:~$ az storage file download -s FILESHARE -p DEMO.TXT
Finished[#############################################################]  100.0000%
{
  "content": null,
  "metadata": {},
  "name": "DEMO.TXT",
  "properties": {
    "contentLength": 9,
    "contentRange": "bytes 0-8/9",
    "contentSettings": {
      "cacheControl": null,
      "contentDisposition": null,
      "contentEncoding": null,
      "contentLanguage": null,
      "contentType": "application/octet-stream"
    },
    "copy": {
      "completionTime": null,
      "id": null,
      "progress": null,
      "source": null,
      "status": null,
      "statusDescription": null
    },
    "etag": "\"0x8D8EB06203D00A5\"",
    "lastModified": "2021-03-19T18:38:01+00:00",
    "serverEncrypted": true
  }
}

ronald@Azure:~$ cat DEMO.TXT
RONRONRON

Azure: Storage-Account

Create a Storage-Account

az storage account create \
  --resource-group RGTEST \
  --name $STORAGE_ACCOUNT_NAME \
  --sku Standard_LRS \
  --location westeurope

retrieve connection string

AZURE_STORAGE_CONNECTION_STRING=$(az storage account show-connection-string \
  --resource-group RGTEST \
  --name $STORAGE_ACCOUNT_NAME \
  --output tsv)

ronald@Azure:~$ echo $AZURE_STORAGE_CONNECTION_STRING
DefaultEndpointsProtocol=https;EndpointSuffix=core.windows.net;AccountName=mystorageaccount4108;AccountKey=HlLklNRxLsKRzLw28Tc8W+0MDPv2RON/Stic8Lu1ryu0XiLDizlZRVnpAVwoSkzA==

Retrieve the Storage_key

ronald@Azure:~$ STORAGE_KEY=$(az storage account keys list \
>   --resource-group RGTEST \
>   --account-name $STORAGE_ACCOUNT_NAME \
>   --query "[0].value" \
>   --output tsv)
ronald@Azure:~$ echo $STORAGE_KEY
HlLklNRxLsKRzLw28Tc8W+0MDPv2RONAVwoSkzA==

create a file-share:

az storage share create --name TESTSHARE

Azure CLI: Default-Values for config-Session

In most cases, at least some parameters for a set of CLI-Commands remain the same. Setting those as „default“ saves time and reduces human error.

For example, specify your location and ressource-group exactly one time and never repeat it:

ronald@Azure:~$ az configure --defaults group=RG-TEST location=westeurope

Disclaimer

Since i’m trying to get rid of Evernote, too anoying too often, i’ll start to document non-private-stuff here.

RG_NAME=RG_TEST
LOCATION_NAME=westeurope
az group create --resource-group $RG_NAME --location $LOCATION_NAME

az configure --defaults group=$RG_NAME location=$LOCATION_NAME

Create Cosmos-DB and retrieve Connection-String

Retrieve the Conection-String of the Endpoint:

ronald@Azure:~$ COSMOS_DB_ENDPOINT=$(az cosmosdb create \
>   --resource-group RGTEST \
>   --name $COSMOS_DB_NAME \
>   --query documentEndpoint \
>   --output tsv)

ronald@Azure:~$ echo $COSMOS_DB_ENDPOINT
https://aci-cosmos-db-4711.documents.azure.com:443/

Disclaimer

Since i’m trying to get rid of Evernote, too anoying too often, i’ll start to document non-private-stuff here.

ronald@Azure:~$ COSMOS_DB_MASTERKEY=$(az cosmosdb keys list \
>   --resource-group RGTEST \
>   --name $COSMOS_DB_NAME \
>   --query primaryMasterKey \
>   --output tsv)
ronald@Azure:~$ echo $COSMOS_DB_MASTERKEY
nVcsc0lq5troD9XgUl5RRONXUpaxX0pkK06qmDItkvXAUrRONyJHaasial3G8dajcc6tn6Y12i2D29tKP99CUw==

Disclaimer

Since i’m trying to get rid of Evernote, too anoying too often, i’ll start to document non-private-stuff here.

Azure – Pricing API

This is a really nice feature – the Azure Pricing REST-API:

https://docs.microsoft.com/en-us/rest/api/cost-management/retail-prices/azure-retail-prices

It pulls a structured JSON-Dataset for (not only) Virtual Machines out of the Azure-Webshop.

For example – the following filter:
https://prices.azure.com/api/retail/prices?$filter=serviceName eq ‚Virtual Machines‘ and priceType eq ‚Consumption‘ and endswith(armRegionName, ‚europe‘) and (startswith(skuName, ‚D‘) or startswith(skuName, ‚E‘) or startswith(skuName, ‚F‘) or startswith(skuName, ‚M‘)) and endswith(skuName,‘ Spot‘)
displays the price for only

  • „VMs“

with specific properties:

  • no Reservation
  • in „.*europe“-Locations
  • with Types „D.*“ or „E.*“ or „F.*“ or „M.*“
  • Spot-Intances

but – if you don’t want „Spot“ Instances, you’d guess this filter-Statement: https://prices.azure.com/api/retail/prices?$filter=serviceName eq ‚Virtual Machines‘ and priceType eq ‚Consumption‘ and endswith(armRegionName, ‚europe‘) and (startswith(skuName, ‚D‘) or startswith(skuName, ‚E‘) or startswith(skuName, ‚F‘) or startswith(skuName, ‚M‘)) and not endswith(skuName,‘ Spot‘)

to end with … and not endswith(skuName,‘ Spot‘) according to https://docs.microsoft.com/en-us/azure/search/search-query-odata-logical-operators but this breaks the call – the API returns :

{"Error":{"Code":"BadRequest","Message":"Invalid OData parameters supplied"}}

Microsoft Azure – Hyperthreading and Nested Virtualization

Go to https://docs.microsoft.com/en-us/azure/virtual-machines/acu and look for:

***Hyper-threaded and capable of running nested virtualization

The following „script“ pulls the SKUs out of the table:

wget -O - --no-check-certificate https://docs.microsoft.com/en-us/azure/virtual-machines/acu | egrep -B2 "\*\*\*" | egrep "data-linktype" | sed -E "s/^.+relative-path..([^\<]+).+$/SKU: \1/g"
C:\RH>echo "Hyper-threaded and capable of running nested virtualization" && wget -q -O - --no-check-certificate https://docs.microsoft.com/en-us/azure/virtual-machines/acu | egrep -B2 "\*\*\*" | egrep "data-linktype" | sed -E "s/^.+relative-path..([^\<]+).+$/SKU: \1/g"
"Hyper-threaded and capable of running nested virtualization"
SKU: D_v3
SKU: Ds_v3
SKU: Dv4
SKU: Dsv4
SKU: Ddv4
SKU: Ddsv4
SKU: E_v3
SKU: Es_v3
SKU: Ev4
SKU: Esv4
SKU: Edv4
SKU: Edsv4
SKU: F2s_v2 - F72s_v2
SKU: M

Next Step? Finding one with enough memory for an acceptable price.