powershellazure-automation

how to create a scrip in Automation Account to fetch Quotas and Used Capacity for every fileshare


I have been trying to write script in Powershell for Azure Automation Aaccount. It should be able to:

  1. Get lists of Fileshares in Storage Account
  2. Get total Quota used for every Fileshare
  3. Get Used capacity and display all those data into screen.

This is what I got so far:

# Import the required Azure modules
Import-Module Az.Accounts
Import-Module Az.Storage
Import-Module Az.Resources

# # Authenticate to Azure
# $connectionName = "AzureRunAsConnection"
# $servicePrincipalConnection = Get-AutomationConnection -Name $connectionName
# Connect-AzAccount -ServicePrincipal -Tenant $servicePrincipalConnection.TenantId -ApplicationId $servicePrincipalConnection.ApplicationId -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint

# Variables
$env:AZURE_STORAGE_CONNECTION_STRING = "zzzzzzz"
$resourceGroupName = "vvvvv"
$storageAccountName = "bbbbb"
$subscriptionId = "mmmm"
$resourceGroupName =  "nnnn"
$storageAccountName =  "iiiii"
$storageAccountKey = "wwwwww"
 
# Manage identity check
$connectionString = "DefaultEndpointsProtocol=https;AccountName=$storageAccountName;AccountKey=$storageAccountKey;EndpointSuffix=core.windows.net"


# Get the storage account context
$storageAccount = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
# $storageAccount = Get-AzStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName
$storageContext = $storageAccount.Context

# Get the list of file shares
$fileShares = az storage share list --account-name $storageAccountName --query "[].name" -o tsv


# Loop through each file share and retrieve quota and usage
foreach ($shareName in $fileShares) {
    # Get the file share properties using Azure CLI
    $shareProperties = az storage share show --name $shareName --account-name $storageAccountName --query "{quota:properties.quota, usage:properties.usage}" -o json | ConvertFrom-Json

    $quotaGB = $shareProperties.quota
    $usedCapacityBytes = $shareProperties.usage
    $usedCapacityGB = [math]::Round($usedCapacityBytes / 1GB, 2)

    # Output the results
    Write-Output "File Share: $shareName"
    Write-Output "Quota (GB): $quotaGB"
    Write-Output "Used Capacity (GB): $usedCapacityGB"
    Write-Output "-----------------------------"
}

Problem is I cannot get Used capacity to screen. It always says :0.enter image description here

Over investigation I have found that:

Azure CLI and Azure Storage PowerShell modules do not directly provide used capacity for file shares through a simple API call.

To achieve this, you might need to:

List the files and directories in the file share. Calculate the total size of all files and directories.

Couple of questions:

  1. Can you help to modify above script?
  2. Is there any restictions in API for storage account to get this data?
  3. Should I enable any additional metrics to get this data?

Solution

  • I have creted this script:

    # Import the required Azure modules
    Import-Module Az.Accounts
    Import-Module Az.Storage
    Import-Module Az.Resources
    
    # # Authenticate to Azure
    Connect-AzAccount -Identity
    
    # Variables
    $env:""
    $storageAccountName = ""
    $subscriptionId = ""
    $storageAccountKey = ""
    $resourceGroupName =  ""
    
    # Manage identity check
    $connectionString = "DefaultEndpointsProtocol=https;AccountName=$storageAccountName;AccountKey=$storageAccountKey;EndpointSuffix=core.windows.net"
    
    
    # Get the storage account context
    $storageAccount = New-AzStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $storageAccountKey
    $ctx = $storageAccount.Context
    
    # Get the list of file shares
    $fileShares = az storage share list --account-name $storageAccountName --query "[].name" -o tsv
    
    
    # Loop through each file share and retrieve quota and usage
    foreach ($shareName in $fileShares) {
    
        $usage = Get-AzRmStorageShare -ResourceGroupName $resourceGroupName -StorageAccountName $storageAccountName -Name $shareName -GetShareUsage 
        Write-Output  $usage
        Write-Output "-----------------------------"
    
        
        # Check if usage data is returned
        if ($usage -ne $null) {
            # Extract the ShareUsageBytes property (update the property name if necessary)
            $usageInBytes = $usage.ShareUsageBytes  # Adjust property name as needed
    
            # Convert bytes to gigabytes
            $usageInGB = $usageInBytes / 1GB
    
            # Format and output the result
            Write-Output "File Share: $shareName"
            Write-Output "Usage: $([math]::Round($usageInGB, 2)) GB"
            Write-Output "-----------------------------"
        } else {
            Write-Output "No usage data found for file share: $shareName"
        }
    
    
    }