如何从 Azure usage API 获取订阅的 regionInfo?
结论
regionInfo 无法从 Azure Usage API、资源位置或普通的 Subscription API 中可靠获取。它表示购买 Azure Offer 时登记的计费国家/地区,通常使用两位国家/地区代码,例如 US、GB、CN。它不是 eastus、westeurope 这类 Azure Region。
调用旧版 Microsoft.Commerce/RateCard API 时,需要从订阅关联的计费账户中获取这个值。如果账户类型或当前权限不支持通过 Billing API 读取购买国家/地区,只能通过 Azure 门户中的计费资料、账单地址、发票或 Azure 支持渠道确认。不能根据资源所在区域推断。
获取步骤
1. 确认订阅所属的计费账户类型
Azure 的计费模型包括 MCA、EA、MPA 和旧式 Pay-As-You-Go。不同模型提供的 Billing API 并不相同,因此没有一个适用于所有订阅的统一 regionInfo 查询接口。
可以先在 Azure 门户中进入:
Cost Management + Billing
查看订阅关联的 Billing account、Billing profile 或 Enrollment account。
2. 查询 Billing Profile 的账单地址
如果账户支持 Azure Billing API,可以列出 Billing Profile,并查看其 billTo 地址中的国家/地区字段。具体资源路径取决于计费账户类型和使用的 Billing API 版本,应以相应版本的响应结构为准。
请求通常类似:
GET https://management.azure.com/providers/Microsoft.Billing/billingAccounts/{billingAccountName}/billingProfiles/{billingProfileName}?api-version={supported-api-version}
Authorization: Bearer {access-token}
响应中可能包含以下信息:
{
"properties": {
"billTo": {
"country": "US"
}
}
}
在这个示例中,可以将 US 作为 RegionInfo,但需要确认该 Billing Profile 对应目标订阅,并且这个字段确实代表购买 Offer 时登记的计费国家/地区。
如果接口返回 403 Forbidden,通常表示当前身份只有订阅权限,没有计费账户的读取权限。即使拥有订阅的 Owner 权限,也不一定拥有 Billing account 权限。
3. 无法通过 API 获取时,从计费资料确认
对于旧式订阅或没有 Billing API 权限的账户,可以从以下位置核对:
- Azure 门户中的 Billing profile 或账单地址;
- 订阅对应发票上的国家/地区;
- 创建订阅时使用的账户国家/地区;
- EA Enrollment 或合作伙伴提供的计费资料;
- Azure 支持提供的订阅购买区域信息。
如果同一租户中有多个计费账户,不要直接使用租户所在地。需要确认目标订阅实际关联的是哪个计费账户。
Rate Card 请求示例
假设已经确认以下参数:
OfferDurableId = MS-AZR-0003P
Currency = USD
Locale = en-US
RegionInfo = US
请求可以写成:
GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Commerce/RateCard?api-version={api-version}&$filter=OfferDurableId%20eq%20'MS-AZR-0003P'%20and%20Currency%20eq%20'USD'%20and%20Locale%20eq%20'en-US'%20and%20RegionInfo%20eq%20'US'
Authorization: Bearer {access-token}
使用 C# 构造过滤条件时,需要进行 URL 编码:
var filter =
"OfferDurableId eq 'MS-AZR-0003P' " +
"and Currency eq 'USD' " +
"and Locale eq 'en-US' " +
"and RegionInfo eq 'US'";
var url =
$"https://management.azure.com/subscriptions/{subscriptionId}" +
$"/providers/Microsoft.Commerce/RateCard" +
$"?api-version={apiVersion}" +
$"&$filter={Uri.EscapeDataString(filter)}";
注意事项
RegionInfo指购买或计费国家/地区,不是资源部署区域,也不是订阅允许使用的 Azure Geography。- 原请求中的
Currency lt '{Currency}'很可能是笔误。按照 Rate Card 的过滤语义,通常应使用Currency eq '{Currency}'。 - URL 中必须使用普通单引号
',不能使用排版引号’。 OfferDurableId、货币和购买国家/地区必须匹配,否则请求可能失败,或无法返回预期价格。- 普通订阅查询返回的
locationPlacementId与RegionInfo不是同一个值,不能直接代入。 Microsoft.Commerce/RateCard是较旧的计费接口。新系统应优先评估 Azure Retail Prices API、Cost Management API,或与账户类型对应的 Billing API。不过,这些接口的价格范围和授权模型与 Rate Card 并不完全相同。
备注:内容仅供参考。
