使用预算管理成本

成本控制是最大化云投资价值的关键部分。 以下几种方案中,成本可见性、报告和基于成本的业务流程对于持续的业务操作至关重要。 成本管理 API 提供了一组 API,用于支持每种方案。 这些 API 提供使用情况详细信息,可让你查看更精确的实例级成本。

成本控制中通常会用到预算。 可在 Azure 中限制预算范围。 例如,可根据订阅、资源组或资源集合缩小预算视图。 除了使用预算 API 在达到预算阈值时发送电子邮件通知之外,还可以使用 Azure Monitor 操作组。 操作组会触发一系列协调的操作来响应预算事件。

对于运行非关键工作负荷的客户来说,典型的预算方案是根据预算管理支出,并在审查每月发票时实现可预测的成本。 这种方案需要一些基于成本的资源业务流程,这些资源属于 Azure 环境。 在此方案中,每月的订阅预算设置为 1,000 美元。 另外,通知阈值设置为触发几个业务流程。 此方案的成本阈值开始为 80%,这会停止“可选”资源组中的所有虚拟机 (VM)。 然后,达到 100% 成本阈值时,将停止所有 VM 实例。

若要配置此方案,请使用本教程的每个部分中提供的步骤完成以下操作。

通过本教程中的这些操作,你可以:

  • 创建 Azure 自动化 Runbook,以使用 Webhook 停止 VM。
  • 创建根据预算阈值触发的 Azure 逻辑应用并调用包含正确参数的 runbook。
  • 创建 Azure Monitor 操作组,该操作组配置为在达到预算阈值时触发 Azure 逻辑应用。
  • 创建具有所需阈值的预算,并将其绑定到操作组。

创建 Azure 自动化 Runbook

Azure 自动化是一种服务,可用于编写大部分资源管理任务并按计划或按需运行这些任务。 在此方案中,请创建会停止 VM 的 Azure 自动化 Runbook。 请使用 Azure 自动化库中的停止 Azure V2 VM 图形 Runbook 来构建此方案。 通过将此 Runbook 导入 Azure 帐户并发布,可以在达到预算阈值时停止 VM。

注意

可以在 Azure 成本管理中创建预算,并将其链接到 Azure 自动化 Runbook,以在达到指定的阈值时自动停止资源。

创建 Azure 自动化帐户

  1. 使用 Azure 帐户凭据登录到 Azure 门户
  2. 选择 Azure 左上角的“创建资源”按钮 。
  3. 选择“管理工具”>“自动化” 。

    注意

    如果你没有 Azure 帐户,可以创建一个试用帐户

  4. 输入帐户信息。 对于创建 Azure 运行方式帐户,请选择,以便自动启用可简化向 Azure 进行身份验证所需的设置。
  5. 完成后,请选择“创建”以启动自动化帐户部署 。

导入“停止 Azure V2 VM”runbook

使用 Azure 自动化 runbook,从库中导入停止 Azure V2 VM 图形 runbook。

  1. 使用 Azure 帐户凭据登录到 Azure 门户
  2. 选择“所有服务”>“自动化帐户”,以打开自动化帐户 。 然后,选择“自动化帐户”。
  3. 在“流程自动化”部分选择“Runbook 库” 。
  4. 将“库源”设置为“脚本中心”,然后选择“确定” 。
  5. 在 Azure 门户中找到并选择停止 Azure V2 VM 库项。
  6. 选择“导入”以显示“导入”区域,然后选择“确定” 。 此时会显示 Runbook 概述区域。
  7. Runbook 完成导入过程后,选择“编辑”以显示图形 runbook 编辑器和发布选项
    显示“编辑图形 Runbook”的屏幕截图。
  8. 选择“发布”以发布该 Runbook,并在出现提示时选择“是” 。 发布 runbook 时,可以用草稿版本替代任何现有的已发布版本。 在本例中,还没有已发布版本,因为才创建了 runbook。 有关发布 runbook 的详细信息,请参阅创建图形 runbook

为 runbook 创建 Webhook

使用停止 Azure V2 VM 图形 Runbook 创建两个 Webhook,以便通过单个 HTTP 请求在 Azure 自动化中启动 Runbook。 第一个 Webhook 会在达到 80% 预算阈值时调用 Runbook,并将资源组名称作为参数,允许停止可选的 VM。 然后,第二个 Webhook 会(在达到 100% 预算阈值时)调用不带任何参数的 Runbook,以停止所有剩余的 VM 实例。

  1. Azure 门户的“Runbook”页中,选择“StopAzureV2Vm”Runbook 以显示该 Runbook 的概览区域。
  2. 选择页面顶部的“Webhook”,打开“添加 Webhook”区域 。
  3. 选择“创建新的 Webhook”,打开“创建新的 Webhook”区域 。
  4. 将 Webhook 的“名称”设置为“Optional” 。 “启用”属性必须为“是” 。 无需更改“过期时间”值 。 有关 Webhook 属性的详细信息,请参阅 Webhook 属性
  5. 选择 URL 值旁边的复制图标以复制 Webhook 的 URL。

    重要

    将名为“Optional”的 Webhook 的 URL 保存在安全的位置 。 本教程稍后会用到该 URL。 出于安全原因,创建 Webhook 后,就不能再次查看或检索该 URL。

  6. 选择“确定”以创建新的 Webhook 。
  7. 选择“配置参数并运行设置”以查看该 Runbook 的参数值 。

    注意

    如果 Runbook 包含必需的参数,除非提供了相应的值,否则无法创建 Webhook。

  8. 选择“确定”,接受 Webhook 参数值 。
  9. 选择“创建” ,创建 Webhook。
  10. 接下来,请按上述步骤创建名为“Complete”的第二个 Webhook

    重要

    请务必保存这两个 Webhook URL,供本教程后面部分使用。 出于安全原因,创建 Webhook 后,就不能再次查看或检索该 URL。

现在你应有两个已配置的 Webhook,它们都可以使用保存的 URL。

显示 Webhook 的屏幕截图。

现已完成 Azure 自动化设置。 可以使用简单的 API 测试来测试 Webhook,验证 Webhook 是否正常工作。 查询 API 的一些常用方法是:

接下来,必须为业务流程创建逻辑应用。

为业务流程创建 Azure 逻辑应用

逻辑应用有助于生成、计划和自动完成工作流形式的流程,适合跨企业或组织集成应用、数据、系统和服务。 在此方案中,所创建的逻辑应用只会调用创建的自动化 Webhook。

可将“预算”设置为在达到指定的阈值时触发通知。 可提供触发通知的多个阈值,逻辑应用会为你演示基于达到的阈值执行不同操作的能力。 本示例将设置一个方案,其中你会收到两个通知。 达到预算的 80% 时会收到第一个通知。 达到预算的 100% 时会收到第二个通知。 逻辑应用用于关闭资源组中的所有 VM。 首先达到“Optional”阈值的 80%,然后达到第二个阈值,此时会关闭订阅中的所有 VM

可通过逻辑应用为 HTTP 触发器提供示例架构,但需要设置 Content-Type 标头 。 由于操作组没有 Webhook 的自定义标头,因此必须在单独的步骤中分析有效负载。 请使用“分析”操作并为其提供有效负载示例

创建逻辑应用

逻辑应用执行几项操作。 下表提供了逻辑应用执行的一组高级操作:

  • 在收到 HTTP 请求时识别
  • 分析传入的 JSON 数据,确定达到的阈值
  • 使用条件语句检查阈值金额是否已达到预算范围的 80% 或更多,但不能大于或等于 100%。
    • 如果达到此阈值金额,则使用名为“Optional”的 Webhook 发送 HTTP POST。 此操作会关闭“Optional”组中的 VM。
  • 使用条件语句检查阈值金额是否已达到或超过预算值的 100%。
    • 如果已达到此阈值金额,则使用名为“Complete”的 Webhook 发送 HTTP POST。 此操作关闭剩下的所有 VM。

创建执行上述步骤的逻辑应用时需要以下步骤:

  1. Azure 门户中,选择“创建资源”>“集成”>“逻辑应用” 。
    显示“选择逻辑应用资源”的屏幕截图。
  2. 在“创建逻辑应用”区域中,提供创建逻辑应用所需的详细信息,选择“固定到仪表板”,然后选择“创建” 。
    显示“创建逻辑应用”的屏幕截图。

当 Azure 部署逻辑应用后,“逻辑应用设计器”会打开并显示一个包含简介视频和常用触发器的区域 。

添加触发器

每个逻辑应用都必须从触发器开始,该触发器在发生特定事件或特定条件得到满足的情况下触发。 每当触发器触发时,逻辑应用引擎就会创建一个逻辑应用实例来启动并运行工作流。 操作是在触发器之后发生的所有步骤。

  1. 在“逻辑应用设计器”区域的“模板”下,选择“空白逻辑应用” 。
  2. 添加触发器,具体方法是在“逻辑应用设计器”搜索框中输入“http request”,查找并选择名为“请求 - 收到 HTTP 请求时”的触发器 。
    显示“收到 HTTP 请求时”触发器的屏幕截图。
  3. 选择新建步骤>添加操作
    显示“新建步骤 - 添加操作”的屏幕截图。
  4. 在“逻辑应用设计器”搜索框中搜索“分析 JSON”,查找并选择“数据操作 - 分析 JSON”操作
    显示数据操作 - 分析 JSON 的屏幕截图。
  5. 输入“Payload”作为 Parse JSON 有效负载的 Content 名称,或使用动态内容中的“Body”标记。
  6. 在“分析 JSON”框中,选择“使用有效负载示例生成架构”选项 。
    显示“使用示例 JSON 数据生成架构有效负载”的屏幕截图。
  7. 将以下 JSON 有效负载示例粘贴到文本框中:{"schemaId":"AIP Budget Notification","data":{"SubscriptionName":"CCM - Azure Enterprise - 1","SubscriptionId":"<GUID>","SpendingAmount":"100","BudgetStartDate":"6/1/2018","Budget":"50","Unit":"USD","BudgetCreator":"email@contoso.com","BudgetName":"BudgetName","BudgetType":"Cost","ResourceGroup":"","NotificationThresholdAmount":"0.8"}} 文本框显示为:
    显示示例 JSON 有效负载的屏幕截图。
  8. 选择“完成” 。

添加第一个条件操作

使用条件语句检查阈值金额是否已达到预算范围的 80% 或更多,但不能大于或等于 100%。 如果达到此阈值金额,则使用名为“Optional”的 Webhook 发送 HTTP POST。 此操作会关闭“Optional”组中的 VM。

  1. 选择“新建步骤”>“添加条件” 。
    显示“添加条件”的屏幕截图。

  2. 在“条件”框中,选择包含 Choose a value 的文本框以显示可用值的列表 。
    显示“选择值条件”的屏幕截图。

  3. 选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:float()
    显示 Float 表达式的屏幕截图。

  4. 选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。 表达式为:
    float(body('Parse_JSON')?['data']?['NotificationThresholdAmount'])

  5. 选择“确定”,以设置表达式 。

  6. 在“条件”下拉框中选择“大于或等于” 。

  7. 在条件的“选择值”框中,输入 .8
    屏幕截图显示已选择值的“条件”对话框。

  8. 选择“条件”框中的“添加”>“添加行”,以添加条件的其他部分

  9. 在“条件”框中,选择包含 Choose a value 的文本框 。

  10. 选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:float()

  11. 选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。

  12. 选择“确定”,以设置表达式 。

  13. 在“条件”的下拉框中选择“小于” 。

  14. 在条件的“选择值”框中,输入 1
    屏幕截图显示带有两个条件的“条件”对话框。

  15. 在“如果为 true”框中,选择“添加操作” 。 请添加一个关闭可选 VM 的 HTTP POST 操作。
    显示“添加操作”的屏幕截图。

  16. 输入“HTTP”以搜索 HTTP 操作,然后选择“HTTP - HTTP”操作 。
    显示“添加 HTTP”操作的屏幕截图。

  17. 选择“Post”作为“方法”值 。

  18. 对于之前在本教程中创建的名为“Optional”的 Webhook,请输入其 URL 作为 URI 值 。
    显示 HTTP 操作 URI 的屏幕截图。

  19. 在“如果为 true”框中,选择“添加操作” 。 请添加一个电子邮件操作,该操作发送一封电子邮件,通知收件人已关闭可选 VM。

  20. 搜索“发送电子邮件”,然后根据所用的电子邮件服务选择“发送电子邮件”操作 。
    显示“发送电子邮件”操作的屏幕截图。

    对于个人 Microsoft 帐户,请选择“Outlook.com”。 对于 Azure 工作或学校帐户,请选择“Office 365 Outlook”。 如果还没有连接,系统会要求你登录到电子邮件帐户。 逻辑应用创建到电子邮件帐户的连接。 需要允许逻辑应用访问电子邮件信息。
    显示访问通知的屏幕截图。

  21. 为用来通知收件人已关闭可选 VM 的电子邮件添加“收件人”、“主题”、“正文”文本。 使用 BudgetName 和 NotificationThresholdAmount 动态内容填充主题和正文字段 。 显示电子邮件详细信息的屏幕截图。

添加第二个条件操作

使用条件语句检查阈值金额是否已达到或超过预算值的 100%。 如果已达到此阈值金额,则使用名为“Complete”的 Webhook 发送 HTTP POST。 此操作关闭剩下的所有 VM。

  1. 选择“新建步骤”>“添加条件” 。
    屏幕截图显示已调出“添加操作”的“如果为 true”对话框。
  2. 在“条件”框中,选择包含 Choose a value 的文本框以显示可用值的列表 。
  3. 选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:float()
  4. 选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。 表达式类似于:
    float(body('Parse_JSON')?['data']?['NotificationThresholdAmount'])
  5. 选择“确定”,以设置表达式 。
  6. 在“条件”下拉框中选择“大于或等于” 。
  7. 在条件的“选择值”框中,输入 1
    显示“设置条件值”的屏幕截图。
  8. 在“如果为 true”框中,选择“添加操作” 。 请添加一个关闭所有剩余 VM 的 HTTP POST 操作。
    屏幕截图显示了“如果为 true”对话框,你可在此处添加 HTTP POST 操作。
  9. 输入“HTTP”以搜索 HTTP 操作,然后选择“HTTP - HTTP”操作 。
  10. 选择“Post”作为“方法”值 。
  11. 对于之前在本教程中创建的名为“Complete”的 Webhook,请输入其 URL 作为 Uri 值 。
    屏幕截图显示了 HTTP 对话框,你可在此处输入 URL 值。
  12. 在“如果为 true”框中,选择“添加操作” 。 请添加一个电子邮件操作,该操作发送一封电子邮件,通知收件人已关闭剩余 VM。
  13. 搜索“发送电子邮件”,然后根据所用的电子邮件服务选择“发送电子邮件”操作 。
  14. 为用来通知收件人已关闭可选 VM 的电子邮件添加“收件人”、“主题”、“正文”文本。 使用 BudgetName 和 NotificationThresholdAmount 动态内容填充主题和正文字段 。
    显示你配置的电子邮件详细信息的屏幕截图。
  15. 选择“逻辑应用设计器”区域顶部的“保存” 。

逻辑应用摘要

完成后,逻辑应用如以下示例所示。 在最基本的方案(无需任何基于阈值的业务流程)中,可直接从 Monitor 调用自动化脚本,并跳过“逻辑应用”步骤 。

显示逻辑应用 - 完整视图的屏幕截图。

保存逻辑应用后,生成了可供调用的 URL。 请在本教程的下一部分使用此 URL。

创建 Azure Monitor 操作组

操作组是用户定义的通知首选项的集合。 触发警报时,会向特定操作发出通知,让其接收警报。 Azure 警报会根据特定条件主动发出通知,并提供执行操作的机会。 警报可使用来自多个源(包括指标和日志)的数据。

操作组是可与预算集成的唯一终结点。 可在多个通道中设置通知,但在本方案中,请重点关注之前在本教程中创建的逻辑应用。

在 Azure Monitor 中创建操作组

创建操作组时,请指向之前在本教程中创建的逻辑应用。

  1. 如果尚未登录 Azure 门户,请登录并选择“所有服务”>“Monitor”
  2. 选择“警报” ,然后选择“管理操作” 。
  3. 从“操作组”区域中选择“添加操作组” 。
  4. 添加并验证以下项:
    • 操作组名称
    • 短名称
    • 订阅
    • 资源组
      显示“添加操作组”的屏幕截图。
  5. 在“添加操作组”窗格中,添加 LogicApp 操作 。 对“Budget-BudgetLA”操作进行命名 。 在“逻辑应用”窗格中,选择“订阅”和“资源组” 。 然后,选择之前在本教程中创建的“逻辑应用” 。
  6. 选择“确定”以设置逻辑应用 。 然后,“添加操作组”窗格中选择“确定”,以创建操作组 。

现已完成有效安排预算所需的所有支持组件。 现在需要做的是创建预算,并将其配置为使用创建的操作组。

创建预算

可以使用成本管理中的预算功能在 Azure 门户中创建预算。 也可以使用 REST API、PowerShell cmdlet 或 CLI 创建预算。 以下过程使用 REST API。 在调用 REST API 之前,需要一个授权令牌。 若要创建授权令牌,可使用 ARMClient 项目。 通过 ARMClient,可向 Azure 资源管理器进行身份验证,并获取令牌来调用 API 。

创建身份验证令牌

  1. 导航到 GitHub 上的 ARMClient 项目。

  2. 克隆存储库以获取本地副本。

  3. 在 Visual Studio 中打开该项目并生成它。

  4. 成功生成后,可执行文件应位于 \bin\debug 文件夹中 。

  5. 运行 ARMClient。 打开命令提示符并从项目根目录导航到 \bin\debug文件夹 。

  6. 若要登录并进行身份验证,请在命令提示符处输入以下命令:
    ARMClient login prod

  7. 从输出中复制“订阅 GUID” 。

  8. 若要将授权令牌复制到剪贴板,请在命令提示符处输入以下命令,不过请务必使用上述步骤中复制的订阅 ID:
    ARMClient token <subscription GUID from previous step>

    完成上述步骤后,会看到:
    令牌已成功复制到剪贴板。

  9. 保存令牌以供本教程下一部分中的步骤使用。

创建预算

接下来,通过调用 Azure 使用情况 REST API 来创建预算。 需要通过一种方法与 API 交互。 查询 API 的一些常用方法是:

需要将环境和集合文件导入 API 客户端。 集合包含调用 Azure Consumption REST API 的 HTTP 请求的分组定义。 环境文件包含集合使用的变量。

  1. 在 API 客户端中,创建新的请求。

  2. 保存新请求,使其没有任何内容。

  3. 将请求从 Get 更改为 Put 操作。

  4. {subscriptionId} 替换为在本教程上一节中使用的“订阅 ID”,以此修改以下 URL 。 另外,请修改 URL,以将“SampleBudget”添加为 {budgetName} 的值:https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Consumption/budgets/{budgetName}?api-version=2018-03-31

  5. 在 API 客户端中选择标头。

  6. 添加名为“授权”的新密钥 。

  7. 将值设置为使用最后一节末尾的 ArmClient 创建的令牌 。

  8. 在 API 客户端中选择“正文”。

  9. 在 API 客户端中选择原始选项。

  10. 在 API 客户端的文本区域中,粘贴以下示例预算定义。 必须将 subscriptionIDresourcegroupnameactiongroupname 参数替换为你的订阅 ID、资源组的唯一名称,以及在 URL 和请求正文中创建的操作组名称:

        {
            "properties": {
                "category": "Cost",
                "amount": 100.00,
                "timeGrain": "Monthly",
                "timePeriod": {
                "startDate": "2018-06-01T00:00:00Z",
                "endDate": "2018-10-31T00:00:00Z"
                },
                "filters": {},
            "notifications": {
                "Actual_GreaterThan_80_Percent": {
                    "enabled": true,
                    "operator": "GreaterThan",
                    "threshold": 80,
                    "contactEmails": [],
                    "contactRoles": [],
                    "contactGroups": [
                        "/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/microsoft.insights/actionGroups/{actiongroupname}"
                    ]
                },
               "Actual_EqualTo_100_Percent": {
                       "operator": "EqualTo",
                       "threshold": 100,
                       "contactGroups": [
                           "/subscriptions/{subscriptionid}/resourceGroups/{resourcegroupname}/providers/microsoft.insights/actionGroups/{actiongroupname}"
                       ]
                   }
               }
            }
        }
    
  11. 发送请求。

现在你已经拥有调用预算 API 所需的所有信息。 预算 API 引用包含关于特定请求的更多详细信息,其中包括:

  • budgetName - 支持多个预算。 预算名称必须是唯一的。
  • 类别 - 必须是“成本”或“使用情况” 。 API 支持成本和使用情况预算。
  • timeGrain - 每月、每季度或每年的预算。 周期结束时重置金额。
  • 筛选器 - 可通过筛选器将预算缩小到所选范围内一组特定资源。 例如,筛选器可能是订阅级别预算的资源组集合。
  • 通知 - 确定通知详细信息和阈值。 可设置多个阈值并提供电子邮件地址或操作组以接收通知。

总结

本教程介绍了以下内容:

  • 如何创建 Azure 自动化 Runbook 以停止 VM。
  • 如何创建将根据预算阈值触发的 Azure 逻辑应用并调用包含正确参数的相关 runbook。
  • 如何创建 Azure Monitor 操作组并将其配置为在达到预算阈值时触发 Azure 逻辑应用。
  • 如何创建具有所需阈值的预算,并将其绑定到操作组。

现在你已为订阅提供一个功能齐全的预算,它会在达到配置的预算阈值时关闭 VM。

后续步骤