Mover recursos do Azure para um novo grupo de recursos ou assinatura

Este artigo mostra como mover recursos do Azure para outra assinatura do Azure ou outro grupo de recursos na mesma assinatura. Você pode usar o portal do Azure, Azure PowerShell, CLI do Azure ou a API REST para mover recursos.

O grupo de origem e o grupo de destino ficam bloqueados durante a operação de movimentação. As operações de gravação e exclusão são bloqueadas nos grupos de recursos até que a migração seja concluída. Esse bloqueio significa que você não pode adicionar, atualizar nem excluir os recursos nos grupos de recursos. Não significa que os recursos estão congelados. Por exemplo, se você mover um servidor lógico do Azure SQL, seus bancos de dados e outros recursos dependentes para um novo grupo de recursos ou assinatura, os aplicativos que usam os bancos de dados não terão nenhum tempo de inatividade. Eles ainda poderão ler e gravar no banco de dados. O bloqueio pode durar por um máximo de quatro horas, mas a maioria das mudanças é concluída em muito menos tempo.

Se sua movimentação exigir a configuração de novos recursos dependentes, você verá uma interrupção nesses serviços até que eles são reconfigurados.

Mover um recurso só o move para um novo grupo de recursos ou assinatura. Não altera o local do recurso.

ID do recurso alterada

Ao mover um recurso, você altera sua ID de recurso. O formato padrão para uma ID de recurso é /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}. Quando você move um recurso para um novo grupo de recursos ou assinatura, você altera um ou mais valores nesse caminho.

Se você usar a ID do recurso em qualquer lugar, será necessário alterar esse valor. Por exemplo, se você tiver um painel personalizado no portal que faça referência a uma ID de recurso, você precisará atualizar esse valor. Procure os scripts ou modelos que precisam ser atualizados para a nova ID de recurso.

Lista de verificação antes de mover recursos

Há algumas etapas importantes a serem executadas antes de mover um recurso. Ao verificar essas condições, é possível evitar erros.

  1. As assinaturas de origem e de destino devem estar ativas. Se você tiver problemas para habilitar uma conta que tenha sido desabilitada crie uma solicitação de Suporte do Azure. Selecione Subscription Management para o tipo de problema.

  2. As assinaturas de origem e destino devem existir no mesmo locatário do Microsoft Entra. Para verificar se as duas assinaturas têm a mesma ID de locatário, use o Azure PowerShell ou a CLI do Azure.

    Para o Azure PowerShell, use:

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

    Para a CLI do Azure, use:

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

    Se as IDs de locatário para as assinaturas de origem e de destino não forem iguais, use os métodos a seguir para reconciliá-las:

  3. Se você estiver tentando mover recursos para um parceiro CSP (Provedor de Soluções na Nuvem) ou de um parceiro CSP, consulte Transferir assinaturas do Azure entre assinantes e CSPs.

  4. Os recursos que você deseja mover devem oferecer suporte à operação de movimentação. Para obter uma lista dos recursos que dão suporte à movimentação, consulte Mover suporte de operação para recursos.

  5. Alguns serviços têm limitações ou requisitos específicos ao mover recursos. Se você estiver movendo qualquer um dos serviços a seguir, verifique essas diretrizes antes de mover.

  6. A assinatura de destino deve estar registrada para que o provedor de recursos do recurso seja movido. Se não estiver, você receberá um erro afirmando que a assinatura não está registrada para um tipo de recurso. Você pode ver esse erro ao mover um recurso para uma nova assinatura que nunca tenha sido usada com esse tipo de recurso.

    Para o PowerShell, use os seguintes comandos para obter o status do registro:

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

    Para registrar um provedor de recursos, use:

    Register-AzResourceProvider -ProviderNamespace Microsoft.Batch
    

    Para a CLI do Azure, use os seguintes comandos para obter o status do registro:

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

    Para registrar um provedor de recursos, use:

    az provider register --namespace Microsoft.Batch
    
  7. Antes de mover os recursos, verifique as cotas de assinatura da assinatura para a qual você está movendo os recursos. Se mover os recursos significa que a assinatura excederá seus limites, será necessário verificar se você pode solicitar um aumento na cota. Para obter uma lista de limites e como solicitar um aumento, consulte Limites, cotas e restrições em assinaturas e serviços do Azure.

  8. A conta de movimentação de recursos deve ter pelo menos as seguintes permissões:

    • Microsoft.Resources/subscriptions/resourceGroups/moveResources/action no grupo de recursos de origem.
    • Microsoft.Resources/subscriptions/resourceGroups/write no grupo de recursos de destino.
  9. Se você mover um recurso que tenha uma função do Azure atribuída diretamente ao recurso (ou a um recurso filho), a atribuição de função não será movida e se tornará órfã. Após a movimentação, você precisa recriar a atribuição de função. Eventualmente, a atribuição de função órfão é removida automaticamente, mas é recomendável remover a atribuição de função antes da movimentação.

    Para obter informações sobre como gerenciar atribuições de função, consulte Listar atribuições de função do Azure e Atribuir funções do Azure.

  10. Para uma movimentação entre assinaturas, o recurso e seus recursos dependentes devem estar localizados no mesmo grupo de recursos e devem ser movidos juntos. Por exemplo, uma VM com discos gerenciados exigiria que a VM e os discos gerenciados fossem movidos juntos, juntamente com outros recursos dependentes.

    Se você estiver movendo um recurso para uma nova assinatura, verifique se o recurso tem quaisquer recursos dependentes e se eles estão localizados no mesmo grupo de recursos. Se os recursos não estiverem no mesmo grupo de recursos, verifique se os recursos podem ser combinados no mesmo grupo de recursos. Nesse caso, coloque todos esses recursos no mesmo grupo de recursos usando uma operação de movimentação entre grupos de recursos.

    Para obter mais informações, consulte Cenário para mover entre assinaturas.

Cenário para mover entre assinaturas

Mover recursos de uma assinatura para outra é um processo de três etapas:

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

Para fins de ilustração, temos apenas um recurso dependente.

  • Etapa 1: Se os recursos dependentes forem distribuídos em grupos de recursos diferentes, primeiro mova-os para um grupo de recursos.
  • Etapa 2: Mova o recurso e os recursos dependentes juntos da assinatura de origem para a assinatura de destino.
  • Etapa 3: Opcionalmente, redistribua os recursos dependentes para grupos de recursos diferentes na assinatura de destino.

Usar o portal

Para mover recursos, selecione o grupo de recursos que contém esses recursos.

Selecionar os recursos que deseja mover. Para mover todos os recursos, marque a caixa de seleção na parte superior da lista. Ou selecione recursos individualmente.

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

Selecione o botão Mover.

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

Esse botão oferece três opções:

Selecione se você está movendo os recursos para um novo grupo de recursos ou uma nova assinatura.

O grupo de recursos de origem é definido automaticamente. Especifique o grupo de recursos de destino. Se você estiver migrando para uma nova assinatura, especifique também a assinatura. Selecione Avançar.

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

O portal valida que os recursos podem ser movidos. Aguarde a conclusão da validação.

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

Quando a validação for concluída com êxito, selecione Avançar.

Confirme que você precisa atualizar ferramentas e scripts para esses recursos. Para começar a mover os recursos, selecione Mover.

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

Quando a movimentação for concluída, você será notificado sobre o resultado.

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

Usar PowerShell do Azure

Validar

Para testar seu cenário de movimentação sem realmente mover os recursos, use o comando Invoke-AzResourceAction. Use esse comando somente quando precisar predeterminar os resultados.

$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
   }

Se a validação for aprovada, você não verá nenhuma saída.

Se a validação falhar, você verá uma mensagem de erro que descreve por que os recursos não podem ser movidos.

Mover

Para mover os recursos existentes para outro grupo de recursos ou assinatura, use o comando Move-AzResource. O exemplo a seguir mostra como mover diversos recursos para um novo grupo de recursos.

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

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

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

Para mover para uma nova assinatura, inclua um valor para o parâmetro DestinationSubscriptionId.

Usar a CLI do Azure

Validar

Para testar seu cenário de movimentação sem realmente mover os recursos, use o comando az resource invoke-action. Use esse comando somente quando precisar predeterminar os resultados. Para executar essa operação, você precisa de:

  • ID do recurso do grupo de recursos de origem
  • ID do recurso do grupo de recursos de destino
  • ID do recurso de cada recurso para mover

No corpo da solicitação, use \" para remover as aspas duplas.

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

Se a validação for aprovada, você verá:

{} Finished .. 

Se a validação falhar, você verá uma mensagem de erro que descreve por que os recursos não podem ser movidos.

Mover

Para mover os recursos existentes para outro grupo de recursos ou assinatura, use o comando az resource move. No parâmetro --ids, forneça uma lista separada por espaços das IDs do recurso que deseja mover.

O exemplo a seguir mostra como mover diversos recursos para um novo grupo de recursos. Funciona ao usar a CLI do Azure em um terminal 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

O exemplo a seguir mostra como executar os mesmos comandos em um console do 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

Para mover para uma nova assinatura, forneça o parâmetro --destination-subscription-id.

Como usar o Python

Validar

Para testar seu cenário de movimentação sem realmente mover os recursos, use o método ResourceManagementClient.resources.begin_validate_move_resources. Use esse método somente quando precisar predeterminar os resultados.

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))

Se a validação for aprovada, você não verá nenhuma saída.

Se a validação falhar, você verá uma mensagem de erro que descreve por que os recursos não podem ser movidos.

Mover

Para mover os recursos existentes para outro grupo de recursos ou assinatura, use o método ResourceManagementClient.resources.begin_move_resources. O exemplo a seguir mostra como mover diversos recursos para um novo grupo de recursos.

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
    }
)

Usar a API REST

Validar

A operação validate move permite que você teste seu cenário de movimentação sem realmente mover os recursos. Use essa operação para verificar se a movimentação será realizada com sucesso. A validação é chamada automaticamente quando você envia uma solicitação de movimentação. Use essa operação somente quando precisar predeterminar os resultados. Para executar essa operação, você precisa de:

  • Nome do grupo de recursos de origem
  • ID do recurso do grupo de recursos de destino
  • ID do recurso de cada recurso para mover
  • O token de acesso para sua conta

Envie a seguinte solicitação:

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

Com um corpo de solicitação:

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

Se a solicitação estiver formatada corretamente, a operação retornará:

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

O código de status 202 indica que a solicitação de validação foi aceita, mas ainda não determinou se a operação de movimentação será bem-sucedida. O valor location contém um URL que você usa para verificar o status da operação de longa duração.

Para verificar o status, envie a seguinte solicitação:

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

Enquanto a operação ainda está em execução, você continua recebendo o código de status 202. Aguarde o número de segundos indicado no valor retry-after antes de tentar novamente. Se a operação de movimentação é validado com êxito, você receberá o código de 204 status. Se a validação da movimentação falhar, você receberá uma mensagem de erro, como:

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

Mover

Para mover os recursos existentes para outro grupo de recursos ou assinatura, use o comando Mover recursos.

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

No corpo da solicitação, especifique o grupo de recursos de destino e os recursos para mover.

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

Perguntas frequentes

Pergunta: Minha operação de movimentação de recursos, que geralmente leva alguns minutos, está em execução por quase uma hora. Há algo de errado?

Mover um recurso é uma operação complexa que tem diferentes fases. Ela pode envolver mais do que apenas o provedor de recursos do recurso que você está tentando mover. Devido às dependências entre os provedores de recursos, Azure Resource Manager reserva 4 horas para a conclusão da operação. Esse período de tempo dá aos provedores de recursos uma chance de se recuperar de problemas transitórios. Se sua solicitação de movimentação estiver dentro do período de quatro horas, a operação continuará tentando ser concluída e ainda poderá ser bem sucedido. Os grupos de recursos de origem e de destino são bloqueados durante esse tempo para evitar problemas de consistência.

Pergunta: Por que meu grupo de recursos está bloqueado por quatro horas durante a movimentação de recursos?

Uma solicitação de movimentação tem no máximo quatro horas para ser concluída. Para evitar modificações nos recursos que estão sendo movidos, os grupos de recursos de origem e de destino são bloqueados durante a movimentação do recurso.

A solicitação de movimentação é composta por duas fases. Na primeira fase, o recurso é movido. Na segunda fase, as notificações são enviadas para outros provedores de recursos que dependem do recurso que está sendo movido. Um grupo de recursos pode ser bloqueado pelas quatro horas quando um provedor de recursos falhar em qualquer fase. Durante o tempo permitido, o Gerenciador de recursos repete a etapa com falha.

Se um recurso não puder ser movido dentro de quatro horas, o Gerenciador de recursos desbloqueará os dois grupos de recursos. Os recursos que foram movidos com êxito estão no grupo de recursos de destino. Os recursos que não foram movidos são deixados no grupo de recursos de origem.

Pergunta: Quais são as implicações dos grupos de recursos de origem e de destino bloqueados durante a movimentação de recursos?

O bloqueio impede que você exclua um dos grupos de recursos, criando um novo recurso em qualquer grupo de recursos ou excluindo qualquer um dos recursos envolvidos na movimentação.

A imagem a seguir mostra uma mensagem de erro do portal do Azure quando um usuário tenta excluir um grupo de recursos que faz parte de uma movimentação em andamento.

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

Pergunta: O que significa o código de erro "MissingMoveDependentResources"?

Ao mover um recurso, seus recursos dependentes devem existir no grupo de recursos de destino ou na assinatura ou ser incluídos na solicitação de movimentação. O código de erro MissingMoveDependentResources é exibido quando um recurso dependente não atende a esse requisito. A mensagem de erro tem detalhes sobre o recurso dependente que precisa ser incluído na solicitação de movimentação.

Por exemplo, mover uma máquina virtual pode exigir a movimentação de sete tipos de recursos com três provedores de recursos diferentes. Esses provedores e tipos de recursos são:

  • Microsoft.Compute

    • virtualMachines
    • disks
  • Microsoft.Network

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

    • storageAccounts

Outro exemplo comum envolve a movimentação de uma rede virtual. Talvez seja necessário mover vários outros recursos associados a essa rede virtual. A solicitação de movimentação pode exigir a movimentação de endereços IP públicos, tabelas de rotas, gateways de rede virtual, grupos de segurança de rede e outros. Em geral, um gateway de rede virtual deve estar sempre no mesmo grupo de recursos que sua rede virtual, eles não podem ser movidos separadamente.

Pergunta: o que significa o código de erro "RequestDisallowedByPolicy"?

O Resource Manager valida sua solicitação de movimentação antes de tentar a movimentação. Essa validação inclui a verificação de políticas definidas nos recursos envolvidos na movimentação. Por exemplo, se você estiver tentando mover um cofre de chaves, mas sua organização tiver uma política para negar a criação de um cofre de chaves no grupo de recursos de destino, a validação falhará e a movimentação será bloqueada. O código de erro retornado é RequestDisallowedByPolicy.

Para saber mais sobre políticas, veja O que é o Azure Policy?.

Pergunta: Por que não posso mover alguns recursos no Azure?

No momento, nem todos os recursos no Azure dão suporte à movimentação. Para obter uma lista dos recursos que dão suporte à movimentação, consulte Suporte à operação de movimentação para recursos.

Pergunta: Quantos recursos posso mover em uma única operação?

Quando possível, quebre grandes movimentações em operações de movimentação separadas. O Resource Manager imediatamente retornará um erro quando houver mais de 800 recursos em uma única operação. No entanto, mover menos de 800 recursos também pode falhar por tempo limite.

Pergunta: Qual é o significado do erro de que um recurso não está no estado bem-sucedido?

Quando você recebe uma mensagem de erro que indica que um recurso não pode ser movido porque ele não está em um estado bem-sucedido, ele pode, na verdade, ser um recurso dependente que está bloqueando a movimentação. Normalmente, o código de erro é MoveCannotProceedWithResourcesNotInSucceededState.

Se o grupo de recursos de origem ou destino contiver uma rede virtual, os estados de todos os recursos dependentes da rede virtual serão verificados durante a movimentação. A verificação inclui esses recursos direta e indiretamente dependentes da rede virtual. Se qualquer um desses recursos estiver em um estado de falha, a movimentação será bloqueada. Por exemplo, se uma máquina virtual que usa a rede virtual tiver falhado, a movimentação será bloqueada. A movimentação é bloqueada mesmo quando a máquina virtual não for um dos recursos que estão sendo movidos, e não estiver em um dos grupos de recursos para a movimentação.

Quando você receber esse erro, você terá duas opções. Mova seus recursos para um grupo de recursos que não possui uma rede virtual, ou entre em contato com o suporte.

Próximas etapas

Para obter uma lista dos recursos que dão suporte à movimentação, consulte Suporte à operação de movimentação para recursos.