Create Azure Cloud Service in a specific Resource Group from PowerShell

By default you can’t create a Cloud Service in a resource group. I think this might be due to the fact that when Cloud Services where created Azure didn’t have a concept of Resource Groups.

The only way to create a Cloud Service is via this command:

New-AzureService -ServiceName $ServiceName -Location "$Location"

If you look at the result of execution in a new Azure Portal you’ll notice that behind the scenes this creates a new resource group with name identical to the service name and places the cloud service inside.

It doesn’t give you many options. However with a combination of new RM commandlets we can still achieve awesomeness. RM commandlets let you move resources (there a limited list). Fortunately Cloud Service is supported. Below is the complete PowerShell script I’ve created which achieves the task:

param(
 [Parameter(Mandatory=$True)]
 [string]
 $ServiceName,
  
 [Parameter(Mandatory=$True)]
 [string]
 $Location,
  
 [Parameter(Mandatory=$True)]
 [string]
 $ResourceGroupName
)
 
#This script prepares cloud service. If cloud service exists by name it does nothing.
#Otherwise a new cloud service is created in specified resource group.
 
Write-Host "Preparing cloud service '$ServiceName' in resource group '$ResourceGroupName' in '$Location'..."
 
Function WaitForService {
    Param(
        [string]$ResourceGroupName,
         
        [int]$Retries = 10
    )
 
    $tried = 0;
     
    while($tried -le $Retries)
    {
        try
        {
            $cloudService = Get-AzureRmResource -ResourceName "$ServiceName" -ResourceGroupName "$ServiceName"
            Write-Host "[service ready]" -ForegroundColor Green
            return $cloudService
        }
        catch
        {
            Write-Host "[service not ready yet]" -ForegroundColor Red
            #Write-Host "$($_.Exception)"
            Start-Sleep 5
        }
    }
}
 
#create or get service
$service =  Get-AzureService -ServiceName "$ServiceName" -ErrorAction SilentlyContinue
if($service)
{
    Write-Host "Using existing service '$ServiceName'";
}
else
{
    #Note that Azure doesn't support creating cloud services inside specified resource groups
    Write-Host "No service exists, creating new..."
    New-AzureService -ServiceName $ServiceName -Location "$Location"
     
    Write-Host "Looking for the new cloud service..."
    #it turns out that service does not become available immediately hence wait for it in a loop
    $cloudService = WaitForService($ServiceName, 50); 
    $cloudServiceId = $cloudService.ResourceId;
     
    #In order to have the service in desired resource group it has to be moved explicitly
    Write-Host "Moving '$ServiceName' ($cloudServiceId) to resource group '$ResourceGroupName'..."
    Move-AzureRmResource -DestinationResourceGroupName "$ResourceGroupName" -ResourceId $cloudService.ResourceId -Force
     
    #Delete the pre-created resource group. New-AzureService will create a new resource group with same name
    #as service name, and because service is now moved to a new group old one can be killed.
    Write-Host "Removing resoure group '$ServiceName'..."
    Remove-AzureRmResourceGroup -Name "$ServiceName" -Force
}
 
Write-Host "[service online]" -ForegroundColor Green

P.S. Update in 2021: As cloud services are dying, snapshotting some pages here.

Have a question⁉ Contact me.