[Azure]_修復虛擬機器從舊有資源群組移動至不同訂閱新的資源群組而發生移動錯誤的問題

前些日子,在移動VM(使用資源群組建立)的過程中,不小心把正在移動的VM給關機…

 

這一關,大事不妙…

 

跟著那一台VM對應的Storage, NIC, NIC Security group都已經成功移動到新的資源群組中

殊不知這台VM就這樣留在舊有的資源群組。

 

並且被標示為已經被Dellocated了|||…但實際上在該VM的服務卻是正常運行,且還能遠端連線進去操作

可是在Portal就顯示該台VM已經是Failed的狀態,而且無法停機無法重新啟動,也無法重新佈署…

皆是因為被判定為Dellocated而無法執行這些維護動作。

 

如果嘗試把該機器再次移往新的資源群組,也是失敗的…

會在Portal告訴你找不到對應的資源,而我這次是顯示說在群組內的網路卡找不到…當然找不到,人家都到新的群組了。

 

不過反過來想,如果把原本移動到新群組的網路卡群組移動回去舊群組呢?

很殘念,是一場羅生門,網路卡群組要移動回舊群組時,也會告訴你找不到對應之VM…|||

 

萬念俱灰的情況下,想到PowerShell通常是個萬靈丹,於是乎,我就轉往看了一下PowerShell做操作,

而最後的結果是成功修好這次的問題,而PowerShell給予的錯誤訊息或者從Azure回來的操作訊息回報都是很重要的關鍵,有可能你遭遇的狀況跟我這次不一樣,但依照錯誤訊息來慢慢找出脈絡,說不定你也有機會自己解掉問題~

 

PowerShell起手式是先裝好Azure SDK on PowerShell,在PowerShell內下:

Install-Module AzureRM

 

接著要使用PowerShell登入Azure:

Login-AzureRmAccount

 

然後切換訂閱,因為我有多個Azure訂閱,我先切至我存放VM舊有的訂閱,這裡是訂閱名稱而不是id,請注意:

Get-AzureRmSubscription -SubscriptionName "Visual Studio Ultimate with MSDN(替換成你自己的訂閱名稱)" | Select-AzureRmSubscription

 

而我第一步嘗試的是將遺留在舊訂閱的VM移動至新資源群組,而這個新的資源群組已經有放這這台VM關聯的網路卡群組以及儲存體帳號,而我的資源群組新舊都稱為NTL-Network,但是是存放到不同的訂閱當中。

$sourceRG = "NTL-Network"
$destinationRG = "NTL-Network"

$vm = Get-AzureRmResource -ResourceGroupName $sourceRG -ResourceType "Microsoft.Compute/virtualMachines" -ResourceName "NTL-Network"

 

Move-AzureRmResource -DestinationSubscriptionId "你目的地訂閱的ID,這邊是ID不是NAME" -DestinationResourceGroupName $destinationRG -ResourceId $vm.ResourceId

運行完上面的指令時,發現PowerShell從Azure吐回來的操作訊息回報內容,似乎跟Portal上說找不到對應網路卡群組有些出入…

 

簡單來說上面那張圖裡面有一段從Azure吐回來的json訊息,裡面表明了是找不到對應的儲存體帳號,而我那台VM有繫結了三組儲存體帳號…

 

這跟Portal講的完全不一樣|||

 

於是乎,我繼續第二步,用Portal操作將那三個儲存體從新訂閱內的資源群組拉回至舊訂閱的資源群組當中。

 

第三步則是再重新用PowerShell下了以下內容,將VM連同三個儲存體一起從舊訂閱拉回新訂閱當中:

$sourceRG = "NTL-Network"
$destinationRG = "NTL-Network"

$vm = Get-AzureRmResource -ResourceGroupName $sourceRG -ResourceType "Microsoft.Compute/virtualMachines" -ResourceName "NTL-Network"

$storageAccount = Get-AzureRmResource -ResourceGroupName $sourceRG -ResourceType "Microsoft.Storage/storageAccounts" -ResourceName "ntlnetwork"
$storageAccount2 = Get-AzureRmResource -ResourceGroupName $sourceRG -ResourceType "Microsoft.Storage/storageAccounts" -ResourceName "ntlnetworkdisks519"
$diagStorageAccount = Get-AzureRmResource -ResourceGroupName $sourceRG -ResourceType "Microsoft.Storage/storageAccounts" -ResourceName "ntlnetworkdiag353"

Move-AzureRmResource -DestinationSubscriptionId "你目的地訂閱的ID,這邊是ID不是NAME" -DestinationResourceGroupName $destinationRG -ResourceId $vm.ResourceId,$storageAccount.ResourceId, $storageAccount2.ResourceId,$diagStorageAccount.ResourceId

 

此時成功的把VM連同三個儲存體帳戶一併拉回至新訂閱的資源群組內…

 

暫時先鬆一口氣。

 

但能發現這時VM還是Failed的狀況,且仍然呈現Dellocated的奇怪問題,我嘗試的重新佈署跟停止該VM,得到以下錯誤訊息:

Failed to stop the virtual machine ‘NTL-Network’. Error: Property networkInterfaces of resource /subscriptions/新訂閱ID/resourceGroups/NTL-Network/providers/Microsoft.Compute/virtualMachines/NTL-Network can only reference resouces in subscription 新訂閱ID. Value /subscriptions/舊訂閱ID/resourceGroups/NTL-Network/providers/Microsoft.Network/networkInterfaces/ntl-network623 references wrong subscription.

 

意思就是在新訂閱內的網路卡群組卻是參照舊訂閱的位址|||…

我真的有點佩服自己把整個群組搞得一團亂…

不過這也說明了為甚麼VM留在舊群組內運作卻還是一切正常

 

第四步,幸好這個問題不需出動PowerShell,而是我又重新地將新訂閱資源群組內的VM,3個儲存體帳戶,以及網路群組(也就是整個VM群組內的所有資源)通通再移回去舊的訂閱…

再次的移回至新的訂閱…

 

讓系統能將所有對應的資源路徑重新的Mapping到對的訂閱以及路徑上…

最後終於讓VM復活啦…

 

過程太緊張,所以在Portal上的錯誤畫面都沒有擷到圖…不過還是希望能幫助到哪個人像我一樣在移動資源的過程中還去對對應資源操作而導致設定跑掉的問題…

 

指令參照:

https://docs.microsoft.com/en-us/powershell/azureps-cmdlets-docs/

https://docs.microsoft.com/zh-tw/azure/virtual-machines/virtual-machines-windows-move-vm

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料