Leverage Azure CLI to automate cloud file transfers efficiently
 
            Azure CLI is a versatile tool that allows you to automate file transfers and manage Azure Storage efficiently. This guide provides practical examples and step-by-step instructions to streamline your cloud workflows.
Installation and setup
Install Azure CLI on your system:
On Windows
winget install -e --id Microsoft.AzureCLI
On macOS
brew install azure-cli
On Linux (Ubuntu/Debian)
# Install pre-requisites
sudo apt-get update
sudo apt-get install -y ca-certificates curl apt-transport-https lsb-release gnupg
# Download and install the Microsoft signing key
sudo mkdir -p /etc/apt/keyrings
curl -sLS https://packages.microsoft.com/keys/microsoft.asc |
    gpg --dearmor |
    sudo tee /etc/apt/keyrings/microsoft.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/microsoft.gpg
# Add the Azure CLI software repository
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/microsoft.gpg] https://packages.microsoft.com/repos/azure-cli/ $(lsb_release -cs) main" |
    sudo tee /etc/apt/sources.list.d/azure-cli.list
# Update repository information and install the azure-cli package
sudo apt-get update
sudo apt-get install azure-cli
After installation, authenticate with Azure:
az login
For automated or headless authentication, use Microsoft Entra ID with managed identities or service principals:
# Using service principal with rbac
az login --service-principal \
    --username $APP_ID \
    --password $PASSWORD \
    --tenant $TENANT_ID
# Assign proper rbac role
az role assignment create \
    --assignee $APP_ID \
    --role "Storage Blob Data Contributor" \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT"
Verify the installation and check the version:
# Current version as of April 2024: 2.68.0
az --version
Creating a storage account
Create a resource group and storage account with enhanced security settings:
# Create resource group
az group create --name myResourceGroup --location eastus
# Create storage account with security settings
az storage account create \
    --name mystorageaccount \
    --resource-group myResourceGroup \
    --location eastus \
    --sku Standard_LRS \
    --min-tls-version TLS1_2 \
    --allow-blob-public-access false \
    --public-network-access Disabled \
    --https-only true \
    --encryption-services blob
Using Microsoft Entra ID authentication
Use Microsoft Entra ID authentication instead of storage account keys:
# Enable Microsoft Entra ID authentication
az storage account update \
    --name mystorageaccount \
    --resource-group myResourceGroup \
    --enable-hierarchical-namespace true \
    --default-action Deny
# Assign yourself the storage blob data contributor role
az role assignment create \
    --role "Storage Blob Data Contributor" \
    --assignee-object-id $(az ad signed-in-user show --query id -o tsv) \
    --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT"
Transferring files using Azure CLI
Uploading files
Upload files using Microsoft Entra ID authentication:
# Create a container
az storage container create \
    --name mycontainer \
    --account-name mystorageaccount \
    --auth-mode login
# Upload a file
az storage blob upload \
    --container-name mycontainer \
    --file /path/to/local/file.txt \
    --name remote-file.txt \
    --account-name mystorageaccount \
    --auth-mode login
Downloading files
Retrieve files using Microsoft Entra ID authentication:
az storage blob download \
    --container-name mycontainer \
    --name remote-file.txt \
    --file /path/to/local/destination.txt \
    --account-name mystorageaccount \
    --auth-mode login
Automating batch file transfers with Azure CLI
Create a script to handle multiple file transfers with error handling:
#!/bin/bash
# Configuration
source_dir="/path/to/local/files"
container_name="mycontainer"
account_name="mystorageaccount"
# Check if storage account exists
if ! az storage account show --name $account_name --resource-group myResourceGroup >/dev/null 2>&1; then
    echo "Storage account does not exist"
    exit 1
fi
# Upload all files in directory with retry logic
for file in "$source_dir"/*; do
    filename=$(basename "$file")
    max_retries=3
    retry_count=0
    while [ $retry_count -lt $max_retries ]; do
        if az storage blob upload \
            --container-name $container_name \
            --file "$file" \
            --name "$filename" \
            --account-name $account_name \
            --auth-mode login; then
            echo "Uploaded: $filename"
            break
        else
            retry_count=$((retry_count + 1))
            if [ $retry_count -lt $max_retries ]; then
                echo "Retry $retry_count for $filename"
                sleep 5
            else
                echo "Failed to upload $filename after $max_retries attempts"
            fi
        fi
    done
done
Optimizing transfer performance
For large files or many files, use concurrent uploads with azcopy:
# Install azcopy
az storage copy \
    --source "/path/to/source/directory/*" \
    --destination "https://$account_name.blob.core.windows.net/$container_name" \
    --recursive \
    --put-md5 \
    --auth-mode login
Managing file access with Azure storage
Generate user delegation SAS tokens for secure file sharing:
# Get user delegation key
end_time=$(date -u -d "30 minutes" '+%Y-%m-%dT%H:%MZ')
az storage container generate-sas \
    --name mycontainer \
    --account-name mystorageaccount \
    --permissions r \
    --expiry $end_time \
    --auth-mode login \
    --as-user \
    --https-only
Monitoring and logging
Track file transfer operations and enable diagnostic logging:
# Enable diagnostic settings
az monitor diagnostic-settings create \
    --name "storage-diagnostics" \
    --resource "$storage_account_id" \
    --logs '[{"category": "StorageRead","enabled": true},{"category": "StorageWrite","enabled": true}]' \
    --metrics '[{"category": "Transaction","enabled": true}]' \
    --workspace "$log_analytics_workspace_id"
# List all blobs in a container
az storage blob list \
    --container-name mycontainer \
    --account-name mystorageaccount \
    --auth-mode login \
    --output table
Best practices
- 
Use managed identities: Implement Microsoft Entra ID managed identities for authentication instead of storage account keys. 
- 
Enable soft delete: Protect against accidental deletions. az storage blob service-properties delete-policy update \ --days-retained 7 \ --enable true \ --account-name mystorageaccount \ --auth-mode login
- 
Use private endpoints: Secure access to storage accounts. az network private-endpoint create \ --name "storage-endpoint" \ --resource-group myResourceGroup \ --vnet-name myVNet \ --subnet mySubnet \ --private-connection-resource-id "$storage_account_id" \ --group-id blob \ --connection-name "storage-connection"
- 
Enable versioning: Maintain multiple versions of your files. az storage account blob-service-properties update \ --account-name mystorageaccount \ --enable-versioning true
- 
Implement lifecycle management: Automate data lifecycle by creating a management policy. az storage account management-policy create \ --account-name mystorageaccount \ --resource-group myResourceGroup \ --policy @policy.json
- 
Enable infrastructure encryption: Enhance data security by enabling infrastructure encryption, if supported. az storage account update \ --name mystorageaccount \ --resource-group myResourceGroup \ --enable-infrastructure-encryption true
Next steps
- Set up your first automated file transfer.
- Configure lifecycle management for your storage account.
- Enable versioning for critical files.
Need to handle complex file processing workflows? Check out Transloadit for comprehensive file importing and exporting services.
Troubleshooting common issues
- 
Check connectivity issues: az network watcher check-connection \ --source sourceResourceId \ --dest storage_account_endpoint
- 
View operation logs: az monitor log-analytics query \ --workspace $workspace_id \ --query "StorageBlobLogs | where TimeGenerated > ago(1h)"
- 
Test storage account access: az storage account check-name \ --name mystorageaccount