检查我的订阅中Azure存储帐户使用的空间

30

如何检查我在每个Azure存储帐户中使用了多少空间(按我的订阅资源组划分)。

我无法通过PowerShell、CLI、门户等方式检查Azure存储帐户中使用的空间。


查看账单将显示您的每日费用,这实际上是最重要的。它可能会揭示其他惊喜,并且您可以按成本对所有资源进行排序。还请注意,新版本2的定价(大多数情况下)比版本1更便宜,因此请确保您使用的是最新版本。 - Simon_Weaver
10个回答

22

Azure存储的大小包括所有4个服务(Blob、Queue、File、Table)的总和。据我所知,目前没有办法计算所有服务的总大小。

但是,您可以使用Azure度量标准在门户上获取Blob存储空间使用情况。请选择监视-->度量

enter image description here

有关在Azure门户中监视存储帐户的更多信息,请参阅此链接

此外,您还可以使用PowerShell获取您的Blob使用情况。有一个很好的脚本可供使用。


4
您的答案只会提供关于 Blob 存储大小的信息。它不包括存储帐户中表格、文件和队列所占用的空间。 - Gaurav Mantri
1
同一部分提供了其他存储类型的容量信息。 - Matt Spradley
1
你们都可以在存储账户本身的级别上完成这个操作。 - Simon_Weaver

14

12

1
对于 Blob,它被称为“文件夹统计信息”。这个例子是针对文件共享的。 - Simon_Weaver
如果我使用这种方法(Azure Storage Explorer),它会显示大约2TiB,但是在使用监视器y Azure portal(https://dev59.com/sVcP5IYBdhLWcg3w6-Kp#66605579)时,在最近4小时内它显示大约6TiB。为什么会有这样的差异?我猜测最后的数量是我要支付的费用。 - tito.icreativos
如果你看到“在过去的4个小时内”,那可能意味着你正在查看带宽而不是磁盘大小?另一个可能性——这只是一个猜测,但也许如果你有很多小文件,每个文件在磁盘上都有一个最小块大小,而较大的大小就是你要付费的。 - Simon_Weaver

5

这是一个我使用的.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);
        }
    }
}

1
太神奇了,我之前不知道我需要这个,直到看到它。谢谢,我会使用它的。 - Spaceman

3

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

$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"
}
}
}

输出


2
您可以前往: 主页 > {存储帐户} > {容器} > 属性 在属性下,您将看到计算大小 容器大小

1

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

  • 在Cloud Shell中添加一个PowerShell文件(查看下面的代码)
  • 使用存储帐户和资源组名称运行PS命令

Output

代码

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


1

The Portal Storage Browser will show you the total data stored

门户存储浏览器将显示您存储的总数据。

  1. 登录 Azure。

  2. 导航到存储帐户。

  3. 单击左侧的存储浏览器。


0
我已经创建了Python脚本来计算所有订阅中使用的存储空间。 但是,这并不快速:
  • 需要通过提供的权限请求所有订阅
  • 请求Azure资源图以接收列表/subscription/resourcegroup/storageaccount
  • 生成包含存储帐户的订阅列表
  • 请求Azure Monitor获取每个/subscription/resourcegroup/storageaccount的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个存储账户的脚本,需要约600秒的时间。

但是对于一个订阅,速度要快得多 :)


0
为了在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中执行,脚本会挂起数小时,有时甚至超时。 - silverbackbg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接