Azure CLI (az) Cheatsheet
Note: Replace placeholders like [RESOURCE_GROUP]
, [VM_NAME]
, [LOCATION]
, etc., with your actual values. Many commands inherit the location from the resource group. You often need to be logged in (az login
) first.
Core Concepts (Login, Accounts, Resource Groups)
- Login:
- Interactive:
az login
- Using Device Code (for environments without browser):
az login --use-device-code
- Interactive:
- Account/Subscription:
- List available subscriptions:
az account list --output table
- Show current subscription:
az account show --output table
- Set active subscription:
az account set --subscription "[SUBSCRIPTION_ID_OR_NAME]"
- List available subscriptions:
- Resource Groups:
- List resource groups:
az group list --output table
- Create resource group:
(e.g.,az group create --name [RESOURCE_GROUP] --location [LOCATION]
eastus
,westus2
,westeurope
) - Show resource group details:
az group show --name [RESOURCE_GROUP]
- Delete resource group (and all resources within it!):
az group delete --name [RESOURCE_GROUP] --yes --no-wait
- List resource groups:
Virtual Machines (VMs)
- List VMs in a resource group:
az vm list --resource-group [RESOURCE_GROUP] --output table
- Show VM details:
az vm show --resource-group [RESOURCE_GROUP] --name [VM_NAME] --show-details
- Create Linux VM:
az vm create \ --resource-group [RESOURCE_GROUP] \ --name [VM_NAME] \ --image UbuntuLTS \ --size Standard_DS1_v2 \ --admin-username [ADMIN_USER] \ --generate-ssh-keys
- Create Windows VM:
az vm create \ --resource-group [RESOURCE_GROUP] \ --name [VM_NAME] \ --image Win2019Datacenter \ --size Standard_DS1_v2 \ --admin-username [ADMIN_USER] \ --admin-password '[COMPLEX_PASSWORD]'
- Stop VM (Keeps resources provisioned):
az vm stop --resource-group [RESOURCE_GROUP] --name [VM_NAME]
- Start VM:
az vm start --resource-group [RESOURCE_GROUP] --name [VM_NAME]
- Deallocate VM (Stops compute billing):
az vm deallocate --resource-group [RESOURCE_GROUP] --name [VM_NAME]
- Restart VM:
az vm restart --resource-group [RESOURCE_GROUP] --name [VM_NAME]
- Delete VM (Doesn't delete disks/NICs by default):
az vm delete --resource-group [RESOURCE_GROUP] --name [VM_NAME] --yes
- SSH into Linux VM (requires SSH client):
# Get public IP first if needed # az vm show -d --resource-group [RESOURCE_GROUP] --name [VM_NAME] --query publicIps -o tsv # ssh [ADMIN_USER]@[PUBLIC_IP_ADDRESS] # Or use the az ssh command (may require an extension) az ssh vm --resource-group [RESOURCE_GROUP] --name [VM_NAME] --local-user [LOCAL_MACHINE_USER]
Azure Kubernetes Service (AKS)
- List AKS clusters:
az aks list --resource-group [RESOURCE_GROUP] --output table
- Show AKS cluster details:
az aks show --resource-group [RESOURCE_GROUP] --name [CLUSTER_NAME]
- Create AKS cluster:
az aks create \ --resource-group [RESOURCE_GROUP] \ --name [CLUSTER_NAME] \ --node-count 1 \ --enable-addons monitoring \ --generate-ssh-keys
- Get credentials (configures
kubectl
):
(Now useaz aks get-credentials --resource-group [RESOURCE_GROUP] --name [CLUSTER_NAME] --overwrite-existing
kubectl get nodes
,kubectl get pods
, etc.) - Scale AKS node pool:
az aks scale --resource-group [RESOURCE_GROUP] --name [CLUSTER_NAME] --node-count 3
- Delete AKS cluster:
az aks delete --resource-group [RESOURCE_GROUP] --name [CLUSTER_NAME] --yes --no-wait
Azure Storage (Blobs)
Note: Requires a Storage Account. Many commands need --account-name [ACCOUNT_NAME]
. Use --auth-mode login
for Azure AD authentication (preferred) or provide --account-key
or --connection-string
.
- List Storage Accounts:
az storage account list --resource-group [RESOURCE_GROUP] --output table
- Create Storage Account:
az storage account create \ --name [ACCOUNT_NAME] \ --resource-group [RESOURCE_GROUP] \ --location [LOCATION] \ --sku Standard_LRS \ --kind StorageV2
- List Containers (like buckets):
az storage container list --account-name [ACCOUNT_NAME] --auth-mode login --output table
- Create Container:
az storage container create --account-name [ACCOUNT_NAME] --name [CONTAINER_NAME] --auth-mode login
- List Blobs (objects) in Container:
az storage blob list --account-name [ACCOUNT_NAME] --container-name [CONTAINER_NAME] --auth-mode login --output table
- Upload File to Blob:
az storage blob upload \ --account-name [ACCOUNT_NAME] \ --container-name [CONTAINER_NAME] \ --name [BLOB_NAME] \ --file /path/to/local/file \ --auth-mode login
- Download Blob to File:
az storage blob download \ --account-name [ACCOUNT_NAME] \ --container-name [CONTAINER_NAME] \ --name [BLOB_NAME] \ --file /path/to/local/destination \ --auth-mode login
- Delete Blob:
az storage blob delete --account-name [ACCOUNT_NAME] --container-name [CONTAINER_NAME] --name [BLOB_NAME] --auth-mode login
- Delete Container:
az storage container delete --account-name [ACCOUNT_NAME] --name [CONTAINER_NAME] --auth-mode login
Azure SQL Database
Note: Requires an Azure SQL Server.
- List SQL Servers:
az sql server list --resource-group [RESOURCE_GROUP] --output table
- List Databases on a Server:
az sql db list --resource-group [RESOURCE_GROUP] --server [SERVER_NAME] --output table
- Show Database details:
az sql db show --resource-group [RESOURCE_GROUP] --server [SERVER_NAME] --name [DB_NAME]
- Create Database:
az sql db create \ --resource-group [RESOURCE_GROUP] \ --server [SERVER_NAME] \ --name [DB_NAME] \ --edition Basic # Or Standard, Premium, etc.
- Set Firewall Rule (to allow access from your IP):
# Find your public IP (e.g., using curl ifconfig.me) az sql server firewall-rule create \ --resource-group [RESOURCE_GROUP] \ --server [SERVER_NAME] \ --name AllowMyIP \ --start-ip-address [YOUR_PUBLIC_IP] \ --end-ip-address [YOUR_PUBLIC_IP]
- Delete Database:
az sql db delete --resource-group [RESOURCE_GROUP] --server [SERVER_NAME] --name [DB_NAME] --yes
- Export Database (to BACPAC in Azure Storage):
az sql db export \ --resource-group [RESOURCE_GROUP] \ --server [SERVER_NAME] \ --database [DB_NAME] \ --admin-user [SQL_ADMIN_USER] \ --admin-password '[SQL_ADMIN_PASSWORD]' \ --storage-key-type StorageAccessKey \ --storage-key "[STORAGE_ACCOUNT_KEY]" \ --storage-uri "https://[STORAGE_ACCOUNT_NAME].blob.core.windows.net/[CONTAINER_NAME]/[FILENAME.bacpac]"
- Import Database (from BACPAC in Azure Storage):
az sql db import \ --resource-group [RESOURCE_GROUP] \ --server [SERVER_NAME] \ --database [DB_NAME] \ --admin-user [SQL_ADMIN_USER] \ --admin-password '[SQL_ADMIN_PASSWORD]' \ --storage-key-type StorageAccessKey \ --storage-key "[STORAGE_ACCOUNT_KEY]" \ --storage-uri "https://[STORAGE_ACCOUNT_NAME].blob.core.windows.net/[CONTAINER_NAME]/[FILENAME.bacpac]" \ --edition Basic # Target edition
RBAC (Role-Based Access Control)
- List Role Definitions (available roles):
az role definition list --output table --query "[].{Name:roleName, Id:name, Type:roleType}" # Basic info az role definition list --name "[ROLE_NAME]" # Find specific role like "Reader", "Contributor"
- Assign Role to User/Service Principal:
# Get Principal ID (Object ID) of the user or service principal # az ad user show --id [email protected] --query id -o tsv # az ad sp list --display-name <sp_name> --query "[].id" -o tsv az role assignment create \ --assignee [PRINCIPAL_ID] \ --role "[ROLE_NAME_OR_ID]" \ --scope "/subscriptions/[SUBSCRIPTION_ID]/resourceGroups/[RESOURCE_GROUP]" # Or other scopes like subscription, resource
- List Role Assignments (at a scope):
az role assignment list --resource-group [RESOURCE_GROUP] --output table # For a resource group az role assignment list --assignee [PRINCIPAL_ID] --output table # For a specific principal
- Remove Role Assignment:
az role assignment delete \ --assignee [PRINCIPAL_ID] \ --role "[ROLE_NAME_OR_ID]" \ --scope "/subscriptions/[SUBSCRIPTION_ID]/resourceGroups/[RESOURCE_GROUP]"
App Service (Web Apps)
Note: Requires an App Service Plan.
- List App Service Plans:
az appservice plan list --resource-group [RESOURCE_GROUP] --output table
- Create App Service Plan:
az appservice plan create \ --name [PLAN_NAME] \ --resource-group [RESOURCE_GROUP] \ --sku F1 # Free tier, others: B1, S1, P1V2 etc. # Use --is-linux for Linux plans
- List Web Apps:
az webapp list --resource-group [RESOURCE_GROUP] --output table
- Create Web App (Linux example):
az webapp create \ --resource-group [RESOURCE_GROUP] \ --plan [PLAN_NAME] \ --name [WEBAPP_NAME] \ --runtime "PYTHON:3.9" # Other examples: "NODE:16-lts", "DOTNET:6.0", "PHP:8.0"
- Deploy Code (Zip deploy example):
# Ensure you are in the directory with your zipped code or the code itself az webapp deploy \ --resource-group [RESOURCE_GROUP] \ --name [WEBAPP_NAME] \ --src-path [/path/to/your/app.zip] # Or point to a folder --type zip # Or other types like git, war, jar
- Browse Web App:
az webapp browse --resource-group [RESOURCE_GROUP] --name [WEBAPP_NAME]
- Delete Web App:
az webapp delete --resource-group [RESOURCE_GROUP] --name [WEBAPP_NAME]
Azure Monitor (Activity Log)
- List Activity Log entries for a resource group:
az monitor activity-log list --resource-group [RESOURCE_GROUP] --output table --max-events 10
- Filter Activity Log (example: by caller):
az monitor activity-log list --resource-group [RESOURCE_GROUP] --caller "[email protected]" --max-events 10
- Filter Activity Log (example: by status):
az monitor activity-log list --resource-group [RESOURCE_GROUP] --status Failed --max-events 10
Service Bus (Messaging)
Note: Requires a Service Bus Namespace. Roles like "Azure Service Bus Data Sender/Receiver" are often needed on the namespace for sending/receiving.
- List Service Bus Namespaces:
az servicebus namespace list --resource-group [RESOURCE_GROUP] --output table
- Create Service Bus Namespace:
az servicebus namespace create \ --resource-group [RESOURCE_GROUP] \ --name [NAMESPACE_NAME] \ --location [LOCATION] \ --sku Basic # Or Standard, Premium
- List Topics:
az servicebus topic list --resource-group [RESOURCE_GROUP] --namespace-name [NAMESPACE_NAME] --output table
- Create Topic:
az servicebus topic create \ --resource-group [RESOURCE_GROUP] \ --namespace-name [NAMESPACE_NAME] \ --name [TOPIC_NAME]
- Send Message to Topic:
az servicebus topic message send \ --resource-group [RESOURCE_GROUP] \ --namespace-name [NAMESPACE_NAME] \ --topic-name [TOPIC_NAME] \ --message-body "Your message content here"
- List Subscriptions for a Topic:
az servicebus topic subscription list \ --resource-group [RESOURCE_GROUP] \ --namespace-name [NAMESPACE_NAME] \ --topic-name [TOPIC_NAME] \ --output table
- Create Subscription for a Topic:
az servicebus topic subscription create \ --resource-group [RESOURCE_GROUP] \ --namespace-name [NAMESPACE_NAME] \ --topic-name [TOPIC_NAME] \ --name [SUBSCRIPTION_NAME]
- (Receiving messages is typically done via SDKs, not directly via a simple CLI command for typical workflows.)