共用方式為


將 Azure 資源移至新的資源群組或訂用帳戶 (機器翻譯)

本文說明如何在相同訂用帳戶內或跨不同訂用帳戶的資源群組之間移動 Azure 資源。 如果移動牽涉到不同的訂用帳戶,這兩個訂用帳戶都必須是相同Microsoft Entra ID 租使用者的一部分。 您可以使用 Azure 入口網站、Azure PowerShell、Azure CLIREST API 或 Python 等工具來移動資源。

在移動作業期間,來源和目標資源群組都會鎖定。 移動進行時,您無法在這些資源群組內建立、刪除或更新資源。 不過,現有的資源仍可完全運作。 例如,如果您將虛擬機從某個資源群組移至另一個資源群組,則無法在移動期間刪除虛擬機或修改其屬性(例如其大小)。 儘管有這項限制,但虛擬機仍會正常運作,依賴虛擬機的服務不會發生任何停機時間。 鎖定最多可以持續四個小時。 大部分的移動都會更快完成,並據以移除鎖定。

移動要求中應該只指定最上層 (parent) 資源。 子資源會隨著父系自動移動,但無法獨立移動。 例如,您可以移動父 Microsoft.Compute/virtualMachines資源,例如 ,以及其子資源,例如 Microsoft.Compute/virtualMachines/extensions 隨其移動。 不過,您無法自行移動子資源。

移動資源時會保留其子資源的相依性,但與其他資源的相依性可能會中斷,而且可能需要再次設定。 移動資源只會變更其相關聯的資源群組,而且不會改變資源的實體區域。

注意

如果來源、目的地資源群組或訂用帳戶上存在只讀鎖定,就無法移動 Azure 資源。

已變更資源識別碼

當您移動資源時,會變更其資源識別碼。 資源識別碼的標準格式為 /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}。 當您將資源移至新的資源群組或訂用帳戶時,您會變更該路徑中的一或多個值。

如果您在任何地方使用資源標識碼,請變更該值。 例如,如果您在 入口網站中有參考資源標識碼的自定義儀錶板 ,請更新該值。 尋找需要針對新資源識別碼更新的任何指令碼或範本。

移動資源前的檢查清單

移動資源之前有一些重要步驟。 如果您確認這些條件,可以避免錯誤。

  1. 來源和目的地訂用帳戶必須為作用中。 如果您無法啟用已停用的帳戶,請建立 Azure 支援 要求。 針對問題類型選取 [訂用帳戶管理]

  2. 來源和目的地的訂用帳戶必須存在於相同的 Microsoft Entra 租用戶內。 使用 Azure CLI 或 PowerShell 來檢查這兩個訂用帳戶是否具有相同的租用戶標識碼。

    az account show --subscription <your-source-subscription> --query tenantId
    az account show --subscription <your-destination-subscription> --query tenantId
    

    如果來源和目的地訂用帳戶的租用戶標識符不相符,請使用下列方法來協調它們:

  3. 若要將資源移至或移出 雲端解決方案提供者 (CSP) 合作夥伴,請參閱在訂閱者與 CSP 之間轉移 Azure 訂用帳戶。

  4. 您要移動的資源必須支援移動作業。 如需哪些資源支援移動作業的清單,請參閱 移動作業的 Azure 資源類型。

  5. 某些服務在移動資源時有特定的限制或需求。 在移動這些服務內的資源之前,請先檢查下列移動指引:

  1. 目的地訂用帳戶必須註冊您要移動之資源的資源提供者。 如果沒有,您會收到錯誤,指出 訂用帳戶未註冊資源類型。 將資源移至新的訂用帳戶時,您可能會看到此錯誤,但您先前並未在訂用帳戶中使用資源類型。

    若要取得註冊狀態:

    az account set -s <destination-subscription-name-or-id>
    az provider list --query "[].{Provider:namespace, Status:registrationState}" --out table
    

    若要註冊資源提供者:

    az provider register --namespace Microsoft.Batch
    
  2. 開始移動作業之前,請檢查您要移動資源的訂用帳戶配額。 確認您是否可以要求增加配額,而導致目的地訂用帳戶超過其限制。 如需限制以及如何要求增加的詳細指引,請參閱 Azure 訂用帳戶和服務限制、配額和限制

  3. 移動資源的帳戶至少必須有下列權限:

    • 在來源資源群組: Microsoft.Resources/subscriptions/resourceGroups/moveResources/action
    • 在目的地資源群組: Microsoft.Resources/subscriptions/resourceGroups/write
  4. 如果您移動具有作用中 Azure 角色指派的資源(或其具有相同指派的子資源),則角色指派不會移動並成為孤立。 移動之後,您必須再次建立角色指派。 雖然系統會自動移除孤立的角色指派,但建議您先將其移除再移動。

    若要深入瞭解如何管理角色指派,請參閱 列出 Azure 角色指派指派 Azure 角色

  5. 若要進行跨訂用帳戶的移動,資源及其相依的資源必須位於相同的資源群組中,且必須一起移動。 例如,具有受控磁碟的虛擬機需要您將虛擬機、受控磁碟和其他相依資源一起移動。

    如果您要將資源移至新的訂用帳戶,請檢查資源是否有任何相依資源,以及資源是否位於相同的資源群組中。 如果資源不在相同的資源群組中,請檢查您是否可以將資源合併成相同的資源群組。 如果可以,請使用跨資源群組的一個移動作業,將所有資源合併到相同的資源群組。

    如需詳細資訊,請參閱在訂用帳戶之間移動的案例

在訂用帳戶之間移動的案例

將資源從一個訂用帳戶移至另一個訂用帳戶是三個步驟的程式。 為了說明這些步驟,下圖只描述一個相依資源:

此圖顯示跨訂用帳戶移動資源的三步驟流程。

  • 步驟 1:如果相依資源分散在不同的資源群組間,請先將其移至一個資源群組中。
  • 步驟 2:將資源和相依資源一起從來源訂用帳戶移至目標訂用帳戶。
  • 步驟 3:選擇性地將相依資源重新發佈至目標訂用帳戶內的不同資源群組。

移動資源

使用 Azure 入口網站

  1. 若要移動資源,請選取包含這些資源的資源群組。

  2. 選取您要移動的資源。 若要移動所有資源,請選取清單最上方的核取方塊。 或者,個別選取資源。

    Azure 入口網站的螢幕擷取畫面,其中顯示要移動的資源選取項目。

  3. 選取 [移動] 按鈕。

    Azure 入口網站的螢幕擷取畫面,其中顯示有三個選項的 [移動] 按鈕。

    此按鈕提供三個選項:

    • 移至新的資源群組。
    • 移至新的訂用帳戶。
  1. 如果您要將資源移至新的資源群組或訂用帳戶,請選擇 。

  2. 來源資源群組會自動設定。 指定目的地資源群組。 如果您要移至新的訂用帳戶,請指定此選項。 選取 [下一步]。

    Azure 入口網站的螢幕擷取畫面,其中使用者指定移動作業的目的地資源群組。

  3. 入口網站會驗證資源可以移動。 等待驗證完成。

Azure 入口網站的螢幕擷取畫面,其中顯示移動作業的驗證流程。

  1. 在驗證順利完成後,選取 [下一步]。

  2. 確認您需要更新這些資源的工具和指令碼。 若要開始移動資源,請選取 [移動]。

Azure 入口網站的螢幕擷取畫面,其中使用者在開始移動作業之前,確認需要更新工具和指令碼。

  1. Azure 入口網站 會在移動完成時通知您。

Azure 入口網站的螢幕擷取畫面,其中顯示有移動作業結果的通知。

使用 Azure CLI

Validate

若要測試您的移動案例,而不實際即時移動資源,請使用 az resource invoke-action 命令。 只有在您需要建立結果模型而不遵循時,才使用此命令。 若要執行這項作業,您需要來源資源群組的資源標識符、目標資源群組,以及您要移動的每個資源。

用來 \" 逸出要求主體中的雙引號。

az resource invoke-action --action validateMoveResources \
  --ids "/subscriptions/{subscription-id}/resourceGroups/{source-rg}" \
  --request-body "{  \"resources\": [\"/subscriptions/{subscription-id}/resourceGroups/{source-rg}/providers/{resource-provider}/{resource-type}/{resource-name}\", \"/subscriptions/{subscription-id}/resourceGroups/{source-rg}/providers/{resource-provider}/{resource-type}/{resource-name}\", \"/subscriptions/{subscription-id}/resourceGroups/{source-rg}/providers/{resource-provider}/{resource-type}/{resource-name}\"],\"targetResourceGroup\":\"/subscriptions/{subscription-id}/resourceGroups/{destination-rg}\" }" 

如果通過驗證,您會看到:

{} Finished .. 

如果驗證失敗,您會看到錯誤訊息,說明為何無法移動資源。

移動

若要將現有資源移至另一個資源群組或訂用帳戶,請使用 az resource move 命令。 請在 --ids 參數中,為要移動的資源識別碼提供以空格分隔的清單。

下列命令示範如何將數個資源移至新的資源群組。 他們會在 Bash 終端機或 Azure PowerShell 控制台中使用 Azure CLI。 若要將資源移至新的訂用帳戶,請提供 --destination-subscription-id 參數。

webapp=$(az resource show -g OldRG -n ExampleSite --resource-type "Microsoft.Web/sites" --query id --output tsv)
plan=$(az resource show -g OldRG -n ExamplePlan --resource-type "Microsoft.Web/serverfarms" --query id --output tsv)
az resource move --destination-group newgroup --ids $webapp $plan

使用 Azure PowerShell

Validate

若要測試您的移動案例,而不需即時移動資源,請使用 Invoke-AzResourceAction Azure PowerShell 中的 命令。 只有在您需要建立結果模型而不遵循時,才使用此命令。

$sourceName = "sourceRG"
$destinationName = "destinationRG"
$resourcesToMove = @("app1", "app2")

$sourceResourceGroup = Get-AzResourceGroup -Name $sourceName
$destinationResourceGroup = Get-AzResourceGroup -Name $destinationName

$resources = Get-AzResource -ResourceGroupName $sourceName | Where-Object { $_.Name -in $resourcesToMove }

Invoke-AzResourceAction -Action validateMoveResources `
  -ResourceId $sourceResourceGroup.ResourceId `
  -Parameters @{
  resources = $resources.ResourceId;  # Wrap in an @() array if providing a single resource ID string.
  targetResourceGroup = $destinationResourceGroup.ResourceId
  }

如果驗證成功,則不會顯示輸出。 不過,如果驗證失敗,錯誤訊息會說明為何您無法移動資源。

移動

若要將現有的資源移動到另一個資源群組或訂用帳戶,請使用 Move-AzResource 命令。 下列範例示範了如何將多個資源移動到新的資源群組。

$sourceName = "sourceRG"
$destinationName = "destinationRG"
$resourcesToMove = @("app1", "app2")

$resources = Get-AzResource -ResourceGroupName $sourceName | Where-Object { $_.Name -in $resourcesToMove }

Move-AzResource -DestinationResourceGroupName $destinationName -ResourceId $resources.ResourceId

若要移動到新的訂用帳戶,請包含 DestinationSubscriptionId參數的值。

使用 Python

Validate

若要測試您的移動案例,而不實際即時移動資源,請使用 ResourceManagementClient.resources.begin_validate_move_resources 方法。 只有在您需要建立結果模型而不遵循時,才使用這個方法。

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

source_name = "sourceRG"
destination_name = "destinationRG"
resources_to_move = ["app1", "app2"]

destination_resource_group = resource_client.resource_groups.get(destination_name)

resources = [
  resource for resource in resource_client.resources.list_by_resource_group(source_name)
  if resource.name in resources_to_move
]

resource_ids = [resource.id for resource in resources]

validate_move_resources_result = resource_client.resources.begin_validate_move_resources(
  source_name,
  {
  "resources": resource_ids,
  "target_resource_group": destination_resource_group.id
  }
).result()

print("Validate move resources result: {}".format(validate_move_resources_result))

如果驗證成功,則不會顯示輸出。 不過,如果驗證失敗,錯誤訊息會說明為何您無法移動資源。

移動

若要將現有資源移至另一個資源群組或訂用帳戶,請使用 ResourceManagementClient.resources.begin_move_resources Python 中的 方法。 下列範例示範了如何將多個資源移動到新的資源群組。

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ResourceManagementClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

resource_client = ResourceManagementClient(credential, subscription_id)

source_name = "sourceRG"
destination_name = "destinationRG"
resources_to_move = ["app1", "app2"]

destination_resource_group = resource_client.resource_groups.get(destination_name)

resources = [
  resource for resource in resource_client.resources.list_by_resource_group(source_name)
  if resource.name in resources_to_move
]

resource_ids = [resource.id for resource in resources]

resource_client.resources.begin_move_resources(
  source_name,
  {
  "resources": resource_ids,
  "target_resource_group": destination_resource_group.id
  }
)

使用 REST API

Validate

作業會 validate move operation 測試您的移動案例,而不會實際移動資源。 使用此作業來檢查移動是否成功。 當您傳送移動要求時,會自動呼叫驗證。 只有在您需要建立結果模型而不遵循時,才使用此作業。 若要執行這項作業,您需要:

  • 來源資源群組的名稱
  • 目標資源群組的資源識別碼
  • 要移動的每個資源的資源識別碼
  • 帳戶的存取權杖

傳送下列要求:

POST https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<source-group>/validateMoveResources?api-version=2019-05-10
Authorization: Bearer <access-token>
Content-type: application/json

使用要求本文:

{
 "resources": ["<resource-id-1>", "<resource-id-2>"],
 "targetResourceGroup": "/subscriptions/<subscription-id>/resourceGroups/<target-group>"
}

如果要求的格式正確,此作業將會傳回:

Response Code: 202
cache-control: no-cache
pragma: no-cache
expires: -1
location: https://management.azure.com/subscriptions/<subscription-id>/operationresults/<operation-id>?api-version=2018-02-01
retry-after: 15
...

202 狀態代碼表示已接受驗證要求,但尚未判斷移動作業是否成功。 location 值包含一個 URL,可讓您用來檢查長時間執行作業的狀態。

若要檢查狀態,請傳送下列要求:

GET <location-url>
Authorization: Bearer <access-token>

當作業執行時,您繼續收到 202 狀態代碼。 請等候 retry-after 值中指出的秒數,再重新嘗試。 如果移動驗證成功,您會收到 204 狀態代碼。 如果移動驗證失敗,您會收到類似下列的錯誤訊息:

{"error":{"code":"ResourceMoveProviderValidationFailed","message":"<message>"...}}

移動

若要將現有資源移至另一個資源群組或訂用帳戶,請使用 Move resources 作業。

POST https://management.azure.com/subscriptions/{source-subscription-id}/resourcegroups/{source-resource-group-name}/moveResources?api-version={api-version}

指定要在要求主體中移動的目標資源群組和資源。

{
 "resources": ["<resource-id-1>", "<resource-id-2>"],
 "targetResourceGroup": "/subscriptions/<subscription-id>/resourceGroups/<target-group>"
}

常見問題集

我的資源移動作業通常需要幾分鐘的時間執行近一小時。 是不是哪裡出錯了?

移動資源是具有不同階段的複雜作業。 牽涉到的可能不只是您嘗試移動資源的資源提供者。 Azure Resource Manager 允許移動作業四小時完成,因為資源提供者之間的相依性。 此持續時間可讓他們有時間從暫時性問題復原。 如果您的移動要求在四小時內,作業會持續嘗試完成,而且可能會成功。 此作業會在這段期間鎖定來源和目的地資源群組,以避免發生一致性問題。

為什麼我的資源群組在資源移動期間遭鎖定四小時?

  • 移動作業允許四小時完成。 此作業會在這段期間鎖定來源和目的地資源群組,以防止它們遭到修改。

  • 移動要求中有兩個階段。 資源在第一個階段移動,而相依於所移動資源的資源提供者會在第二個階段期間收到通知。 當資源提供者任一階段失敗時,所有四個小時都可以鎖定資源群組。 Resource Manager 會在移動作業期間起始任何失敗的步驟。

  • 如果資源未在四小時內移動,Resource Manager 會解除鎖定這兩個資源群組。 成功移動的資源位於目的地資源群組中。 無法移動的資源會保留在來源資源群組中。

來源和目的地資源群組在資源移動期間遭鎖定有什麼含意?

鎖定可防止您刪除任一資源群組。 鎖定也會防止您建立新的資源、刪除資源,或更新每個資源群組內的資源屬性(例如,變更虛擬機的大小)。

下圖顯示當您嘗試刪除進行中移動之資源群組時,Azure 入口網站 的錯誤訊息:

Azure 入口網站的螢幕擷取畫面,其中顯示嘗試刪除涉及進行中移動作業之資源群組時的錯誤訊息。

在上圖中,虛擬機資源屬於目前正在進行移動作業的資源群組 (“TestB”。 當您嘗試更新虛擬機的屬性(例如其大小),Azure 入口網站 會傳回錯誤訊息。 發生此錯誤的原因是資源群組在移動期間遭到鎖定,可保護其資源不受修改。

當使用者嘗試更新虛擬機的屬性(虛擬機大小)時,Azure 入口網站 顯示錯誤訊息的螢幕快照。

此外,來源和目的地資源群組無法在資源移動期間同時參與其他移動作業。 例如,如果您要將資源從資源群組 A 移至資源群組 B,則資源群組 A 和資源群組 B 無法同時參與另一個移動作業。 您無法同時將資源移至或移出資源群組 C。此限制可防止在行動程序期間鎖定資源群組的多個衝突作業。

錯誤碼 "MissingMoveDependentResources" 是什麼意思?

當您移動資源時,其相依資源必須存在於目的地資源群組或訂用帳戶中,或包含在移動要求中。 當相依資源不符合此需求時,您會收到 MissingMoveDependentResources 錯誤碼。 錯誤訊息會提供您需要包含在移動要求中之相依資源的詳細數據。

例如,移動虛擬機器可能需要移動三個不同資源提供者的七個資源類型。 這些資源提供者和類型為:

  • Microsoft.Compute

    • virtualMachines
    • disks
  • Microsoft.Network

    • networkInterfaces
    • publicIPAddresses
    • networkSecurityGroups
    • virtualNetworks
  • Microsoft.Storage

    • storageAccounts

另一個常見的範例是行動虛擬網路,您可能必須移動與該虛擬網路相關聯的數個其他資源。 移動要求可能需要移動公用IP位址、路由表、虛擬網路閘道、網路安全組和其他資源。 虛擬網路閘道應該位於與其虛擬網路相同的資源群組中,因為它們無法分開移動。

問題:錯誤碼 "RequestDisallowedByPolicy" 是什麼意思?

Resource Manager 會先驗證您的移動要求,再嘗試移動。 此驗證包括檢查針對移動中涉及之資源所定義的原則。 例如,當您嘗試移動密鑰保存庫時,驗證會失敗,但貴組織有原則可拒絕在目標資源群組中建立密鑰保存庫。 傳回的錯誤碼為 RequestDisallowedByPolicy

如需原則的詳細資訊,請參閱什麼是 Azure 原則?

為什麼我無法移動 Azure 中的某些資源?

並非所有 Azure 資源都允許行動作業。

我可以在一個作業中移動多少個資源?

盡可能將大型移動移至不同的移動作業。 單一作業超過 800 個資源時,Resource Manager 會立即傳回錯誤。 不過,移動少於800個資源也可能因為逾時而失敗。

資源未處於「成功」狀態的錯誤意義為何?

當您收到錯誤訊息,指出您無法移動資源,因為它不是 處於成功 狀態,可能是因為相依資源封鎖移動。 錯誤碼通常是 MoveCannotProceedWithResourcesNotInSucceededState

如果來源或目標資源群組包含虛擬網路,則會在移動期間檢查相依於該虛擬網路的所有資源狀態。 這項檢查包含直接或間接相依於網路的資源。 如果有任何資源未處於成功狀態,則會封鎖移動。 例如,如果虛擬機使用未回報成功狀態的虛擬網路,則會封鎖移動。 即使虛擬機不是其中一個正在移動的資源,仍會封鎖移動。 即使虛擬機不在來源或目的地資源群組中,也會封鎖移動。

若要解決此問題,請將資源移至沒有虛擬網路或 連絡支援的資源群組。

是否可以將資源群組移至不同的訂用帳戶?

否,您無法將資源群組移至新的訂用帳戶。 但是,您可以將資源群組中的所有資源移至另一個訂用帳戶中的資源群組。 卷標、角色指派和原則等設定不會自動從原始資源群組傳輸到目的地資源群組。 您必須手動將這些設定套用至新的資源群組。

下一步

若要確認哪些 Azure 資源支援行動作業,請參閱 行動資源的行動作業支援。