Поделиться через


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

В этой статье объясняется, как перемещать ресурсы Azure между группами ресурсов в одной подписке или в разных подписках. Если перемещение включает разные подписки, обе подписки должны быть частью одного клиента Идентификатора Microsoft Entra. Для перемещения ресурсов можно использовать такие средства, как портал Azure, Azure PowerShell, Azure CLI, REST API или Python.

Во время операции перемещения группы исходных и целевых ресурсов блокируются, что означает, что вы не можете создавать, удалять или обновлять ресурсы в этих группах ресурсов во время выполнения перемещения. Однако существующие ресурсы остаются полностью операционными. Например, если вы перемещаете виртуальную машину из одной группы ресурсов в другую, ее свойства (например, размер) нельзя изменить во время перемещения. Несмотря на это, виртуальная машина продолжает работать обычно, и службы, использующие ее, не испытывают дополнительных простоев. Блокировка может длиться до четырех часов, большинство ходов завершается быстрее, и блокировка удаляется соответствующим образом.

В запросе перемещения должны быть указаны только ресурсы верхнего уровня (родителя). Дочерние ресурсы автоматически перемещаются вместе с родительскими ресурсами, но не могут быть перемещены независимо. Например, родительский ресурс может быть перемещен и его дочерний ресурс 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) или из него, дополнительные сведения см. в статье "Передача подписок Azure между подписчиками и поставщиками служб csps".

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

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

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

    Чтобы получить состояние регистрации:

    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 (Сценарий перемещения между подписками)

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

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

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

Перемещение ресурсов

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

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

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

    Снимок экрана: портал Azure с выбором ресурсов для перемещения.

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

    Снимок экрана: портал Azure с кнопкой

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

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

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

Снимок экрана: портал Azure, где пользователь указывает целевую группу ресурсов для операции перемещения.

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

Снимок экрана: портал Azure с процессом проверки для операции перемещения.

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

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

Снимок экрана: портал Azure, где пользователь признает необходимость обновления средств и скриптов перед началом операции перемещения.

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

Снимок экрана: портал Azure отображение уведомления с результатами операции перемещения.

Использование командной строки 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 или в консоли 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

Проверить

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

Проверить

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