Azure リソースを新しいリソース グループまたはサブスクリプションに移動する
この記事では、同じサブスクリプション内で、またはサブスクリプションをまたいで、Azure リソースを異なるリソース グループに移動する方法について説明します。 異なるサブスクリプション間の移動の場合、両方のサブスクリプションが同じ Microsoft Entra ID テナントの一部である必要があります。 Azure portal、Azure PowerShell、Azure CLI、REST API、Python などのツールを使って、リソースを移動できます。
移動操作中は、ソースとターゲットの両方のリソース グループがロックされます。 移動の進行中は、これらのリソース グループ内のリソースを作成、削除、または更新することはできません。 ただし、既存のリソースは引き続き完全に動作します。 たとえば、仮想マシンを別のリソース グループに移動する場合、移動の間に、それを削除することはできず、そのプロパティ (サイズなど) を変更することはできません。 このような制限にもかかわらず、仮想マシンは正常に動作し続け、それに依存するサービスでダウンタイムが発生することはありません。 このロックは最大 4 時間継続します。 ほとんどの移動はこれよりも早く完了し、ロックはそれに応じて削除されます。
移動要求では、最上位 (親) リソースのみを指定する必要があります。 子リソースは親と共に自動的に移動されますが、個別に移動することはできません。 たとえば、Microsoft.Compute/virtualMachines
などの親リソースを移動でき、その子リソース (Microsoft.Compute/virtualMachines/extensions
など) は親リソースと共に移動します。 ただし、子リソースを単独で移動することはできません。
リソースの移動では、子リソースとの依存関係は維持されますが、他のリソースとの依存関係は損なわれて再構成が必要になる場合があります。 リソースを移動すると、それに関連付けられているリソース グループのみが変更され、リソースの物理リージョンは変わりません。
Note
移動元または移動先のリソース グループまたはサブスクリプションに読み取り専用ロックが存在する場合は、Azure リソースを移動できません。
変更されたリソース ID
リソースを移動すると、そのリソース ID は変更されます。 リソース ID の標準形式は /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}
です。 リソースを新しいリソース グループまたはサブスクリプションに移動するときは、そのパス内の 1 つ以上の値を変更します。
リソース ID を任意の場所で使用する場合は、その値を変更します。 たとえば、ポータル内にリソース ID を参照するカスタム ダッシュボードがある場合は、その値を更新します。 新しいリソース ID のために更新する必要があるスクリプトまたはテンプレートを探します。
リソースの移動前のチェック リスト
リソースを移動する前に、いくつかの重要な手順があります。 これらの条件を確認すると、エラーを回避できます。
移動元と移動先のサブスクリプションがアクティブである必要があります。 無効のアカウントを有効にするときに問題がある場合は、Azure サポート リクエストを作成してください。 問題の種類として [サブスクリプション管理] を選択します。
移動元と移動先のサブスクリプションは、同じ Microsoft Entra テナント内に存在している必要があります。 両方のサブスクリプションに同じテナント ID があることを調べるには、Azure CLI または PowerShell を使います。
az account show --subscription <your-source-subscription> --query tenantId az account show --subscription <your-destination-subscription> --query tenantId
移動元と移動先のサブスクリプションでテナント ID が一致しない場合は、次の方法を使って調整します。
クラウド ソリューション プロバイダー (CSP) パートナーとの間でリソースを移動するには、「サブスクライバーと CSP の間で Azure サブスクリプションを譲渡する」をご覧ください。
移動するリソースは、移動操作をサポートしているリソースである必要があります。 移動操作をサポートしているリソースの一覧については、「移動操作での Azure リソースの種類」をご覧ください。
一部のサービスには、リソースを移動するときに特定の制限または要件があります。 これらのサービス内のリソースを移動する前に、次の移動に関するガイダンスを確認してください。
- Azure Stack Hub を使用している場合は、グループ間でリソースを移動することはできません。
- Azure App Services
- Azure DevOps Services
- クラシック コンピューティング、ストレージ、仮想ネットワーク、Cloud Services のクラシック デプロイ モデル
- Cloud Services (延長サポート)
- ネットワーク
- Azure Recovery Services
- 仮想マシン
- Azure サブスクリプションを新しい管理グループに移動するには、「サブスクリプションの移動」を参照してください。
移動するリソースのリソース プロバイダーについて、移動先のサブスクリプションに登録する必要があります。 登録しないと、リソースの種類についてサブスクリプションへの登録が行われていないことを示すエラーが発生します。 このエラーは、リソースを新しいサブスクリプションに移動するときに、そのサブスクリプション内でそのリソースの種類を使用したことがない場合に発生する可能性があります。
登録状態を取得するには:
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
移動操作を始める前に、リソースの移動先のサブスクリプションのサブスクリプション クォータを調べます。 移動先サブスクリプションでの制限超過の原因になるクォータの引き上げを要求できるかどうかを確認します。 制限と引き上げ要求方法の詳しいガイダンスについては、「Azure サブスクリプションとサービスの制限、クォータ、制約」をご覧ください。
リソースを動かすアカウントには少なくとも次のアクセス許可を与える必要があります。
- 移動元のリソース グループ: Microsoft.Resources/subscriptions/resourceGroups/moveResources/action
- 移動先のリソース グループ: Microsoft.Resources/subscriptions/resourceGroups/write
アクティブな Azure ロールの割り当てを持つリソース (または、この同じ割り当てを持つ子リソース) を移動した場合、ロールの割り当ては移動せず、孤立します。 移動後にロールの割り当てを再度作成する必要があります。 孤立したロールの割り当ては自動的に削除されますが、移動の前に削除することをお勧めします。
ロールの割り当ての管理方法について詳しくは、「Azure ロールの割り当ての一覧を表示する」と「Azure ロールを割り当てる」をご覧ください。
サブスクリプション間で移動を行う場合は、リソースとその依存リソースを同じリソース グループ内に配置し、それらを一緒に移動する必要があります。 たとえば、マネージド ディスクを持つ仮想マシンでは、仮想マシン、Managed Disks、その他の依存リソースを一緒に移動する必要があります。
リソースを新しいサブスクリプションに移動する場合は、そのリソースに依存リソースがあるかどうか、およびそれらが同じリソース グループ内に置かれているかどうかを調べます。 リソースが同じリソース グループ内にない場合は、それらを同じリソース グループに結合できるかどうかを確認します。 できる場合、複数のリソース グループに対して 1 つの移動操作を使って、すべてのリソースを同じリソース グループに統合します。
詳細については、「サブスクリプション間での移動のシナリオ」を参照してください。
サブスクリプション間での移動のシナリオ
サブスクリプション間のリソースの移動は、3 ステップのプロセスです。 これらの手順を示すために、次の図は 1 つの依存リソースのみを示しています。
- 手順 1:依存リソースが別々のリソース グループに分散されている場合は、まずそれらを 1 つのリソース グループに移動します。
- 手順 2:リソースと依存リソースを、ソース サブスクリプションからターゲット サブスクリプションにまとめて移動します。
- 手順 3:必要に応じて、依存リソースをターゲット サブスクリプション内の別々のリソース グループに再配布します。
リソースを移動する
Azure Portal の使用
リソースを移動するには、それらのリソースが含まれているリソース グループを選択します。
移動するリソースを選択します。 すべてのリソースを移動するには、一覧の上部にあるチェック ボックスをオンにします。 または、リソースを個別に選択します。
[移動] ボタンを選択します。
このボタンにより、次の 3 つのオプションが提示されます。
- 新しいリソース グループに移動します。
- 新しいサブスクリプションに移動します。
- 新しいリージョンに移動します。 リージョンの変更については、「Azure Resource Mover を使用してリージョン間で (リソース グループから) リソースを移動する」をご覧ください。
リソースを新しいリソース グループまたはサブスクリプションに移動するかどうかを選びます。
移動元のリソース グループが自動的に設定されます。 移動先のリソース グループを指定します。 新しいサブスクリプションに移動する場合は、このオプションを指定します。 [次へ] を選択します。
ポータルでは、リソースを移動できると検証されます。 検証の完了を待ちます。
検証が正常に完了したら、 [次へ] を選択します。
そのリソースのツールとスクリプトを更新する必要があること確認します。 リソースの移動を開始するには、 [移動] を選択します。
- 移動が完了すると、Azure portal から通知されます。
Azure CLI の使用
検証
実際にリソースをリアルタイムで移動せずに移動シナリオをテストするには、az resource invoke-action
コマンドを使います。 このコマンドは、手順を実行せずに結果をモデル化する必要がある場合にのみ使ってください。 この操作を実行するには、移動元リソース グループ、移動先リソース グループ、移動する各リソースのリソース ID が必要です。
\"
を使って、要求の本文内の二重引用符をエスケープします。
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
パラメーターには、移動するリソース ID のスペース区切りリストを指定します。
次のコマンドでは、複数のリソースを新しいリソース グループに移動する方法を示します。 これらは、Bash ターミナルの Azure CLI または Azure PowerShell コンソールで動作します。 リソースを新しいサブスクリプションに移動するには、--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 の使用
検証
実際にリソースをリアルタイムで移動せずに移動シナリオをテストするには、Azure PowerShell で Invoke-AzResourceAction
コマンドを使います。 このコマンドは、手順を実行せずに結果をモデル化する必要がある場合にのみ使ってください。
$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 の使用
検証
実際にリソースをリアルタイムで移動せずに移動シナリオをテストするには、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))
検証が成功した場合、出力は表示されません。 ただし、検証が失敗した場合、リソースを移動できない理由を示すエラー メッセージが表示されます。
移動
既存のリソースを別のリソース グループまたはサブスクリプションに移動するには、Python の ResourceManagementClient.resources.begin_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]
resource_client.resources.begin_move_resources(
source_name,
{
"resources": resource_ids,
"target_resource_group": destination_resource_group.id
}
)
REST API を使用する
検証
validate move operation
操作では、実際にリソースを移動することなく、移動シナリオをテストします。 この操作を使って、移動が成功するかどうかを調べます。 移動要求を送信すると、検証が自動的に呼び出されます。 この操作は、手順を実行せずに結果をモデル化する必要がある場合にのみ使ってください。 この操作を実行するには、次の要件を満たす必要があります。
- ソース リソースグループの名前
- ターゲット リソースグループのリソース ID
- 移動する各リソースのリソース ID
- アカウントのアクセス トークン
次の要求を送信します。
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>"
}
よく寄せられる質問
通常は数分で終わるリソース移動操作が、ほぼ 1 時間実行され続けています。 何かエラーが発生しているのでしょうか?
リソースの移動は、さまざまなフェーズを含む複雑な操作です。 移動しようとしているリソースのリソース プロバイダー以外のものが関与している可能性があります。 リソース プロバイダー間の依存関係のため、Azure Resource Manager では移動操作が完了するまで 4 時間かかるものと想定されています。 この期間には、一時的な問題から復旧する時間が含まれます。 移動要求が 4 時間経過していない場合、操作は完了する試みを続け、成功する可能性があります。 この操作は、この時間中、一貫性の問題を回避するために、移動元と移動先のリソース グループをロックします。
リソースの移動中に、リソース グループが 4 時間ロックされるのはなぜですか?
移動操作の完了には 4 時間が見込まれています。 この操作は、この時間中、移動元と移動先のリソース グループが変更されないようにロックします。
移動要求には 2 つのフェーズがあります。 リソースは第 1 フェーズの間に移動され、移動されるリソースに依存するリソース プロバイダーには第 2 フェーズの間に通知されます。 リソース プロバイダーがいずれかのフェーズで失敗した場合、リソース グループが 4 時間にわたってロックされる可能性があります。 Resource Manager は、移動操作の期間中に失敗したステップを開始します。
リソースが 4 時間以内に移動しない場合、Resource Manager は両方のリソース グループのロックを解除します。 正常に移動したリソースは、移動先のリソース グループ内にあります。 移動に失敗したリソースは、移動元のリソース グループに残ります。
リソースの移動中に移動元と移動先のリソースグループがロックされると、どのような影響がありますか?
ロックにより、いずれのリソース グループも削除できなくなります。 ロックによって、各リソース グループ内で新しいリソースの作成、リソースの削除、リソースのプロパティの更新 (仮想マシンのサイズ変更など) もできなくなります。
次の図は、進行中の移動の一部であるリソース グループを削除しようとしたときに、Azure portal から返されるエラー メッセージを示しています。
前の図の仮想マシン リソースは、現在移動操作が行われているリソース グループ ("TestB") に属しています。 仮想マシンのプロパティ (サイズなど) を更新しようとすると、Azure portal からエラー メッセージが返されます。 このエラーは、移動中はリソース グループがロックされて、リソースが変更されないように保護されるために発生します。
さらに、リソースの移動中は、移動元と移動先のどちらのリソース グループも、他の移動操作に同時に参加することはできません。 たとえば、リソース グループ A からリソース グループ B にリソースを移動する場合、リソース グループ A とリソース グループ B のどちらも、同時に別の移動操作に関与することはできません。 リソース グループ C との間でリソースを同時に移動することはできません。この制限により、移動プロセスの間に複数の競合する操作がリソース グループをロックするのが防止されます。
"MissingMoveDependentResources" というエラー コードはどういう意味ですか?
リソースを移動する場合は、その依存リソースが、移動先のリソース グループまたはサブスクリプションに存在しているか、または移動要求に含まれている必要があります。 依存リソースがこの要件を満たしていない場合、MissingMoveDependentResources エラー コードを受け取ります。 このエラー メッセージでは、移動要求に含める必要がある依存リソースに関する詳細が提供されます。
たとえば、仮想マシンを移動には、3 つの異なるリソース プロバイダーと、7 つのリソースの種類を移動することが必要な場合があります。 それらのリソース プロバイダーとリソースの種類を次に示します。
Microsoft.Compute
- virtualMachines
- disks
Microsoft.Network
- networkInterfaces
- publicIPAddresses
- networkSecurityGroups
- virtualNetworks
Microsoft.Storage
- storageAccounts
もう 1 つの一般的な例として、その仮想ネットワークに関連付けられている他のいくつかのリソースを移動する必要がある仮想ネットワークの移動があります。 移動要求では、パブリック IP アドレス、ルート テーブル、仮想ネットワーク ゲートウェイ、ネットワーク セキュリティ グループ、その他のリソースなどの移動が必要になる場合があります。 仮想ネットワーク ゲートウェイとその仮想ネットワークは、個別に移動できないため、同じリソース グループに含まれる必要があります。
"RequestDisallowedByPolicy" というエラー コードはどういう意味ですか?
Resource Manager は、移動を試みる前に、移動要求を検証します。 この検証には、移動に関連するリソースで定義されているポリシーのチェックが含まれます。 たとえば、キー コンテナーを移動しようとしても、組織に移動先リソース グループへのキー コンテナーの作成を拒否するポリシーがある場合、検証は失敗します。 返されるエラー コードは RequestDisallowedByPolicy です。
ポリシーの詳細については、「Azureポリシーとは」を参照してください。
Azure 内の一部のリソースを移動できないのはなぜですか?
すべての Azure リソースで移動操作が許可されるわけではありません。
1 回の操作で移動できるリソースの数はいくつですか?
可能な場合は、大きな移動を異なる移動操作に分割します。 1 回の操作に含まれるリソースが 800 を超えると、Resource Manager から直ちにエラーが返されます。 ただし、800 個未満のリソースの移動でも、タイムアウトで失敗する可能性があります。
リソースが "成功" 状態ではないというエラーはどういう意味ですか?
リソースが成功状態でないために移動できないことを示すエラー メッセージを受け取る場合は、依存リソースが移動をブロックしているためである可能性があります。 通常、エラー コードは MoveCannotProceedWithResourcesNotInSucceededState です。
移動元または移動先のリソース グループに仮想ネットワークが含まれている場合は、移動の間、その仮想ネットワークに依存するすべてのリソースの状態が確認されます。 このチェックには、ネットワークに直接的および間接的に依存するリソースが含まれます。 リソースが成功状態でない場合、移動はブロックされます。 たとえば、成功状態を報告しない仮想ネットワークを使用する仮想マシンの場合、移動はブロックされます。 仮想マシンが移動されるリソースの 1 つでない場合であっても、移動はブロックされます。 また、仮想マシンが移動元または移動先のリソース グループ内にない場合であっても、移動はブロックされます。
この問題を解決するには、仮想ネットワークのないリソース グループにリソースを移動するか、サポートにお問い合わせください。
リソース グループを別のサブスクリプションに移動できますか?
いいえ。リソース グループを新しいサブスクリプションに移動することはできません。 ただし、リソース グループ内のすべてのリソースを別のサブスクリプションのリソース グループに移動できます。 タグ、ロールの割り当て、ポリシーなどの設定は、元のリソース グループから移動先リソース グループに自動的には転送されません。 これらの設定は、新しいリソース グループに人手で適用する必要があります。
次のステップ
移動操作をサポートする Azure リソースを確認するには、「リソースの移動操作サポート」を参照してください。