如何使用 REST API 从 VM 中获取 Azure 订阅和资源组?
How to get the Azure subscription and resouce group from within a VM using REST API?
许多 Azure API 端点要求您传入要使用的资源的订阅 ID 和资源组名称。
从 Azure Linux VM 上的 bash 脚本 运行,我如何获取这些信息? 我无法安装 Azure CLI 因此正在寻找一些 REST API。
我发现这个旧的 很复杂,无论如何都需要 CLI。
一个答案甚至提到这个 API 来获取一个给定 VM 的所有信息:
/subscriptions/[subscription-id]/resourceGroups/[resource-group-name]/providers/Microsoft.Compute/virtualMachines/[virtual-machine-name]
好像是先有鸡还是先有蛋的问题
您可以使用此 REST API - Subscriptions - List
列出用户可以访问的 Azure AD 租户的所有订阅。
GET https://management.azure.com/subscriptions?api-version=2019-06-01
对于哪个租户,这取决于你从哪个bearer token中获取,当你获取到token后,在https://jwt.io/中解码,你会发现如下图。如果你使用这个token来调用这个API,它会得到我在截图中隐藏的租户中用户可以访问的所有订阅。
如果想获取VM所在的资源组,可以使用这个REST API - Virtual Machines - List All
,不需要通过resource-group-name
,它可以列出所有subscriptionId
的虚拟机,你可以从Subscriptions - List
.
得到subscriptionId
GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2019-03-01
所以综上所述,如果您已经知道VM所在的subscriptionId
,您可以列出订阅中的所有VM并在结果中找到VM,然后您将找到资源组名称.如果你不知道subscriptionId
,你可以只列出用户在一个租户中可以访问的所有订阅,并列出每个订阅中的所有虚拟机。此外,如果您甚至不知道 tenant-id
,您可以使用 Tenants - List
来获取您帐户的所有租户。
我找到了。 Azure Instance Metadata Service returns 大量关于发出请求的 Azure VM 的元数据。我使用以下 REST 端点检索虚拟机的 subscriptionId 和 resourceGroupName:
curl -H Metadata:true "http://169.254.169.254/metadata/instance?api-version=2017-08-01"
{
"compute": {
"location": "",
"name": "",
"offer": "",
"osType": "",
"placementGroupId": "",
"platformFaultDomain": "",
"platformUpdateDomain": "",
"publisher": "",
"resourceGroupName": "",
"sku": "",
"subscriptionId": "",
"tags": "",
"version": "",
"vmId": "",
"vmScaleSetName": "",
"vmSize": "",
"zone": ""
},
"network": {
"interface": [
{
"ipv4": {
"ipAddress": [
{
"privateIpAddress": "",
"publicIpAddress": ""
}
],
"subnet": [
{
"address": "",
"prefix": ""
}
]
},
"ipv6": {
"ipAddress": []
},
"macAddress": ""
}
]
}
}
许多 Azure API 端点要求您传入要使用的资源的订阅 ID 和资源组名称。
从 Azure Linux VM 上的 bash 脚本 运行,我如何获取这些信息? 我无法安装 Azure CLI 因此正在寻找一些 REST API。
我发现这个旧的
/subscriptions/[subscription-id]/resourceGroups/[resource-group-name]/providers/Microsoft.Compute/virtualMachines/[virtual-machine-name]
好像是先有鸡还是先有蛋的问题
您可以使用此 REST API - Subscriptions - List
列出用户可以访问的 Azure AD 租户的所有订阅。
GET https://management.azure.com/subscriptions?api-version=2019-06-01
对于哪个租户,这取决于你从哪个bearer token中获取,当你获取到token后,在https://jwt.io/中解码,你会发现如下图。如果你使用这个token来调用这个API,它会得到我在截图中隐藏的租户中用户可以访问的所有订阅。
如果想获取VM所在的资源组,可以使用这个REST API - Virtual Machines - List All
,不需要通过resource-group-name
,它可以列出所有subscriptionId
的虚拟机,你可以从Subscriptions - List
.
subscriptionId
GET https://management.azure.com/subscriptions/{subscriptionId}/providers/Microsoft.Compute/virtualMachines?api-version=2019-03-01
所以综上所述,如果您已经知道VM所在的subscriptionId
,您可以列出订阅中的所有VM并在结果中找到VM,然后您将找到资源组名称.如果你不知道subscriptionId
,你可以只列出用户在一个租户中可以访问的所有订阅,并列出每个订阅中的所有虚拟机。此外,如果您甚至不知道 tenant-id
,您可以使用 Tenants - List
来获取您帐户的所有租户。
我找到了。 Azure Instance Metadata Service returns 大量关于发出请求的 Azure VM 的元数据。我使用以下 REST 端点检索虚拟机的 subscriptionId 和 resourceGroupName:
curl -H Metadata:true "http://169.254.169.254/metadata/instance?api-version=2017-08-01"
{
"compute": {
"location": "",
"name": "",
"offer": "",
"osType": "",
"placementGroupId": "",
"platformFaultDomain": "",
"platformUpdateDomain": "",
"publisher": "",
"resourceGroupName": "",
"sku": "",
"subscriptionId": "",
"tags": "",
"version": "",
"vmId": "",
"vmScaleSetName": "",
"vmSize": "",
"zone": ""
},
"network": {
"interface": [
{
"ipv4": {
"ipAddress": [
{
"privateIpAddress": "",
"publicIpAddress": ""
}
],
"subnet": [
{
"address": "",
"prefix": ""
}
]
},
"ipv6": {
"ipAddress": []
},
"macAddress": ""
}
]
}
}