PAYATHON 2026

Azure Government 云环境 EA 订阅是否支持 Azure usage 和 rate card APIs?

支付小周

结论

SubscriptionNotFound 通常不是由 EA 订阅类型引起的,而是因为请求发到了公共 Azure 的 Resource Manager 端点:

https://management.azure.com/

Azure Government 云环境ernment 订阅位于独立的 Azure Government 云环境中,应使用以下端点:

https://management.usgovcloudapi.net/

Azure Government 支持查询订阅用量,但接口能否使用,还取决于该 API 是否已在这一云环境开放、调用者是否具备相应权限,以及接口是否仍在有效生命周期内。

还要注意,Microsoft.Commerce/RateCard 返回的是报价目录费率,不是客户与微软协商后的 EA 实际价格。要获取 EA 合同价格或账单金额,应优先使用 EA billing、Price Sheet 或 Cost Management 相关接口。

为什么会返回 SubscriptionNotFound

Azure 公有云与 Azure Government 相互隔离,分别使用独立的:

  • Resource Manager 地址
  • Microsoft Entra ID 登录环境
  • 令牌受众
  • 订阅目录
  • 服务和 API 可用范围

如果把 Azure Government 的 subscription ID 发送到 management.azure.com,公共云的 Resource Manager 无法在自己的订阅目录中找到它,因此会返回:

{
  "error": {
    "code": "SubscriptionNotFound",
    "message": "The subscription '[subscription id here]' could not be found."
  }
}

即使 subscription ID、offer ID 和筛选条件都没有问题,只要使用了错误的云环境端点,仍会出现这个错误。

正确的 RateCard 请求

应将原请求改为使用 Azure Government Resource Manager 端点:

GET https://management.usgovcloudapi.net/subscriptions/{subscriptionId}/providers/Microsoft.Commerce/RateCard?api-version=2015-06-01-preview&$filter=OfferDurableId eq 'MS-AZR-USGOV-0017P' and Currency eq 'USD' and Locale eq 'en-US' and RegionInfo eq 'US'
Authorization: Bearer {accessToken}

实际发送请求时,建议对 $filter 做 URL 编码。例如:

curl --get \
  "https://management.usgovcloudapi.net/subscriptions/${SUBSCRIPTION_ID}/providers/Microsoft.Commerce/RateCard" \
  --data-urlencode "api-version=2015-06-01-preview" \
  --data-urlencode "\$filter=OfferDurableId eq 'MS-AZR-USGOV-0017P' and Currency eq 'USD' and Locale eq 'en-US' and RegionInfo eq 'US'" \
  --header "Authorization: Bearer ${ACCESS_TOKEN}"

这里沿用了问题中的旧版 api-version。这是一个早期 preview API,当前是否仍然可用,应以 Azure Government 环境实际公布的 provider metadata 为准。

使用正确的 Azure Government 身份环境

如果使用 Azure CLI 获取访问令牌,需要先切换到 Azure Government:

az cloud set --name AzureUSGovernment
az login
az account set --subscription "${SUBSCRIPTION_ID}"

然后获取 ARM 访问令牌:

ACCESS_TOKEN="$(az account get-access-token \
  --resource-type arm \
  --query accessToken \
  --output tsv)"

使用 SDK 或自行实现 OAuth 时,也要选择 Azure Government 对应的 authority 和 ARM resource/audience。如果使用公共 Azure 的登录环境生成令牌,可能会收到 InvalidAuthenticationTokenAudience、Unauthorized 或类似错误。

Usage API 也要使用 Government 端点

旧版 usage aggregates 请求同样需要发送到 Azure Government:

GET https://management.usgovcloudapi.net/subscriptions/{subscriptionId}/providers/Microsoft.Commerce/usageAggregates?api-version=2015-06-01-preview&reportedStartTime={startTime}&reportedEndTime={endTime}&aggregationGranularity=Daily&showDetails=true
Authorization: Bearer {accessToken}

示例:

curl --get \
  "https://management.usgovcloudapi.net/subscriptions/${SUBSCRIPTION_ID}/providers/Microsoft.Commerce/usageAggregates" \
  --data-urlencode "api-version=2015-06-01-preview" \
  --data-urlencode "reportedStartTime=2026-09-01T00:00:00Z" \
  --data-urlencode "reportedEndTime=2026-09-02T00:00:00Z" \
  --data-urlencode "aggregationGranularity=Daily" \
  --data-urlencode "showDetails=true" \
  --header "Authorization: Bearer ${ACCESS_TOKEN}"

这里的时间范围和 API 版本只用于说明请求结构。实际调用时,需要根据目标接口的支持情况进行调整。

EA 订阅需要特别注意什么

RateCard、用量和 EA 实际账单是三个不同的概念:

  • Usage API 提供资源消耗数据。
  • RateCard API 提供与指定 offer、币种和区域对应的费率目录。
  • EA 实际费用可能包含合同折扣、阶梯价格、预留实例、Savings Plan、Azure Marketplace、税费或其他结算调整。

因此,即使 RateCard 请求成功,也不能直接通过“用量 × RateCard 单价”还原 EA 发票。要准确核算 EA 成本,需要使用组织账单范围下的 Price Sheet、Usage Details、Cost Management 或相应的 EA billing 接口,并通过具备账单权限的身份调用。

如果更换端点后仍然失败

可以按以下顺序排查:

  1. 确认 CLI、SDK 和访问令牌都属于 AzureUSGovernment,而不是公共 Azure。
  2. 确认当前身份至少具有目标 subscription 的读取权限。
  3. 确认 subscription ID 不是来自另一个 tenant 或云环境。
  4. 检查 Microsoft.Commerce provider 和指定的 API version 是否可用于 Azure Government。
  5. 确认 MS-AZR-USGOV-0017P 确实是该订阅适用的 offer,而不是根据名称推测出来的值。
  6. 如果收到 InvalidApiVersionParameter、NoRegisteredProviderFound 或 ResourceTypeNotSupported,说明请求已经到达正确的云环境,但旧接口或版本可能不可用。
  7. 如果要查询的是 EA 协议价格,而不是公开的 offer rate,应改用 EA 账单范围支持的价格表或 Cost Management API。

当前的 SubscriptionNotFound 首先是云端点使用错误造成的。将请求端点、登录环境和令牌全部切换到 Azure Government 后,再检查所需的 billing API、版本和 EA 权限是否符合要求。

备注:内容仅供参考。