Перемещение ресурсов Azure в новую группу ресурсов или подписку

В этой статье показано, как переместить ресурсы Azure в другую подписку Azure или другую группу ресурсов в той же подписке. Для перемещения ресурса можно использовать портал Azure, Azure PowerShell, интерфейс командной строки Azure или REST API.

Группа источника и группа назначения блокируются на время операции перемещения. Операции записи и удаления для групп ресурсов блокируются до завершения перемещения. Эта блокировка означает, что ресурсы в группах ресурсов невозможно добавить, обновить или удалить. Но она не означает, что эти ресурсы зафиксированы. Например, если переместить логический сервер Azure SQL, его базы данных и другие зависимые ресурсы в новую группу ресурсов или подписку, то приложения, использующие эти базы данных, не будут простаивать. Они по-прежнему смогут осуществлять чтение и запись данных в базе данных. Блокировка может длиться не более четырех часов, но большинство перемещений занимают гораздо меньше времени.

Если для вашего перемещения требуется настройка новых зависимых ресурсов, вы столкнетесь с перебоями в работе этих служб до их перенастройки.

Ресурс всего лишь перемещается в новую группу ресурсов или подписку. Расположение ресурса изменить невозможно.

Изменение идентификатора ресурса

При перемещении ресурса изменяется его идентификатор. Стандартный формат для идентификатора ресурса — /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}. При перемещении ресурса в новую группу ресурсов или подписку вы изменяете одно или несколько значений в этом пути.

Если этот идентификатор ресурса используется где-либо, это значение необходимо изменить. Например, если на портале есть настраиваемая панель мониторинга, которая ссылается на идентификатор ресурса, необходимо обновить это значение. Найдите скрипты или шаблоны, которые необходимо обновить для нового идентификатора ресурса.

Рекомендации перед перемещением ресурсов

Вот некоторые важные особенности, которые следует учитывать перед перемещением ресурса. Проверив эти условия, можно избежать ошибок.

  1. Исходная и целевая подписки должны быть активными. Если у вас возникла проблема при включении учетной записи, которая была отключена, создайте запрос на поддержку Azure. Выберите тип проблемы Управление подпиской.

  2. Исходные и целевые подписки должны существовать в одном клиенте Microsoft Entra. Используя Azure PowerShell или командную строку Azure, можно убедиться, что обе подписки имеют один и тот же идентификатор клиента.

    Для Azure PowerShell:

    (Get-AzSubscription -SubscriptionName <your-source-subscription>).TenantId
    (Get-AzSubscription -SubscriptionName <your-destination-subscription>).TenantId
    

    Для интерфейса командной строки Azure:

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

    Если идентификаторы клиентов исходных и целевых подписок не совпадают, используйте следующие методы для выверки идентификаторов клиентов:

  3. Если вы хотите перенести ресурсы партнеру поставщика облачных решений или из него, см. статью Перенос подписок Azure между подписчиками и CSP.

  4. Ресурсы, которые требуется переместить, должны поддерживать операцию перемещения. Список ресурсов, поддерживающих перемещение, см. в статье Поддержка операций перемещения для ресурсов.

  5. При перемещении ресурсов некоторые службы имеют определенные ограничения или требования. Если вы перемещаете одну из следующих служб, то перед перемещением сверьтесь с этим руководством.

  6. Подписка назначения должна быть зарегистрирована для перемещаемого поставщика ресурсов. В противном случае отображается сообщение о том, что подписка не зарегистрирована для типа ресурса. Эта ошибка может возникнуть при перемещении ресурса в новую подписку, которая никогда не использовалась с этим типом ресурса.

    Для PowerShell используйте следующие команды, чтобы получить состояние регистрации:

    Set-AzContext -Subscription <destination-subscription-name-or-id>
    Get-AzResourceProvider -ListAvailable | Select-Object ProviderNamespace, RegistrationState
    

    Чтобы зарегистрировать поставщик ресурсов, воспользуйтесь командой:

    Register-AzResourceProvider -ProviderNamespace Microsoft.Batch
    

    Для Azure CLI используйте следующие команды, чтобы получить состояние регистрации:

    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
    
  7. Прежде чем перемещать ресурсы, проверьте квоты подписки, в которую вы перемещаете ресурсы. Если при перемещении ресурсов квота подписки будет превышена, возможно, вам придется запросить увеличение квоты. Полный список ограничений и способы запросить увеличение квоты см. в статье Подписка Azure, границы, квоты и ограничения службы.

  8. Учетная запись, используемая для перемещения ресурсов, должна предоставлять по крайней мере следующие разрешения:

    • Microsoft.Resources/subscriptions/resourceGroups/moveResources/action для исходной группы ресурсов;
    • Microsoft.Resources/subscriptions/resourceGroups/write для целевой группы ресурсов.
  9. При перемещении ресурса, для которого роль Azure назначена непосредственно самому ресурсу (или дочернему ресурсу), назначение ролей не перемещается и теряется. После перемещения необходимо повторно создать назначение ролей. Со временем потерянное назначение ролей удаляется автоматически, однако мы рекомендуем удалить назначение ролей перед перемещением.

    Сведения об управлении назначениями ролей см. в разделах Вывод списка назначений ролей Azure и Назначение ролей Azure.

  10. Для перемещения между подписками ресурс и его зависимые ресурсы должны находиться в одной группе ресурсов, а также они должны перемещаться вместе. Например, виртуальная машина с управляемыми дисками потребует перемещения вместе с управляемыми дисками и другими зависимыми ресурсами.

    При перемещении ресурса в новую подписку, проверьте, имеет ли ресурс зависимые ресурсы, и находятся ли они в той же группе ресурсов. Если ресурсы находятся в разных группах ресурсов, проверьте, можно ли объединить эти ресурсы в одну группу ресурсов. Если можно, перенесите все эти ресурсы в одну группу ресурсов, используя операцию перемещения в группах ресурсов.

    Дополнительные сведения см. в разделе Сценарий перемещения между подписками.

Scenario for move across subscriptions (Сценарий перемещения между подписками)

Перемещение ресурсов из одной подписки в другую включает три этапа.

Diagram that shows the three-step process of moving resources across subscriptions.

Для наглядности мы используем только один зависимый ресурс.

  • Шаг 1. Если зависимые ресурсы распределены по разным группам ресурсов, сначала переместите их в одну группу ресурсов.
  • Шаг 2. Совместно переместите ресурс и зависимые ресурсы из исходной подписки в целевую.
  • Step 3: При необходимости перераспределите зависимые ресурсы по разным группам ресурсов в целевой подписке.

Использование портала

Чтобы переместить ресурсы, выберите группу ресурсов, которая содержит эти ресурсы.

Выбор ресурсов, которые требуется переместить. Чтобы переместить все ресурсы, установите флажок в верхней части списка. Или выберите ресурсы по отдельности.

Screenshot of the Azure portal showing the selection of resources to move.

Нажмите кнопку Переместить.

Screenshot of the Azure portal displaying the Move button with three options.

Эта кнопка предоставляет выбор из трех вариантов:

Укажите, куда будут перемещены ресурсы: в новую группу ресурсов или новую подписку.

Исходная группа ресурсов устанавливается автоматически. Выберите целевую группу ресурсов. Если вы перемещаете ресурсы в новую подписку, также укажите подписку. Выберите Далее.

Screenshot of the Azure portal where the user specifies the destination resource group for the move operation.

Портал проверит возможность перемещения ресурсов. Дождитесь завершения проверки.

Screenshot of the Azure portal showing the validation process for the move operation.

После успешного завершения проверки нажмите кнопку Далее.

Подтвердите обновление инструментов и сценариев для этих ресурсов. Чтобы начать перемещение ресурсов, выберите Переместить.

Screenshot of the Azure portal where the user acknowledges the need to update tools and scripts before starting the move operation.

После ее завершения перемещения отобразится уведомление о результате.

Screenshot of the Azure portal displaying a notification with the results of the move operation.

Использование 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.

Использование Azure CLI

Проверить

Чтобы протестировать сценарий перемещения без фактического перемещения ресурсов, используйте команду 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 укажите перемещаемый список идентификаторов ресурсов с разделителями-пробелами.

В следующем примере показано, как переместить несколько ресурсов в новую группу ресурсов. Он работает при использовании Azure CLI в терминале Bash .

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

В следующем примере показано, как выполнять те же команды в консоли PowerShell .

$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

Для перемещения в новую подписку нужно указать параметр --destination-subscription-id.

Использование 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))

Если проверка пройдет успешно, выходные данные отображаться не будут.

Если проверка завершится неудачно, отобразится сообщение об ошибке с описанием причин, по которым переместить ресурсы невозможно.

Переместить

Чтобы переместить существующие ресурсы в другую группу ресурсов или подписку, используйте метод 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

Проверить

Операция проверки перемещения позволяет проверить сценарий перемещения без фактического перемещения ресурсов. Используйте эту операцию, чтобы проверить, будет ли перемещение успешным. Проверка вызывается автоматически при отправке запроса на перемещение. Используйте эту операцию только в том случае, если необходимо предварительно определить результаты. Для запуска этой операции вам необходимо:

  • Имя исходной группы ресурсов
  • Идентификатор ресурса целевой группы ресурсов
  • Идентификатор каждого перемещаемого ресурса
  • Маркер доступа для вашей учетной записи

Отправьте следующий запрос:

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>"...}}

Переместить

Чтобы переместить существующие ресурсы в другую группу ресурсов или подписку, используйте операцию Перемещение ресурсов.

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 выделяет до 4 часов для завершения операции. Этот период времени дает поставщикам ресурсов возможность восстановиться после возникновения временных проблем. Если ожидание обработки вашего запроса на перемещение находится в пределах этого 4-часового периода, операция продолжает осуществлять попытки завершиться и, возможно, будет выполнена. В течение этого времени исходная и целевая группы ресурсов блокируются во избежание возникновения проблем с согласованностью.

Вопрос. Почему группа ресурсов блокируется на четыре часа во время перемещения ресурса?

Для выполнения запроса на перемещение выделяется не более четырех часов. Чтобы не допустить изменение перемещаемых ресурсов, во время перемещения ресурса исходная и целевая группы ресурсов блокируются.

Выполнение запроса на перемещение состоит из двух этапов. На первом этапе перемещается ресурс. На втором этапе отправляются уведомления другим поставщикам ресурсов, которые зависят от перемещаемого ресурса. Группа ресурсов может быть заблокирована на все четыре часа, если поставщику ресурсов не удается завершить какой-либо этап. В течение выделенного времени Resource Manager попытается завершить этап, на котором возникла ошибка.

Если ресурс не удается переместить в течение четырех часов, Resource Manager разблокирует обе группы ресурсов. Успешно перемещенные ресурсы будут находиться в целевой группе ресурсов. Ресурсы, которые не удалось переместить, остаются в исходной группе ресурсов.

Вопрос. Каковы последствия блокировки исходных и целевых групп ресурсов при перемещении ресурса?

Блокировка препятствует удалению какой-либо из этих групп ресурсов, созданию нового ресурса в любой из них или удалению ресурсов, участвующих в перемещении.

На следующем рисунке показано сообщение об ошибке на портале Azure, возникающей, когда пользователь пытается удалить группу ресурсов, которая участвует в текущем перемещении.

Screenshot of the Azure portal showing an error message when trying to delete a resource group involved in an ongoing move operation.

Вопрос. Что означает код ошибки "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.

Если исходная или целевая группа ресурсов содержит виртуальную сеть, во время перемещения будут проверяться состояния всех зависимых ресурсов для виртуальной сети. Эта проверка включает ресурсы прямо и косвенно, в зависимости от виртуальной сети. Если какие-либо из этих ресурсов находятся в состоянии сбоя, перемещение блокируется. Например, если виртуальная машина, использующая виртуальную сеть, завершилась сбоем, перемещение блокируется. Перемещение блокируется, даже если виртуальная машина не является одним из перемещаемых ресурсов и не находится в одной из групп ресурсов для перемещения.

При возникновении этой ошибки у вас есть два варианта. Либо переместите ресурсы в группу ресурсов без виртуальной сети, либо обратитесь в службу поддержки.

Следующие шаги

Список ресурсов, поддерживающих перемещение, см. в статье Поддержка операций перемещения для ресурсов.