如何从Azure App Service内部获取Subscription ID
获取Azure App Service所属订阅ID的方法
方法1:通过实例元数据服务(IMDS)直接获取
App Service实例同样可以访问Azure实例元数据服务的内部端点,返回的元数据中包含完整的资源ID,从中可直接解析出订阅ID,这和虚拟机的元数据API使用逻辑一致。
调用方式
在App Service的代码中发起GET请求:
GET http://169.254.169.254/metadata/instance?api-version=2021-02-01 Metadata: true
解析订阅ID
返回的JSON数据里,compute.resourceId字段格式为:/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{siteName}
只需提取/subscriptions/之后、/resourceGroups/之前的字符串片段,就是目标订阅ID。
示例代码(C#):
var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("Metadata", "true"); var response = await httpClient.GetAsync("http://169.254.169.254/metadata/instance?api-version=2021-02-01"); var jsonContent = await response.Content.ReadAsStringAsync(); var metadata = JObject.Parse(jsonContent); var resourceId = metadata["compute"]["resourceId"].ToString(); var subscriptionId = resourceId.Split('/')[2];
方法2:通过托管标识调用ARM API获取
如果需要同时获取更多资源详情,可借助App Service的托管标识调用Azure资源管理器API:
- 给目标App Service启用系统分配的托管标识
- 为该标识分配当前App Service资源的读者权限
- 获取托管标识的访问令牌,调用ARM API获取网站详情,从中提取订阅ID
示例ARM API请求:
GET https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{siteName}?api-version=2023-01-01 Authorization: Bearer {access-token}
注:若不知道订阅ID、资源组或网站名,可先通过IMDS获取这些基础信息,再发起ARM API请求。
内容的提问来源于stack exchange,提问作者tango bango
相关产品推荐
相关产品推荐

