无法通过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
相关产品推荐
相关产品推荐

