当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

作者:精品下载站 日期:2024-12-14 20:51:49 浏览:11 分类:玩电脑

如何使用 PowerShell 构建 Azure 详细使用情况报告


在 Azure 中运行工作负载的最重要方面之一是跟踪费用。为此,您可以使用 Azure 详细使用情况报告跟踪资源使用情况。在本文中,你将了解如何创建 PowerShell 脚本来轻松按日期查询所有 Azure 资源的 Azure 资源使用情况和费用。

Azure 中的资源会以多种不同方式不断增加您的账单。尽管您可以通过门户网站查看资源使用情况,但它是有限的。但是,通过使用几个 PowerShell cmdlet,您可以构建一个方便的报告,让您全面了解 Azure 资源的使用情况(从而产生费用)。

本文是根据 TechSnips YouTube 视频创作的。如果您是一个更注重视觉学习的人,请随意观看视频。否则,请继续阅读!

通过 Azure 帐户中心下载报告

您可以从 Azure 帐户中心下载许多不同的使用情况报告。 Azure 帐户中心是一个 Web 门户,可让你查看计费周期历史记录、下载发票以及查看 Azure 订阅的概述。

尽管可以通过 Azure 帐户中心下载 Azure 使用情况报告,但在选择日期范围方面没有灵活性。您无法将使用限制在某个日期范围内,因为日期是固定的以与您的计费周期一致。

您可以在下面看到计费周期的示例以及下载使用情况报告的链接。

这些使用情况报告中包含许多您可能不需要的其他信息。

也许您需要过去 60 天的使用情况报告。要使用 Azure 帐户中心获取此信息,您必须下载至少三个计费周期的使用情况报告,以涵盖所有所需日期。

下载报告后,您必须删除多余的数据。然后你必须找到一种方法来以某种方式整合这些数据。不,谢谢!这开销太大了。

使用 PowerShell,您可以构建可重用的脚本、函数或模块来提取 Azure 资源使用情况报告。反过来,这些可以通过几行命令手动运行,或者作为计划任务来自动执行。

先决条件

这是一篇演练文章。为了继续进行,您需要准备一些东西。

  • Windows 10 或更高版本。
  • Windows Powershell v5.1
  • 脚本编辑器,例如 Notepad++ 或集成脚本环境 (ISE),例如 Windows PowerShell ISE 和 Visual Studio Code。
  • Azure 订阅。
  • Azure PowerShell 模块。截至本文的最新版本是 2.6.0。该模块必须安装在您的机器上。如果您还没有,可以使用 PowerShellGet 安装它
  • 使用 Connect-AzAccount cmdlet 建立与 Azure 的连接

如何获取资源使用数据

在创建脚本之前,我们首先讨论使用 Get-UsageAggregates cmdlet 的基础知识。这是一个 cmdlet,允许您按日期范围、每小时或每天等指标提取 Azure 资源使用情况。 Get-UsageAggregates cmdlet 是主要的 cmdlet,它实现了您将在本文中学习的大部分功能。

为了演示 Get-UsageAggregates cmdlet,假设您需要查找 2019 年 4 月 1 日到 2019 年 9 月 12 日期间的 Azure 资源使用情况。相同的技术可用于任何日期范围。下面您将看到一个片段,用于根据这些日期查找使用数据。

$params = @{
    ReportedStartTime = '04-01-19'
    ReportedEndTime = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails = $true
}
$usageData = Get-UsageAggregates @params
Parameter Value Usage Explanation ReportStartTime 04-01-19 This is the oldest date you want to retrieve.

(Month Day Year)

ReportEndTime 09-12-19 This is the latest date you want to retrieve.

(Month Day Year)

AggregationGranularity Hourly The granularity of data to return. Valid values are “Daily” and “Hourly” ShowDetails $True Indicates whether the instance-level details are expanded

如果有返回的数据,您应该会得到类似于下面的屏幕截图的结果。您可以看到实际使用数据存储在 UsageAggregations 属性中。

在 Get-UsageAggregates 中处理分页

在上面的部分中,命令通常会返回数千个对象,尤其是对于长日期范围。为了防止 API 不堪重负,Get-UsageAggregates 命令最多仅返回 1000 个结果。如果您已按照上一节所述保存了 $usageData 变量,则可以通过运行此命令 $usageData.UsageAggregations.count 来确认它。

如果结果超过 1000 条怎么办?你还需要做更多的工作。

当您举例说明 Get-UsageAggregates 返回的属性时,您会注意到一个名为 ContinuationToken 的属性,如下所示。可以看到这个token是一长串字符。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

ContinuationToken 是指向下一组结果的指针。该属性充当书签,以了解从哪个页面获取下一批结果。

为了进行演示,请使用 $usageData.UsageAggregations[-1] 获取上一个结果中的最后一项,如下所示。请记下使用开始使用结束时间。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

现在再次将相同的参数传递给 Get-UsageAggregates 命令。但这一次,使用 ContinuationToken 参数并使用之前返回的 ContinuationToken 属性的值。您可以在下面看到如何执行此操作的示例。

$params = @{
    ReportedStartTime      = '04-01-19'
    ReportedEndTime        = '09-12-19'
    AggregationGranularity = 'Hourly'
    ShowDetails            = $true
    ContinuationToken      = $usageData.ContinuationToken
}
$usageData = Get-UsageAggregates @params

现在,使用 $usageData.UsageAggregations[-1] 获取 UsageAggregations 属性数组中的最后一项。将其与之前的结果进行比较,以确认新结果有所不同。

比较应该与您在下面看到的类似。请注意,日期范围相隔 7 天。通过使用 ContinuationToken,您检索了第二页结果。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

构建 Azure 资源使用情况报告功能

您应该了解分页的工作原理以及如何使用 ContinuationToken 属性和参数。但是,如果要检索数万甚至数十万个结果怎么办?以这种方式手动使用令牌效果不会很好。

让我们构建一个 PowerShell 来为我们处理这种分页需求,并为我们提供更多的灵活性。该脚本将允许您提供自己的参数并处理分页要求。如果需要的话,它还可以让您灵活地扩展它以执行其他任务。

构建参数

首先构建一些功能脚手架。下面您可以看到一个名为 Get-AzureUsage 的示例函数。该函数具有三个看起来很熟悉的参数。

以前,这些参数是在 Get-UsageAggregates cmdlet 本身上定义的。您现在正在构建一个“包装器”函数,它将向此 cmdlet 传递值。

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )

下表提供了有关所有这些参数的更多信息。

Parameter

使用

FromTime

这是接受 DateTime 值的强制参数。该值表示报告的最早日期。

ToTime

这是接受 DateTime 值的强制参数。该值代表报告的最新日期。

Interval

这是一个非空参数,接受两个可能的值:“每日”“每小时”。默认值为每日。这表示要返回的报告的粒度。

查询资源使用情况

创建函数并定义所有参数后,就可以填写函数的其余部分了。

您可以在下面看到 Get-AzureUsage 函数的其余部分。请务必查看注释,以便更深入地了解代码的用途。

Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    ## Start the do/while loop to automatically handle the continuation token
    do {    
        ## Define all parameters to pass to Get-UsageAggregates
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        ## Only use the ContinuationToken parameter if this is not the first run
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

完成的脚本(复制/粘贴)

将参数和功能代码放在一起后,您将获得一个完整的脚本,如下所示。您现在可以将其复制到您自己的脚本中或直接复制到 PowerShell 控制台中进行测试。

Function Get-AzureUsage {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$FromTime,
 
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [datetime]$ToTime,
 
        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [ValidateSet('Hourly', 'Daily')]
        [string]$Interval = 'Daily'
    )
    
    Write-Verbose -Message "Querying usage data [$($FromTime) - $($ToTime)]..."
    $usageData = $null
    do {    
        $params = @{
            ReportedStartTime      = $FromTime
            ReportedEndTime        = $ToTime
            AggregationGranularity = $Interval
            ShowDetails            = $true
        }
        if ((Get-Variable -Name usageData -ErrorAction Ignore) -and $usageData) {
            Write-Verbose -Message "Querying usage data with continuation token $($usageData.ContinuationToken)..."
            $params.ContinuationToken = $usageData.ContinuationToken
        }
        $usageData = Get-UsageAggregates @params
        $usageData.UsageAggregations | Select-Object -ExpandProperty Properties
    } while ('ContinuationToken' -in $usageData.psobject.properties.name -and $usageData.ContinuationToken)
}

使用我们的函数查询资源使用情况

现在是测试该功能的时候了。将上面的代码粘贴到脚本中,然后点源将其粘贴到当前的 PowerShell 会话中,或者将代码直接复制到 PowerShell 会话中。

提示:如果您使用 PowerShell ISE 或 Visual Studio Code,您可以突出显示要导入的代码并按 F8。否则,将代码复制并粘贴到 PowerShell 会话中会更容易。

现在运行该函数,为 FromTimeToTime 以及您希望查看结果的时间间隔提供值。您可以在下面查看有关如何调用此函数的示例。

$usage = Get-AzureUsage -FromTime '08-12-19' -ToTime '09-12-19' -Interval Hourly -Verbose

运行后,如果您选择使用可选的 Verbose 参数,您将看到一些详细消息。从下面的示例中可以看出,使用情况报告计数为 4,659。您还会注意到该函数运行了 Get-UsageAggregates 函数四次,每次都获取下一页结果。该函数之所以能够做到这一点,是因为它为每次调用使用了正确的 ContinuationToke 值。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

过滤报告

此时,报告包含有关所有可用资源类型的所有使用情况详细信息。但您可以过滤报告以仅显示您想要的资源。为此,您可以扩展该函数以允许此功能,或者将输出通过管道传输到其他 PowerShell cmdlet。

Get-Azure 函数的输出返回所有资源类型,但包括名为 MeterCategory 的属性。此属性定义行代表的资源类型。例如,要仅获取 Azure 虚拟机使用情况报告,您可以使用 Group-Object 将所有对象与 Virtual MachinesMeterCategory 分组在一起代码> cmdlet。

Group-Object cmdlet 将返回输出中存在的行数作为 Count 属性。然后,将输出限制为仅 CountName 属性(MeterCategory 的值),您可以看到所有存在的使用情况报告行数Azure 资源类型。

正如您在下面的屏幕截图中看到的,报告中有 768 个虚拟机条目。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

为了进一步发展这个过滤概念,您还可以利用计算属性来创建更友好的输出,如下所示。

$usage | Where-Object {$_.MeterCategory -eq 'Virtual Machines'} | `
Format-Table UsageStartTime,UsageEndTime,@{n="VM Name";e={(($_.InstanceData | `
ConvertFrom-Json).'Microsoft.Resources'.resourceURI -split "/")[-1]}},Quantity,Unit

当您运行上面的代码片段时,您应该看到与下面类似的输出。

[玩转系统] 如何使用 PowerShell 构建 Azure 详细使用情况报告

扩展报告的想法

使用本文中的代码,您可以通过多种不同的方式扩展刚刚创建的工具的功能。

您可以将输出导出到 CSV 文件,并在 Excel 中操作数据,或者使用 ConvertTo-HTML 或增强型 HTML2 PowerShell 模块创建 HTML 报告。

更进一步,使用 Send-MailMessage cmdlet 向结果添加电子邮件通知。世界是你的牡蛎!

总结

在本文中,你了解了如何从 Azure 检索资源使用情况报告。您还学习了如何构建自定义 PowerShell 函数来自动化该过程并使用该函数来操作输出。

下次当您收到预期的 Azure 账单时,您没有任何借口!自己构建一个 PowerShell 函数,可以随时查询 Azure 资源使用情况,随时关注账单情况。

进一步阅读

  • 如何使用 PowerShell 删除 Microsoft Azure 虚拟机并进行清理

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯