You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法通过Azure Java SDK获取虚拟机规模集实例的公网IP地址

问题描述

通过Azure Java SDK创建了带有.withVirtualMachinePublicIp()选项的Ubuntu Linux虚拟机规模集(VMSS),创建后在Azure门户中能看到实例的公网IP,也可以通过SSH登录实例,但使用Azure Java API获取公网IP时始终返回null。尝试的代码如下:

// vmss 是正常运行的最近创建的 com.azure.resourcemanager.compute.models.VirtualMachineScaleSet 实例
for (VirtualMachineScaleSetNetworkInterface nis : vmss.listNetworkInterfaces()) 
{
    String privip = nis.primaryPrivateIP(); // 正常返回私有IP
    Map<String, VirtualMachineScaleSetNicIpConfiguration> mp = nis.ipConfigurations();
    for (Object key : mp.keySet()) 
    {
        VirtualMachineScaleSetNicIpConfiguration vip = mp.get(key);
        String priva = vip.privateIpAddress(); // 正常返回私有IP
        String pipa = vip.innerModel().publicIpAddress().ipAddress(); // 始终返回null
        String pss = vip.innerModel().privateIpAddress();
        System.out.println("PublicIP=" + pipa + ",PrivateIP=" + priva + "=" + pss); // 公网IP始终为null
    }
}
解决方案

出现这个问题的核心原因是:默认的listNetworkInterfaces()方法返回的网络接口对象不会自动展开关联的公网IP资源详情,publicIpAddress()仅返回资源引用(包含ID),不会加载实际的IP地址。可以通过以下两种方式解决:

方式1:调用listNetworkInterfaces时指定展开公网IP属性

在调用listNetworkInterfaces时传入"publicIpAddress"作为expand参数,让SDK自动加载公网IP的完整信息:

// 传入expand参数展开公网IP资源
for (VirtualMachineScaleSetNetworkInterface nis : vmss.listNetworkInterfaces("publicIpAddress")) 
{
    String privip = nis.primaryPrivateIP();
    Map<String, VirtualMachineScaleSetNicIpConfiguration> mp = nis.ipConfigurations();
    for (Object key : mp.keySet()) 
    {
        VirtualMachineScaleSetNicIpConfiguration vip = mp.get(key);
        String priva = vip.privateIpAddress();
        // 此时可以直接获取公网IP地址
        String pipa = vip.innerModel().publicIpAddress().ipAddress();
        System.out.println("PublicIP=" + pipa + ",PrivateIP=" + priva);
    }
}

方式2:通过公网IP资源ID手动获取详情

如果方式1不生效,可以从IP配置中提取公网IP的资源ID,再通过NetworkManager获取对应的公网IP资源,进而读取IP地址:

// 假设已经初始化了NetworkManager实例(可通过AzureResourceManager获取)
NetworkManager networkManager = azure.resourceManager().networkManager();

for (VirtualMachineScaleSetNetworkInterface nis : vmss.listNetworkInterfaces()) 
{
    String privip = nis.primaryPrivateIP();
    Map<String, VirtualMachineScaleSetNicIpConfiguration> mp = nis.ipConfigurations();
    for (Object key : mp.keySet()) 
    {
        VirtualMachineScaleSetNicIpConfiguration vip = mp.get(key);
        String priva = vip.privateIpAddress();
        // 获取公网IP资源ID
        String publicIpId = vip.innerModel().publicIpAddress().id();
        if (publicIpId != null) {
            // 根据ID获取公网IP资源
            PublicIpAddress publicIp = networkManager.publicIpAddresses().getById(publicIpId);
            String pipa = publicIp.ipAddress();
            System.out.println("PublicIP=" + pipa + ",PrivateIP=" + priva);
        }
    }
}

内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:15:50