While building some multithreading Azure Runbooks that log into multiple subscriptions simultaneously, I noticed that these multiple concurrent runs often end up on the same Azure Automation Host.
Apparently, these runbooks then don’t run in full isolation, and the following error may occur:
The running command stopped because the preference variable “ErrorActionPreference” or common parameter is set to Stop: The process cannot access the file ‘C:\Windows\system32\config\systemprofile\AppData\Roaming\Windows Azure Powershell\TokenCache.dat’ because it is being used by another process.
AzureProfile.json may also get locked. I resolved this by doing a retry on the Save-AzureRMContext, and using a randomized file name for the azure json profile:
$randomProfileName = [System.IO.Path]::GetRandomFileName() Save-AzureRmContext -Path .\$randomProfileName -Force -Confirm:$False
And for my full Azure Login code snippet:
$randomProfileName = [System.IO.Path]::GetRandomFileName()
$tries=0
while($true){
$tries++
try{
Write-Output "Logging in to Azure $azureSubscription"
$res = Login-AzureRmAccount -Credential $azureCreds -SubscriptionId $azureSubscription -TenantId $tenantId -ErrorAction Stop
Select-AzureRmSubscription -SubscriptionId $azureSubscription -ErrorAction Stop -TenantId $tenantId
if($res.Context.Subscription.Id -eq $azureSubscription){
Write-Output "Logged in to Azure subscription $($res.Context.Subscription.Id)"
}else{
Throw "Failed, we were logged in to $($res.Context.Subscription.Id) while trying to log in to $azureSubscription"
}
Save-AzureRmContext -Path .\$randomProfileName -Force -Confirm:$False
break
}catch{
if($tries -ge 30){
Throw
Exit
}
#sleep on failed attempts, as the azure token cache gets locked by concurrent jobs
sleep -s (Get-Random -minimum 1 -maximum 6)
}
}
Hey, I’m running into the exact same issue using Azure PowerShell Workflow in a runbook. Did you also have to disable-azcontextautosave? I’m running mine on hybrid worker and am having no luck.