使用预算管理成本
成本控制是最大化云投资价值的关键部分。 以下几种方案中,成本可见性、报告和基于成本的业务流程对于持续的业务操作至关重要。 成本管理 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 帐户凭据登录到 Azure 门户。
- 选择 Azure 左上角的“创建资源”按钮 。
- 选择“管理工具”>“自动化” 。
注意
如果你没有 Azure 帐户,可以创建一个试用帐户。
- 输入帐户信息。 对于创建 Azure 运行方式帐户,请选择是,以便自动启用可简化向 Azure 进行身份验证所需的设置。
- 完成后,请选择“创建”以启动自动化帐户部署 。
导入“停止 Azure V2 VM”runbook
使用 Azure 自动化 runbook,从库中导入停止 Azure V2 VM 图形 runbook。
- 使用 Azure 帐户凭据登录到 Azure 门户。
- 选择“所有服务”>“自动化帐户”,以打开自动化帐户 。 然后,选择“自动化帐户”。
- 在“流程自动化”部分选择“Runbook 库” 。
- 将“库源”设置为“脚本中心”,然后选择“确定” 。
- 在 Azure 门户中找到并选择停止 Azure V2 VM 库项。
- 选择“导入”以显示“导入”区域,然后选择“确定” 。 此时会显示 Runbook 概述区域。
- Runbook 完成导入过程后,选择“编辑”以显示图形 runbook 编辑器和发布选项。
- 选择“发布”以发布该 Runbook,并在出现提示时选择“是” 。 发布 runbook 时,可以用草稿版本替代任何现有的已发布版本。 在本例中,还没有已发布版本,因为才创建了 runbook。 有关发布 runbook 的详细信息,请参阅创建图形 runbook。
为 runbook 创建 Webhook
使用停止 Azure V2 VM 图形 Runbook 创建两个 Webhook,以便通过单个 HTTP 请求在 Azure 自动化中启动 Runbook。 第一个 Webhook 会在达到 80% 预算阈值时调用 Runbook,并将资源组名称作为参数,允许停止可选的 VM。 然后,第二个 Webhook 会(在达到 100% 预算阈值时)调用不带任何参数的 Runbook,以停止所有剩余的 VM 实例。
- 在 Azure 门户的“Runbook”页中,选择“StopAzureV2Vm”Runbook 以显示该 Runbook 的概览区域。
- 选择页面顶部的“Webhook”,打开“添加 Webhook”区域 。
- 选择“创建新的 Webhook”,打开“创建新的 Webhook”区域 。
- 将 Webhook 的“名称”设置为“Optional” 。 “启用”属性必须为“是” 。 无需更改“过期时间”值 。 有关 Webhook 属性的详细信息,请参阅 Webhook 属性。
- 选择 URL 值旁边的复制图标以复制 Webhook 的 URL。
重要
将名为“Optional”的 Webhook 的 URL 保存在安全的位置 。 本教程稍后会用到该 URL。 出于安全原因,创建 Webhook 后,就不能再次查看或检索该 URL。
- 选择“确定”以创建新的 Webhook 。
- 选择“配置参数并运行设置”以查看该 Runbook 的参数值 。
注意
如果 Runbook 包含必需的参数,除非提供了相应的值,否则无法创建 Webhook。
- 选择“确定”,接受 Webhook 参数值 。
- 选择“创建” ,创建 Webhook。
- 接下来,请按上述步骤创建名为“Complete”的第二个 Webhook。
重要
请务必保存这两个 Webhook URL,供本教程后面部分使用。 出于安全原因,创建 Webhook 后,就不能再次查看或检索该 URL。
现在你应有两个已配置的 Webhook,它们都可以使用保存的 URL。
现已完成 Azure 自动化设置。 可以使用简单的 API 测试来测试 Webhook,验证 Webhook 是否正常工作。 查询 API 的一些常用方法是:
- Visual Studio
- Insomnia
- Bruno
- PowerShell 的 Invoke-RestMethod
- Curl
接下来,必须为业务流程创建逻辑应用。
为业务流程创建 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。
创建执行上述步骤的逻辑应用时需要以下步骤:
- 在 Azure 门户中,选择“创建资源”>“集成”>“逻辑应用” 。
- 在“创建逻辑应用”区域中,提供创建逻辑应用所需的详细信息,选择“固定到仪表板”,然后选择“创建” 。
当 Azure 部署逻辑应用后,“逻辑应用设计器”会打开并显示一个包含简介视频和常用触发器的区域 。
添加触发器
每个逻辑应用都必须从触发器开始,该触发器在发生特定事件或特定条件得到满足的情况下触发。 每当触发器触发时,逻辑应用引擎就会创建一个逻辑应用实例来启动并运行工作流。 操作是在触发器之后发生的所有步骤。
- 在“逻辑应用设计器”区域的“模板”下,选择“空白逻辑应用” 。
- 添加触发器,具体方法是在“逻辑应用设计器”搜索框中输入“http request”,查找并选择名为“请求 - 收到 HTTP 请求时”的触发器 。
- 选择新建步骤>添加操作。
- 在“逻辑应用设计器”搜索框中搜索“分析 JSON”,查找并选择“数据操作 - 分析 JSON”操作。
- 输入“Payload”作为 Parse JSON 有效负载的 Content 名称,或使用动态内容中的“Body”标记。
- 在“分析 JSON”框中,选择“使用有效负载示例生成架构”选项 。
- 将以下 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"}}
文本框显示为:
- 选择“完成” 。
添加第一个条件操作
使用条件语句检查阈值金额是否已达到预算范围的 80% 或更多,但不能大于或等于 100%。 如果达到此阈值金额,则使用名为“Optional”的 Webhook 发送 HTTP POST。 此操作会关闭“Optional”组中的 VM。
选择“新建步骤”>“添加条件” 。
在“条件”框中,选择包含
Choose a value
的文本框以显示可用值的列表 。
选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:
float()
选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。 表达式为:
float(body('Parse_JSON')?['data']?['NotificationThresholdAmount'])
选择“确定”,以设置表达式 。
在“条件”下拉框中选择“大于或等于” 。
在条件的“选择值”框中,输入
.8
。
选择“条件”框中的“添加”>“添加行”,以添加条件的其他部分。
在“条件”框中,选择包含
Choose a value
的文本框 。选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:
float()
选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。
选择“确定”,以设置表达式 。
在“条件”的下拉框中选择“小于” 。
在条件的“选择值”框中,输入
1
。
在“如果为 true”框中,选择“添加操作” 。 请添加一个关闭可选 VM 的 HTTP POST 操作。
输入“HTTP”以搜索 HTTP 操作,然后选择“HTTP - HTTP”操作 。
选择“Post”作为“方法”值 。
对于之前在本教程中创建的名为“Optional”的 Webhook,请输入其 URL 作为 URI 值 。
在“如果为 true”框中,选择“添加操作” 。 请添加一个电子邮件操作,该操作发送一封电子邮件,通知收件人已关闭可选 VM。
搜索“发送电子邮件”,然后根据所用的电子邮件服务选择“发送电子邮件”操作 。
对于个人 Microsoft 帐户,请选择“Outlook.com”。 对于 Azure 工作或学校帐户,请选择“Office 365 Outlook”。 如果还没有连接,系统会要求你登录到电子邮件帐户。 逻辑应用创建到电子邮件帐户的连接。 需要允许逻辑应用访问电子邮件信息。
为用来通知收件人已关闭可选 VM 的电子邮件添加“收件人”、“主题”、“正文”文本。 使用 BudgetName 和 NotificationThresholdAmount 动态内容填充主题和正文字段 。
添加第二个条件操作
使用条件语句检查阈值金额是否已达到或超过预算值的 100%。 如果已达到此阈值金额,则使用名为“Complete”的 Webhook 发送 HTTP POST。 此操作关闭剩下的所有 VM。
- 选择“新建步骤”>“添加条件” 。
- 在“条件”框中,选择包含
Choose a value
的文本框以显示可用值的列表 。 - 选择列表顶部的“表达式”并在表达式编辑器中输入以下表达式:
float()
- 选择“动态内容”,将光标置于括号 () 内,然后从列表中选择“NotificationThresholdAmount”以填充整个表达式 。
表达式类似于:
float(body('Parse_JSON')?['data']?['NotificationThresholdAmount'])
- 选择“确定”,以设置表达式 。
- 在“条件”下拉框中选择“大于或等于” 。
- 在条件的“选择值”框中,输入
1
。
- 在“如果为 true”框中,选择“添加操作” 。 请添加一个关闭所有剩余 VM 的 HTTP POST 操作。
- 输入“HTTP”以搜索 HTTP 操作,然后选择“HTTP - HTTP”操作 。
- 选择“Post”作为“方法”值 。
- 对于之前在本教程中创建的名为“Complete”的 Webhook,请输入其 URL 作为 Uri 值 。
- 在“如果为 true”框中,选择“添加操作” 。 请添加一个电子邮件操作,该操作发送一封电子邮件,通知收件人已关闭剩余 VM。
- 搜索“发送电子邮件”,然后根据所用的电子邮件服务选择“发送电子邮件”操作 。
- 为用来通知收件人已关闭可选 VM 的电子邮件添加“收件人”、“主题”、“正文”文本。 使用 BudgetName 和 NotificationThresholdAmount 动态内容填充主题和正文字段 。
- 选择“逻辑应用设计器”区域顶部的“保存” 。
逻辑应用摘要
完成后,逻辑应用如以下示例所示。 在最基本的方案(无需任何基于阈值的业务流程)中,可直接从 Monitor 调用自动化脚本,并跳过“逻辑应用”步骤 。
保存逻辑应用后,生成了可供调用的 URL。 请在本教程的下一部分使用此 URL。
创建 Azure Monitor 操作组
操作组是用户定义的通知首选项的集合。 触发警报时,会向特定操作发出通知,让其接收警报。 Azure 警报会根据特定条件主动发出通知,并提供执行操作的机会。 警报可使用来自多个源(包括指标和日志)的数据。
操作组是可与预算集成的唯一终结点。 可在多个通道中设置通知,但在本方案中,请重点关注之前在本教程中创建的逻辑应用。
在 Azure Monitor 中创建操作组
创建操作组时,请指向之前在本教程中创建的逻辑应用。
- 如果尚未登录 Azure 门户,请登录并选择“所有服务”>“Monitor”。
- 选择“警报” ,然后选择“管理操作” 。
- 从“操作组”区域中选择“添加操作组” 。
- 添加并验证以下项:
- 操作组名称
- 短名称
- 订阅
- 资源组
- 在“添加操作组”窗格中,添加 LogicApp 操作 。 对“Budget-BudgetLA”操作进行命名 。 在“逻辑应用”窗格中,选择“订阅”和“资源组” 。 然后,选择之前在本教程中创建的“逻辑应用” 。
- 选择“确定”以设置逻辑应用 。 然后,“添加操作组”窗格中选择“确定”,以创建操作组 。
现已完成有效安排预算所需的所有支持组件。 现在需要做的是创建预算,并将其配置为使用创建的操作组。
创建预算
可以使用成本管理中的预算功能在 Azure 门户中创建预算。 也可以使用 REST API、PowerShell cmdlet 或 CLI 创建预算。 以下过程使用 REST API。 在调用 REST API 之前,需要一个授权令牌。 若要创建授权令牌,可使用 ARMClient 项目。 通过 ARMClient,可向 Azure 资源管理器进行身份验证,并获取令牌来调用 API 。
创建身份验证令牌
导航到 GitHub 上的 ARMClient 项目。
克隆存储库以获取本地副本。
在 Visual Studio 中打开该项目并生成它。
成功生成后,可执行文件应位于 \bin\debug 文件夹中 。
运行 ARMClient。 打开命令提示符并从项目根目录导航到 \bin\debug文件夹 。
若要登录并进行身份验证,请在命令提示符处输入以下命令:
ARMClient login prod
从输出中复制“订阅 GUID” 。
若要将授权令牌复制到剪贴板,请在命令提示符处输入以下命令,不过请务必使用上述步骤中复制的订阅 ID:
ARMClient token <subscription GUID from previous step>
完成上述步骤后,会看到:
令牌已成功复制到剪贴板。保存令牌以供本教程下一部分中的步骤使用。
创建预算
接下来,通过调用 Azure 使用情况 REST API 来创建预算。 需要通过一种方法与 API 交互。 查询 API 的一些常用方法是:
- Visual Studio
- Insomnia
- Bruno
- PowerShell 的 Invoke-RestMethod
- Curl
需要将环境和集合文件导入 API 客户端。 集合包含调用 Azure Consumption REST API 的 HTTP 请求的分组定义。 环境文件包含集合使用的变量。
在 API 客户端中,创建新的请求。
保存新请求,使其没有任何内容。
将请求从
Get
更改为Put
操作。将
{subscriptionId}
替换为在本教程上一节中使用的“订阅 ID”,以此修改以下 URL 。 另外,请修改 URL,以将“SampleBudget”添加为{budgetName}
的值:https://management.chinacloudapi.cn/subscriptions/{subscriptionId}/providers/Microsoft.Consumption/budgets/{budgetName}?api-version=2018-03-31
在 API 客户端中选择标头。
添加名为“授权”的新密钥 。
将值设置为使用最后一节末尾的 ArmClient 创建的令牌 。
在 API 客户端中选择“正文”。
在 API 客户端中选择原始选项。
在 API 客户端的文本区域中,粘贴以下示例预算定义。 必须将
subscriptionID
、resourcegroupname
和actiongroupname
参数替换为你的订阅 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}" ] } } } }
发送请求。
现在你已经拥有调用预算 API 所需的所有信息。 预算 API 引用包含关于特定请求的更多详细信息,其中包括:
- budgetName - 支持多个预算。 预算名称必须是唯一的。
- 类别 - 必须是“成本”或“使用情况” 。 API 支持成本和使用情况预算。
- timeGrain - 每月、每季度或每年的预算。 周期结束时重置金额。
- 筛选器 - 可通过筛选器将预算缩小到所选范围内一组特定资源。 例如,筛选器可能是订阅级别预算的资源组集合。
- 通知 - 确定通知详细信息和阈值。 可设置多个阈值并提供电子邮件地址或操作组以接收通知。
总结
本教程介绍了以下内容:
- 如何创建 Azure 自动化 Runbook 以停止 VM。
- 如何创建将根据预算阈值触发的 Azure 逻辑应用并调用包含正确参数的相关 runbook。
- 如何创建 Azure Monitor 操作组并将其配置为在达到预算阈值时触发 Azure 逻辑应用。
- 如何创建具有所需阈值的预算,并将其绑定到操作组。
现在你已为订阅提供一个功能齐全的预算,它会在达到配置的预算阈值时关闭 VM。
后续步骤
- 有关 Azure 计费方案的详细信息,请参阅计费和成本管理自动化方案。