【问题标题】:How to get the Azure subscription and resouce group from within a VM using REST API?如何使用 REST API 从 VM 中获取 Azure 订阅和资源组?
【发布时间】:2020-04-20 01:25:48
【问题描述】:

许多 Azure API 端点要求您传入要使用的资源的订阅 ID 和资源组名称。

如何从 Azure Linux VM 上运行的 bash 脚本获取这些信息? 我无法安装 Azure CLI,因此寻找一些 REST API。

我发现这个旧的answer 很复杂,无论如何都需要 CLI。 一个答案甚至提到了这个 API 来获取一个给定 VM 的所有信息:

/subscriptions/[subscription-id]/resourceGroups/[resource-group-name]/providers/Microsoft.Compute/virtualMachines/[virtual-machine-name]

这似乎是先有鸡还是先有蛋的问题。

【问题讨论】:

  • 不确定我是否理解在 VM 上安装 CLI 的问题。
  • 你到底想达到什么目的?
  • 嗨,这个问题有什么更新吗?如果我的回复对您有帮助,请采纳为答案,谢谢。
  • VM 是由其他团队使用不包含 az CLI 的预定义映像创建的。如果可能的话,我宁愿避免下载和安装它。我的理解是 CLI 由 REST API 提供支持,因此这里缺少客户端应该不是问题。
  • 我正在尝试将系统分配的托管标识附加到运行脚本的 VM。我知道要使用哪个 API,但就像许多其他 API 一样,它需要 VM 所属的订阅 ID 和资源组。

标签: azure resources virtual-machine subscription


【解决方案1】:

您可以使用此 REST API - Subscriptions - List 列出用户可以访问的 Azure AD 租户的所有订阅。

GET https://management.azure.com/subscriptions?api-version=2019-06-01

对于哪个租户,这取决于您从哪个承载令牌获得,当您获得令牌时,在https://jwt.io/ 中解码,您会发现如下所示。如果你使用这个token调用这个API,它会在我截图中隐藏的租户中获取用户可以访问的所有订阅。

如果你想获取VM所在的资源组,你可以使用这个REST API - Virtual Machines - List All,不需要传递resource-group-name,它可以列出所有带有subscriptionId的VM,你可以从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来获取你账号的所有租户。

【讨论】:

    【解决方案2】:

    我找到了。 Azure Instance Metadata Service 返回大量有关发出请求的 Azure VM 的元数据。我使用以下 REST 端点来检索 VM 的 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": ""
          }
        ]
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-04-05
      • 1970-01-01
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多