【问题标题】:Check space used in azure storage accounts in my subscription在我的订阅中检查 azure 存储帐户中使用的空间
【发布时间】:2017-09-23 13:59:09
【问题描述】:

如何明智地检查我在订阅资源组中的每个 azure 存储帐户中使用了多少空间。

我无法找到通过 PowerShell、CLI、门户网站检查 azure 存储帐户中使用空间的方法...

【问题讨论】:

  • 查看账单会显示每日费用,这才是真正重要的。它可能会揭示其他惊喜,您可以按成本对所有资源进行排序。另请注意,较新的第 2 版定价(大部分)比第 1 版便宜,因此请检查您使用的是最新版本。

标签: azure local-storage azure-storage azure-blob-storage


【解决方案1】:

Azure 存储大小总共由 4 种服务(Blob、队列、文件、表)组成。据我所知,目前无法计算所有服务的总大小。

但是,您可以使用 Azure 指标获取 Portal 上使用的 blob 空间。请选择Monitor-->Metrics

有关在 Azure 门户中监控存储帐户的更多信息,请参阅link

此外,您可以使用 PowerShell 来获取您的 blob 使用情况。您可以使用一个很好的script

【讨论】:

  • 您的回答只会提供有关 Blob 存储大小的信息。它不包括该存储帐户中的表、文件和队列占用的空间。
  • 同一部分提供有关其他存储类型的容量信息。
  • 您都可以在存储帐户本身级别执行此操作
【解决方案2】:

Azure Storage Explorer 有一个“目录统计”按钮。

导航到文件夹

点击按钮

总数显示在活动面板中

【讨论】:

  • 对于 blob,它称为“文件夹统计信息”。此示例适用于文件共享。
  • 如果我使用这种方法(Azure 存储资源管理器),它会显示大约 2TiB,但是当使用 Monitor y Azure 门户(stackoverflow.com/a/66605579/1425717)时,它会在过去 4 小时内显示大约 6TiB。为什么会有这种差异?我想最后一笔是我要收费的
  • 如果您看到“过去 4 小时内”,这对我来说可能是您正在查看的带宽而不是磁盘大小?另一种可能性 - 这是一个完整的猜测,但也许如果您有很多小文件,那么每个文件可以在磁盘上的最小块大小,并且更大的大小将是您需要付费的。
【解决方案3】:

经过大量搜索,我发现这篇文章非常相关:

https://techcommunity.microsoft.com/t5/azure-paas-blog/calculate-the-size-capacity-of-storage-account-and-it-services/ba-p/1064046

使用 Azure Monitor 检查存储帐户的容量。 步骤:

  • 导航到 Azure Monitor
  • 单击存储帐户
  • 单击容量。您可以在此处并排查看所有帐户和已用容量。

【讨论】:

    【解决方案4】:

    这是一个 .net core 脚本,我使用过去一小时的平均指标值列出存储帐户使用情况。

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Threading;
    using Microsoft.Azure.Management.CosmosDB.Fluent.Models;
    using Microsoft.Azure.Management.Fluent;
    using Microsoft.Azure.Management.Monitor;
    using Microsoft.Azure.Management.Monitor.Models;
    using Microsoft.Rest.Azure.Authentication;
    
    namespace storagelist
    {
        class Program
        {
            static async System.Threading.Tasks.Task Main(string[] args)
            {
                // to generate my.azureauth file run the follow command:
                // az ad sp create-for-rbac --sdk-auth > my.azureauth
                var azure = Azure.Authenticate("my.azureauth").WithDefaultSubscription();
    
                var accounts = azure.StorageAccounts.List();
                // can get values from my.azureauth
                var tenantId = "";
                var clientId = "";
                var clientSecret = "";
                var serviceCreds = await ApplicationTokenProvider.LoginSilentAsync(tenantId, clientId, clientSecret);
                MonitorManagementClient readOnlyClient = new MonitorManagementClient(serviceCreds);
    
                var oneHour = System.TimeSpan.FromHours(1);
                var startDate = DateTime.Now.AddHours(-oneHour.Hours).ToUniversalTime().ToString("o");
                string endDate = DateTime.Now.ToUniversalTime().ToString("o");
                string timeSpan = startDate + "/" + endDate;
    
                List<string> fileContents = new List<string>();
    
                foreach (var storage in accounts)
                {
                    var response = await readOnlyClient.Metrics.ListAsync(
                    resourceUri: storage.Id,
                    timespan: timeSpan,
                    interval: oneHour,
                    metricnames: "UsedCapacity",
    
                    aggregation: "Average",
                    resultType: ResultType.Data,
                    cancellationToken: CancellationToken.None);
    
                    foreach (var metric in response.Value)
                    {
                        foreach (var series in metric.Timeseries)
                        {
                            foreach (var point in series.Data)
                            {
                                if (point.Average.HasValue)
                                {
                                    fileContents.Add($"{storage.Id}, {point.Average.Value}");
                                    break;
                                }
                            }
                            break;
                        }
                        break;
                    }
                }
    
                await File.WriteAllLinesAsync("./storage.csv", fileContents);
            }
        }
    }
    

    【讨论】:

    • 太棒了,直到我看到这个我才知道我想要这个。谢谢,我会用这个。
    【解决方案5】:

    这将为所有订阅中的每个资源组提供存储帐户容量

    $sub = Get-AzSubscription | select Name
    $sub | foreach { 
    Set-AzContext -Subscription $_.Name
    $currentSub = $_.Name
    $RGs = Get-AzResourceGroup | select ResourceGroupName
    $RGs | foreach {
    $CurrentRG = $_.ResourceGroupName
    $StorageAccounts = Get-AzStorageAccount -ResourceGroupName $CurrentRG | select StorageAccountName
    $StorageAccounts | foreach {
    $StorageAccount = $_.StorageAccountName
    $CurrentSAID = (Get-AzStorageAccount -ResourceGroupName $CurrentRG -AccountName $StorageAccount).Id
    $usedCapacity = (Get-AzMetric -ResourceId $CurrentSAID -MetricName "UsedCapacity").Data
    $usedCapacityInMB = $usedCapacity.Average / 1024 / 1024
    "$StorageAccount,$usedCapacityInMB,$CurrentRG,$currentSub" >> ".\storageAccountsUsedCapacity.csv"
    }
    }
    }
    

    Output

    【讨论】:

      【解决方案6】:

      你可以去: 主页 > {storage account} > {container} > 属性 在属性下,您将计算大小 Container Size

      【讨论】:

        【解决方案7】:

        要在 Powershell 中实现这一点,有点痛苦,但可能对其他人有用(例如清理旧备份): 这是我想出的,它至少应该适用于 AzureRM 模块 6.13.0:

        $azstorcontext = New-AzureStorageContext -StorageAccountName storageaccounthere -StorageAccountKey storageaccountkeyhere
        $sizesOverall = @()
        $containers = Get-AzureStorageContainer -Context $azstorcontext
        foreach ($container in $containers)
        {
            Write-Output $container.Name
            $contblobs = get-azurestorageblob -container $container.name -Context $azstorcontext
            Write-Output "  Blobs: $($contblobs.count)"
            $containersize = ($contblobs | Measure-Object -Sum Length).Sum
            Write-Output "    Container Size: $containersize) (bytes)"
            $sizesOverall    
        }
        

        【讨论】:

        • 该脚本的唯一问题是您从 SA 容器中获取所有 blob,并且当您在具有数十 TB 的 blob 的多个 SA 中执行此操作时,脚本会挂起数小时,有时甚至会挂起-out。
        【解决方案8】:

        使用 Cloud Shell 是迄今为止最好的解决方案之一:

        • 在 Cloud Shell 中添加一个 powershell 文件(查看下面的代码)
        • 使用 Storage-Account 和 Resource-Group 名称运行 PS 命令

        代码

        param($resourceGroup, $storageAccountName)
        
        
        # usage
        # Get-StorageAccountSize -resourceGroup <resource-group> -storageAccountName <storage-account-name>
        
        
        # Connect to Azure
        Connect-AzureRmAccount
        
        
        # Get a reference to the storage account and the context
        $storageAccount = Get-AzureRmStorageAccount `
        -ResourceGroupName $resourceGroup `
        -Name $storageAccountName
        $ctx = $storageAccount.Context
        
        # Get All Blob Containers
        $AllContainers = Get-AzureStorageContainer -Context $ctx
        $AllContainersCount = $AllContainers.Count
        Write-Host "We found '$($AllContainersCount)' containers. Processing size for each one"
        
        # Zero counters
        $TotalLength = 0
        $TotalContainers = 0
        
        # Loop to go over each container and calculate size
        Foreach ($Container in $AllContainers){
        $TotalContainers = $TotalContainers + 1
        Write-Host "Processing Container '$($TotalContainers)'/'$($AllContainersCount)'"
        $listOfBLobs = Get-AzureStorageBlob -Container $Container.Name -Context $ctx
        
        # zero out our total
        $length = 0
        
        # this loops through the list of blobs and retrieves the length for each blob and adds it to the total
        $listOfBlobs | ForEach-Object {$length = $length + $_.Length}
        $TotalLength = $TotalLength + $length
        }
        # end container loop
        
        #Convert length to GB
        $TotalLengthGB = $TotalLength /1024 /1024 /1024
        
        # Result output
        Write-Host "Total Length = " $TotallengthGB "GB"
        

        https://gist.github.com/iamsunny/8718fb29146363af11da95e5eb82f245

        【讨论】:

          【解决方案9】:

          我创建了 python 脚本来计算所有订阅中使用的存储空间。 好吧,这并不快:

          • 需要通过提供的权限请求所有订阅
          • 请求 Azure 资源图接收列表 /subscription/resourcegroup/storageaccount
          • 生成订阅列表,其中 storageaccount 存在
          • 为每个 /subscription/resourcegroup/storageaccount 请求 Azure Monitor 以接收 UsedCapacity
              from azure.mgmt.monitor import MonitorManagementClient
              from azure.mgmt.subscription import SubscriptionClient
              from msrestazure.azure_active_directory import ServicePrincipalCredentials
              from azure.mgmt.resourcegraph import ResourceGraphClient
              from azure.mgmt.resourcegraph.models import QueryRequest
              
              credentials = ServicePrincipalCredentials(client_id, secret, tenant=tenant_id)
              
              sub_object = SubscriptionClient(credentials)
              rgraph_object = ResourceGraphClient(credentials)
              storageaccount_pattern = "resources | where type == 'microsoft.storage/storageaccounts' | project id"
              
              subs = [sub.as_dict() for sub in sub_object.subscriptions.list()]
              
              subs_list = []
              for sub in subs:
                  subs_list.append(sub.get('subscription_id'))
              
              request_storageaccount = QueryRequest(subscriptions=subs_list, query=storageaccount_pattern)
              rgraph_storageaccount = rgraph_object.resources(request_storageaccount).as_dict()
              
              resource_ids = []
              
              for element in rgraph_storageaccount['data']:
                  resource_ids.append(element['id'])
              
              count_used_storage = 0
              for resource_id in resource_ids:
                  sub = (resource_id.split('/'))[2]
                  monitor_object = MonitorManagementClient(credentials, subscription_id=sub)
                  metrics_data = monitor_object.metrics.list(resource_id)
              
                  for item in metrics_data.value:
                      for timeserie in item.timeseries:
                          for data in timeserie.data:
                              try:
                                  count_used_storage = count_used_storage + data.average
                              except:
                                  pass
              
              print(count_used_storage)
          

          对于约 400 个订阅,约 1100 个 storageaccounts 脚本的工作时间约为 600 秒。

          一次订阅会更快:)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-04-29
            • 2022-11-07
            • 1970-01-01
            • 1970-01-01
            • 2014-08-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多