Setting Instance Level Public IPs on Azure VMs

Published on
Reading time
Authors

Since October 2014 it has been possible to add a public IP address to a virtual machine in Azure so that it can be directly connected to by clients on the internet. This bypasses the load balancing in Azure and is primarily designed for those scenarios where you need to test a host without the load balancer, or you are deploying a technology that may require a connection type that isn't suited to Azure's Load Balancing technology.

This is all great, but the current implementation provides you with dynamic IP addresses only, which is not great unless you can wrap a DNS CNAME over the top of them. Reading the ILPIP documentation suggested that a custom FQDN was generated for an ILPIP, but for the life of me I couldn't get it to work!

I went around in circles a bit based on the documentation Microsoft supplies as it looked like all I needed to do was to call the Set-AzurePublicIP Cmdlet and the Azure fabric would take care of the rest... but no such luck!

Get-AzureVM -ServiceName svc01 -Name vm01 | `
Set-AzurePublicIP -PublicIPName vm01ip -IdleTimeoutInMinutes 4 | `
Update-AzureVM

When I did a Get-AzureVM after the above I got the following output - note that I did get a public IP, but no hostname to go along with it!

DeploymentName : svc01
Name : vm01
Label :
VM : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.PersistentVM
InstanceStatus : ReadyRole
IpAddress : 10.0.0.5
InstanceStateDetails :
PowerState : Started
InstanceErrorCode :
InstanceFaultDomain : 1
InstanceName : vm01
InstanceUpgradeDomain : 1
InstanceSize : Small
HostName : vm01
AvailabilitySetName : asn01
DNSName : http://svc01.cloudapp.net/
Status : ReadyRole
GuestAgentStatus : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.GuestAgentStatus
ResourceExtensionStatusList : {Microsoft.Compute.BGInfo}
PublicIPAddress : 191.239.XX.XX
PublicIPName : vm01ip
PublicIPDomainNameLabel :
PublicIPFqdns : {}
NetworkInterfaces : {}
VirtualNetworkName : Group demo01
ServiceName : svc01
OperationDescription : Get-AzureVM
OperationId : 62fdb5b28dccb3xx7ede3yyy18c0454
OperationStatus : OK

Aaarggh!

The Solution

It turns out, after a little experimentation, that you all you have to do to get this to work is to supply a value to an undocumented parameter DomainNameLabel for the Set-AzurePublicIP Cmdlet.

Note: there is also no way to achieve this at time of writing via the Azure web portals - you have to use PowerShell to get this configured.

Let's try our call again above with the right arguments this time!

Get-AzureVM -ServiceName svc01 -Name vm01 | `
Set-AzurePublicIP -PublicIPName vm01ip `
                    -IdleTimeoutInMinutes 4 -DomainNameLabel vm01ilpip | `
Update-AzureVM

Success!!

DeploymentName : svc01
Name : vm01
Label :
VM : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.PersistentVM
InstanceStatus : ReadyRole
IpAddress : 10.0.0.5
InstanceStateDetails :
PowerState : Started
InstanceErrorCode :
InstanceFaultDomain : 1
InstanceName : vm01
InstanceUpgradeDomain : 1
InstanceSize : Small
HostName : vm01
AvailabilitySetName : asn01
DNSName : http://svc01.cloudapp.net/
Status : ReadyRole
GuestAgentStatus : Microsoft.WindowsAzure.Commands.ServiceManagement.Model.GuestAgentStatus
ResourceExtensionStatusList : {Microsoft.Compute.BGInfo}
PublicIPAddress : 191.239.XX.XX
PublicIPName : vm01ip
PublicIPDomainNameLabel : vm01ilpip
PublicIPFqdns : {vm01ilpip.svc01.cloudapp.net , vm01ilpip.0.svc01.cloudapp.net}
NetworkInterfaces : {}
VirtualNetworkName : Group demo01
ServiceName : svc01
OperationDescription : Get-AzureVM
OperationId : 62fdb5b28dccb3xx7ede3yyy18c0454
OperationStatus : OK

Now that I have this information I can setup DNS CNAMEs against the PublicIPFqdns and use DNS to manage the invariable IP address change between instance recycles. Happy days!