Mover recursos do Azure para um novo grupo de recursos ou subscrição

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

Tanto o grupo de origem como o grupo de destino estão bloqueados durante a operação de movimentação. As operações de escrita e de eliminação ficam bloqueadas nos grupos de recursos até que a movimentação esteja concluída. Este bloqueio significa que não pode adicionar, atualizar ou eliminar recursos nos grupos de recursos. Não significa que os recursos estão bloqueados. Por exemplo, se mover um servidor lógico do SQL do Azure, as respetivas bases de dados e outros recursos dependentes para um novo grupo de recursos ou subscrição, as aplicações que utilizam as bases de dados não sofrem tempo de inatividade. Continuam a poder ler e escrever nas bases de dados. O bloqueio pode durar, no máximo, quatro horas, mas a maioria das movimentações fica concluída em muito menos tempo.

Se a movimentação implicar a configuração de novos recursos dependentes, irá sofrer uma interrupção nesses serviços até serem reconfigurados.

Mover um recurso apenas o move para um grupo de recursos ou uma subscrição novos. Não altera a localização do recurso.

ID do recurso alterado

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}. Ao mover um recurso para um novo grupo de recursos ou assinatura, você altera um ou mais valores nesse caminho.

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

Lista de verificação antes de mover recursos

Antes de mover um recurso, é necessário realizar alguns passos importantes. Ao confirmar estas condições, pode evitar erros.

  1. As subscrições de origem e de destino têm de estar ativas. Se tiver problemas ao ativar uma conta que foi desativada, crie um pedido de suporte do Azure. Selecione Gestão de Subscrições como o tipo de problema.

  2. As assinaturas de origem e destino devem existir dentro do mesmo locatário do Microsoft Entra. Para verificar se ambas as subscrições têm o mesmo ID do inquilino, utilize o Azure PowerShell ou a CLI do Azure.

    No Azure PowerShell, utilize:

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

    Para a CLI do Azure, utilize:

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

    Se os IDs dos inquilinos das subscrições de origem e destino não forem os mesmos, utilize os seguintes métodos para reconciliar os IDs dos inquilinos:

  3. Se estiver a tentar mover recursos de ou para um parceiro do Fornecedor de Soluções na Nuvem (CSP), consulte Transferir subscrições do Azure entre subscritores e CSPs.

  4. Os recursos que quer mover devem suportar a operação de movimentação. Para obter uma lista dos recursos que suportam a movimentação, consulte Mover suporte de operação para recursos.

  5. Alguns serviços têm limitações ou requisitos específicos durante a movimentação de recursos. Se mover algum dos seguintes serviços, veja a documentação de orientação antes de os mover.

  6. A subscrição de destino tem de estar registada no fornecedor de recursos do recurso a ser movido. Caso contrário, você receberá um erro informando que a assinatura não está registrada para um tipo de recurso. Poderá ver este erro ao mover um recurso para uma nova subscrição, mas em que esta nunca foi utilizada com esse tipo de recurso.

    Para o PowerShell, utilize os seguintes comandos para obter o estado do registo:

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

    Para registar um fornecedor de recursos, utilize:

    Register-AzResourceProvider -ProviderNamespace Microsoft.Batch
    

    Para a CLI do Azure, utilize os seguintes comandos para obter o estado do registo:

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

    Para registar um fornecedor de recursos, utilize:

    az provider register --namespace Microsoft.Batch
    
  7. Antes de fazer a movimentação, verifique as quotas da subscrição para a qual está a mover os recursos. Se a movimentação dos recursos significar que a subscrição vai exceder os limites, tem de descobrir se pode pedir um aumento da quota. Para obter uma lista de limites e como pedir um aumento, veja Subscrição do Azure e limites, quotas e restrições do serviço.

  8. A conta que move os 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 mover um recurso que tenha uma função do Azure atribuída diretamente ao recurso (ou a um recurso subordinado), a atribuição de funções não é movida e torna-se órfã. Depois da mudança, terá de recriar a atribuição de funções. Eventualmente, a atribuição de funções órfã é removida de forma automática, mas recomendamos que remova a atribuição de funções antes da movimentação.

    Para obter informações sobre como gerir as atribuições de funções, veja Listar atribuições de funções do Azure e Atribuir funções do Azure.

  10. Para uma movimentação entre subscrições, o recurso e os respetivos recursos dependentes devem estar localizados no mesmo grupo de recursos e ser movidos em conjunto. Por exemplo, uma VM com discos geridos exigiria que a VM e os discos geridos fossem movidos em conjunto, juntamente com outros recursos dependentes.

    Se estiver a mover um recurso para uma nova subscrição, verifique se o recurso tem algum recurso dependente e se estão localizados no mesmo grupo de recursos. Se os recursos não estiverem no mesmo grupo de recursos, verifique se podem ser combinados no mesmo grupo de recursos. Em caso afirmativo, desloque todos estes recursos para o mesmo grupo de recursos ao utilizar uma operação de movimentação entre grupos de recursos.

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

Cenário para mover entre subscrições

Mover recursos de uma subscrição para outra é um processo de três passos:

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

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

  • Etapa 1: Se os recursos dependentes forem distribuídos em diferentes grupos de recursos, 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 diferentes grupos de recursos dentro da assinatura de destino.

Utilizar o portal

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

Selecione os recursos que deseja mover. Para mover todos os recursos, marque a caixa de seleção na parte superior da lista. Em alternativa, selecione os 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.

Este botão dá-lhe três opções:

Selecione se está a mover os recursos para um novo grupo de recursos ou uma nova subscrição.

O grupo de recursos de origem é definido automaticamente. Especifique o grupo de recursos de destino. Se estiver a mover para uma nova subscrição, especifique também a subscrição. Selecione Seguinte.

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 que a validação seja concluída.

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

Quando a validação terminar com sucesso, selecione Seguinte.

Confirme que precisa de atualizar as ferramentas e os scripts para estes 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 estiver concluída, recebe uma notificação do resultado.

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

Utilizar o Azure PowerShell

Validar

Para testar seu cenário de movimentação sem realmente mover os recursos, use o comando Invoke-AzResourceAction . Utilize este comando apenas quando precisar de determinar antecipadamente 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, verá uma mensagem de erro a descrever o motivo pelo qual os recursos não podem ser movidos.

Mover

Para mover recursos existentes para outro grupo de recursos ou assinatura, use o comando Move-AzResource . O exemplo seguinte mostra como mover vários 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 DestinationSubscriptionId parâmetro.

Utilizar 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 . Utilize este comando apenas quando precisar de determinar antecipadamente os resultados. Para executar esta operação, você precisa:

  • ID do recurso do grupo de recursos de origem
  • ID do recurso do grupo de recursos de destino
  • ID do recurso de cada recurso a ser movido

No corpo da solicitação, use \" para evitar 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, verá:

{} Finished .. 

Se a validação falhar, verá uma mensagem de erro a descrever o motivo pelo qual os recursos não podem ser movidos.

Mover

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

O exemplo seguinte mostra como mover vários recursos para um novo grupo de recursos. Ele 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 próximo exemplo 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 --destination-subscription-id parâmetro.

Utilizar 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, verá uma mensagem de erro a descrever o motivo pelo qual os recursos não podem ser movidos.

Mover

Para mover recursos existentes para outro grupo de recursos ou assinatura, use o método ResourceManagementClient.resources.begin_move_resources . O exemplo seguinte mostra como mover vários 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
    }
)

Utilizar a API REST

Validar

A operação validar movimentação permite testar seu cenário de movimentação sem realmente mover os recursos. Use esta operação para verificar se a mudança será bem-sucedida. A validação é chamada automaticamente quando você envia uma solicitação de movimentação. Use esta operação somente quando precisar predeterminar os resultados. Para executar esta operação, você precisa:

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

Envie o seguinte pedido:

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 location valor contém uma URL que você usa para verificar o status da operação de longa execuçã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 a receber o código de status 202. Aguarde o retry-after número de segundos indicado no valor antes de tentar novamente. Se a operação de movimentação for validada com êxito, você receberá o código de status 204. Se a validação da movimentação falhar, você receberá uma mensagem de erro, como:

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

Mover

Para mover recursos existentes para outro grupo de recursos ou assinatura, use a operação 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, você especifica o grupo de recursos de destino e os recursos a serem movidos.

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

Perguntas mais frequentes

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

A movimentação de recursos é uma operação complexa e que tem diferentes fases. Pode envolver mais do que apenas o fornecedor do recurso que está a tentar mover. Devido às dependências entre os fornecedores de recursos, o Azure Resource Manager concede uma tolerância de quatro horas para que a operação seja concluída. Este período de tempo dá aos fornecedores de recursos uma possibilidade de recuperar de problemas transitórios. Se o pedido de movimentação estiver dentro do período de quatro horas, a operação continuará a tentar concluir e poderá ser bem-sucedida. Durante este tempo, os grupos de recursos de origem e de destino estão bloqueados para evitar problemas de consistência.

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

É dado um máximo de quatro horas para a conclusão dos pedidos de movimentação. Para evitar que as modificações aos recursos sejam movidas, tanto os grupos de recursos de origem como de destino são bloqueados durante a movimentação.

Os pedidos de movimentação têm duas fases. Na primeira fase, o recurso é movido. Na segunda, são enviadas notificações para os outros fornecedores de recursos que dependem do recurso que está a ser movido. Quando um fornecedor de recursos falha uma das fases, o grupo de recursos pode ficar bloqueado durante as quatro horas. Durante o período permitido, o Resource Manager repete o passo mal-sucedido.

Se não for possível mover um recurso dentro das quatro horas, o Resource Manager desbloqueia ambos os grupos de recursos. Os recursos que foram movidos estão no grupo de recursos de destino. Os recursos que não conseguiram mover são deixados no grupo de recursos de origem.

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

O bloqueio impede-o de eliminar qualquer um dos grupos de recursos, criar um novo recurso em qualquer um dos grupos de recursos ou eliminar 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"?

Quando você move um recurso, seus recursos dependentes devem existir no grupo de recursos ou na assinatura de destino ou ser incluídos na solicitação de movimentação. O código de erro MissingMoveDependentResources é obtido quando um recurso dependente não cumpre este requisito. A mensagem de erro tem detalhes sobre o recurso dependente que tem de ser incluído no pedido de movimentação.

Por exemplo, mover uma máquina virtual pode exigir a movimentação de sete tipos de recursos com três fornecedores de recursos diferentes. Esses fornecedores de recursos e tipos 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. Poderá ter de mover vários outros recursos associados a essa rede virtual. O pedido de movimentação poderá exigir que os endereços IP públicos, as tabelas de rotas, os gateways de rede virtual, os grupos de segurança de rede, entre outros, sejam movidos. 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"?

Antes de tentar fazer a movimentação, o Resource Manager valida o seu pedido. Essa validação inclui verificar as políticas definidas nos recursos que estão envolvidos na movimentação. Por exemplo, se pretender mover um cofre de chaves, mas a sua organização tiver uma política que não permite criar um cofre de chaves no grupo de recursos de destino, a validação falha e a movimentação é bloqueada. O código de erro retornado é RequestDisallowedByPolicy.

Para obter mais informações sobre políticas, consulte O que é a Política do Azure?.

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

Atualmente, nem todos os recursos no suporte do Azure são movidos. Para obter uma lista de recursos que suportam movimentação, consulte Suporte de operação de movimentação para recursos.

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

Quando possível, divida movimentações grandes em operações de movimentação separadas. O Resource Manager devolve imediatamente um erro quando há mais de 800 recursos numa única operação. No entanto, a movimentação de menos de 800 recursos também pode falhar por exceder o tempo limite.

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

Quando recebe uma mensagem de erro a indicar que não foi possível mover um recurso porque não está num estado Com Êxito, pode tratar-se de um recurso dependente que está a bloquear a movimentação. Normalmente, o código de erro é MoveCannotProceedWithResourcesNotInSucceededState.

Se o grupo de recursos de origem ou de destino tiver uma rede virtual, os estados de todos os recursos dependentes da rede virtual serão verificados durante a movimentação. A verificação inclui os recursos que estão direta e indiretamente dependentes da rede virtual. Se algum desses recursos estiver num estado com falha, a movimentação é bloqueada. Por exemplo, se uma máquina virtual que utiliza a rede virtual falhar, a movimentação será bloqueada. A movimentação é bloqueada mesmo quando a máquina virtual não é um dos recursos a ser movido e não é um dos grupo de recursos a ser movido.

Quando recebe este erro, tem duas opções. Mova seus recursos para um grupo de recursos que não tenha uma rede virtual ou entre em contato com o suporte.

Próximos passos

Para obter uma lista dos recursos que suportam a movimentação, consulte Mover suporte de operação para recursos.