Microsoft Azure Expert
Expert guidance for Microsoft Azure cloud platform, services, and cloud-native architecture.
Core Concepts
-
Azure Resource Manager (ARM)
-
Virtual Machines and App Services
-
Azure Functions (serverless)
-
Azure Storage (Blob, Queue, Table)
-
Azure SQL Database
-
Cosmos DB
-
Azure Kubernetes Service (AKS)
-
Azure Active Directory
Azure CLI
Login
az login
Create resource group
az group create --name myResourceGroup --location eastus
Create VM
az vm create
--resource-group myResourceGroup
--name myVM
--image UbuntuLTS
--admin-username azureuser
--generate-ssh-keys
Create App Service
az webapp create
--resource-group myResourceGroup
--plan myAppServicePlan
--name myWebApp
--runtime "NODE|14-lts"
Create storage account
az storage account create
--name mystorageaccount
--resource-group myResourceGroup
--location eastus
--sku Standard_LRS
Azure Functions
import azure.functions as func import logging
app = func.FunctionApp()
@app.function_name(name="HttpTrigger") @app.route(route="hello") def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed a request.')
name = req.params.get('name')
if not name:
try:
req_body = req.get_json()
name = req_body.get('name')
except ValueError:
pass
if name:
return func.HttpResponse(f"Hello, {name}!")
else:
return func.HttpResponse(
"Please pass a name",
status_code=400
)
@app.function_name(name="QueueTrigger") @app.queue_trigger(arg_name="msg", queue_name="myqueue", connection="AzureWebJobsStorage") def queue_trigger(msg: func.QueueMessage): logging.info(f'Python queue trigger function processed: {msg.get_body().decode("utf-8")}')
Cosmos DB
from azure.cosmos import CosmosClient, PartitionKey
endpoint = "https://myaccount.documents.azure.com:443/" key = "YOUR_KEY"
client = CosmosClient(endpoint, key) database = client.create_database_if_not_exists(id="myDatabase") container = database.create_container_if_not_exists( id="myContainer", partition_key=PartitionKey(path="/userId") )
Create item
item = { "id": "1", "userId": "user123", "name": "John Doe" } container.create_item(body=item)
Query items
query = "SELECT * FROM c WHERE c.userId = @userId" items = container.query_items( query=query, parameters=[{"name": "@userId", "value": "user123"}], enable_cross_partition_query=True )
for item in items: print(item)
ARM Templates
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "resources": [ { "type": "Microsoft.Web/sites", "apiVersion": "2021-02-01", "name": "[parameters('webAppName')]", "location": "[parameters('location')]", "properties": { "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]" } } ] }
Best Practices
-
Use managed identities
-
Implement Azure Key Vault
-
Tag resources properly
-
Use ARM templates or Bicep
-
Monitor with Azure Monitor
-
Implement auto-scaling
-
Use availability zones
Anti-Patterns
❌ Hardcoded credentials ❌ No resource tagging ❌ Single region deployment ❌ No backup strategy ❌ Ignoring cost optimization ❌ Not using managed services
Resources
-
Azure Documentation: https://docs.microsoft.com/azure/
-
Azure CLI: https://docs.microsoft.com/cli/azure/