PAYATHON 2026

如何从 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 并不完全相同。

备注:内容仅供参考。