如何使用 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 端点检索虚拟机的 subscriptionIdresourceGroupName:

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": ""
      }
    ]
  }
}