Traslado de recursos de Azure a un nuevo grupo de recursos o a una nueva suscripción

En este artículo se explica cómo trasladar recursos de Azure a otra suscripción de Azure o a otro grupo de recursos en la misma suscripción. Puede usar Azure Portal, Azure PowerShell, la CLI de Azure o la API REST para trasladar recursos.

Tanto el grupo de origen como el grupo de destino se bloquean durante la operación de traslado. Las operaciones de escritura y eliminación están bloqueadas en los grupos de recursos hasta que se completa el movimiento. Este bloqueo significa que no puede agregar, actualizar ni eliminar recursos de los grupos de recursos. Pero no significa que los recursos estén inmovilizados. Por ejemplo, si mueve un servidor lógico de Azure SQL, sus bases de datos y otros recursos dependientes a un nuevo grupo de recursos o a una nueva suscripción, las aplicaciones que usan las bases de datos no experimentan tiempo de inactividad. Seguirá pudiendo leer y escribir en estas bases de datos. El bloqueo puede durar un máximo de cuatro horas, pero la mayoría de los movimientos se completan en mucho menos tiempo.

Si el traslado requiere la configuración de nuevos recursos dependientes, experimentará una interrupción en esos servicios hasta que se hayan reconfigurado.

Si se mueve un recurso, solo se mueve a un nuevo grupo de recursos o suscripción. No cambia la ubicación del recurso.

Nota:

No puede mover recursos de Azure a otro grupo de recursos ni a otra suscripción si hay un bloqueo de solo lectura, ya sea en el origen o en el destino.

Cambio en el identificador de recurso

Cuando se mueve un recurso, cambia su identificador de recurso. El formato estándar para un identificador de recurso es /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/{resourceProviderNamespace}/{resourceType}/{resourceName}. Al trasladar un recurso a un nuevo grupo de recursos o a una nueva suscripción, cambia uno o varios valores de esa ruta de acceso.

Si usa el identificador de recurso en cualquier lugar, deberá cambiar dicho valor. Por ejemplo, si tiene un panel personalizado en el portal que hace referencia a un identificador de recurso, deberá actualizar dicho valor. Busque scripts o plantillas que deban actualizarse para el nuevo identificador de recurso.

Lista de comprobación antes de mover recursos

Hay algunos pasos importantes que deben realizarse antes de mover un recurso. Puede evitar errores mediante la comprobación de estas condiciones.

  1. Las suscripciones de origen y de destino deben estar activas. Si tiene problemas para habilitar una cuenta que se ha deshabilitado, cree una solicitud de soporte técnico de Azure. Seleccione Administración de suscripciones para el tipo de problema.

  2. Las suscripciones de origen y destino deben existir dentro del mismo inquilino de Microsoft Entra. Para comprobar que ambas suscripciones tienen el mismo identificador de inquilino, utilice Azure PowerShell o la CLI de Azure.

    Para Azure PowerShell, use:

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

    Para la CLI de Azure, utilice:

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

    Si los identificadores de inquilino de las suscripciones de origen y destino no son los mismos, use los siguientes métodos para conciliarlos:

  3. Si está intentando mover recursos a o desde un asociado del Proveedor de soluciones en la nube (CSP), consulte Transferencia de suscripciones de Azure entre suscriptores y CSP.

  4. Los recursos que desea trasladar deben ser compatibles con la operación de traslado. Para una lista de qué recursos son compatibles con el traslado, consulte Compatibilidad con la operación de traslado para recursos.

  5. Algunos servicios tienen limitaciones o requisitos específicos al trasladar recursos. Si ha trasladado cualquiera de los siguientes servicios, compruebe esa guía antes de trasladarlo.

  6. La suscripción de destino correspondiente al proveedor de recursos del recurso que se traslada debe estar registrada. Si no es así, recibirá un error en el que se indicará que la suscripción no está registrada para un tipo de recurso. Podría encontrar este error al mover un recurso a una nueva suscripción que nunca se ha utilizado con ese tipo de recurso.

    En PowerShell, use los siguientes comandos para obtener el estado de registro:

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

    Para registrar un proveedor de recursos, use:

    Register-AzResourceProvider -ProviderNamespace Microsoft.Batch
    

    En la CLI de Azure, use los siguientes comandos para obtener el estado de registro:

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

    Para registrar un proveedor de recursos, use:

    az provider register --namespace Microsoft.Batch
    
  7. Antes de mover los recursos, compruebe las cuotas de la suscripción a la que está trasladando los recursos. Si trasladar los recursos significa que la suscripción excederá sus límites, debe revisar si puede solicitar un aumento de la cuota. Para ver una lista de estos límites y cómo solicitar un aumento, consulte Límites, cuotas y restricciones de suscripción y servicios de Microsoft Azure.

  8. La cuenta que mueve los recursos debe tener al menos los permisos siguientes:

    • Microsoft.Resources/subscriptions/resourceGroups/moveResources/action en el grupo de recursos de origen.
    • Microsoft.Resources/subscriptions/resourceGroups/write en el grupo de recursos de destino.
  9. Si mueve un recurso que tiene un rol de Azure asignado directamente al recurso (o a un recurso secundario), la asignación de roles no se mueve y queda huérfana. Después de moverlo, debe volver a crear asignaciones de roles. Finalmente, la asignación de roles huérfana se quita automáticamente, pero se recomienda quitar la asignación de roles antes del cambio.

    Para más información sobre cómo administrar las asignaciones de roles, consulte Enumeración de asignaciones de roles de Azure y Asignación de roles de Azure.

  10. Para un traslado entre suscripciones, el recurso y sus recursos dependientes deben encontrarse en el mismo grupo de recursos y deben trasladarse juntos. Por ejemplo, una máquina virtual con discos administrados requeriría que la máquina virtual y los discos administrados se trasladaran juntos, junto con otros recursos dependientes.

    Si va a trasladar un recurso a una nueva suscripción, compruebe si el recurso tiene recursos dependientes y si están ubicados en el mismo grupo de recursos. Si los recursos no están en el mismo grupo de recursos, compruebe si los recursos pueden combinarse en el mismo grupo de recursos. Si es así, lleve todos estos recursos al mismo grupo de recursos mediante una operación de traslado entre grupos de recursos.

    Para más información, consulte Escenario para el traslado entre suscripciones.

Escenario para el traslado entre suscripciones

El traslado de recursos de una suscripción a otra es un proceso de tres pasos:

Diagrama que muestra el proceso de tres pasos para mover recursos entre suscripciones.

Con fines ilustrativos, solo tenemos un recurso dependiente.

  • Paso 1: Si los recursos dependientes se distribuyen entre diferentes grupos de recursos, trasládelos primero a un grupo de recursos.
  • Paso 2: Traslade el recurso y los recursos dependientes juntos desde la suscripción de origen hasta la de destino.
  • Paso 3: Opcionalmente, redistribuya los recursos dependientes a distintos grupos de recursos dentro de la suscripción de destino.

Uso del portal

Para mover recursos, seleccione el grupo de recursos que contiene dichos recursos.

Seleccionar los recursos que quiere trasladar. Para trasladar todos los recursos, active la casilla situada en la parte superior de la lista. O bien, seleccione cada recurso de forma individual.

Captura de pantalla de Azure Portal que muestra la selección de recursos para mover.

Seleccione el botón Mover.

Captura de pantalla de Azure Portal que muestra el botón Mover con tres opciones.

Este botón ofrece tres opciones:

Seleccione si va a mover los recursos a un nuevo grupo de recursos o a una nueva suscripción.

El grupo de recursos de origen se establece automáticamente. Especifique el grupo de recursos de destino. Si va a trasladar a una nueva suscripción, especifique también la suscripción. Seleccione Siguiente.

Captura de pantalla de Azure Portal donde el usuario especifica el grupo de recursos de destino de la operación de movimiento.

El portal valida que se pueden trasladar los recursos. Espere a que se complete la validación.

Captura de pantalla de Azure Portal que muestra el proceso de validación para la operación de movimiento.

Cuando la validación se complete correctamente, seleccione Siguiente.

Confirme que tiene que actualizar las herramientas y los scripts para estos recursos. Para empezar a mover los recursos, seleccione Mover.

Captura de pantalla de Azure Portal en la que el usuario reconoce la necesidad de actualizar herramientas y scripts antes de iniciar la operación de movimiento.

Cuando el traslado se haya completado, se le notificará el resultado.

Captura de pantalla de Azure Portal que muestra una notificación con los resultados de la operación de movimiento.

Uso de Azure PowerShell

Validación

Para probar el escenario de traslado sin mover realmente los recursos, use el comando Invoke-AzResourceAction. Use esta operación solo cuando necesite determinar de antemano los 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
   }

Si se supera la validación, no verá ninguna salida.

Si la validación no se supera, verá un mensaje de error que describe por qué no se pueden mover los recursos.

Move

Para mover recursos existentes a otro grupo de recursos o a otra suscripción, use el comando Move-AzResource. El siguiente ejemplo muestra cómo trasladar varios recursos a un nuevo 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 moverlos a una nueva suscripción, especifique un valor para el parámetro DestinationSubscriptionId.

Uso de CLI de Azure

Validación

Para probar el escenario de traslado sin mover realmente los recursos, use el comando az resource invoke-action. Use esta operación solo cuando necesite determinar de antemano los resultados. Para ejecutar esta operación, necesita el:

  • Identificador de recurso del grupo de recursos de origen
  • Identificador de recurso del grupo de recursos de destino
  • Identificador de recurso de cada recurso que se va a trasladar

En el cuerpo de la solicitud, use \" para escapar las comillas dobles.

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

Si se supera la validación, verá:

{} Finished .. 

Si la validación no se supera, verá un mensaje de error que describe por qué no se pueden mover los recursos.

Move

Para trasladar recursos existentes a otro grupo de recursos o a otra suscripción, use el comando az resource move. En el parámetro --ids, ofrezca una lista separada por espacios de los identificadores de recurso que se van a trasladar.

El siguiente ejemplo muestra cómo trasladar varios recursos a un nuevo grupo de recursos. Funciona cuando se usa la CLI de Azure en un terminal de 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

En el ejemplo siguiente se muestra cómo ejecutar los mismos comandos en una consola de 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 a una nueva suscripción, proporcione el parámetro --destination-subscription-id.

Uso de Python

Validación

Para probar el escenario de movimiento sin mover realmente los recursos, use el método ResourceManagementClient.resources.begin_validate_move_resources. Use este método solo cuando necesite determinar de antemano los 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))

Si se supera la validación, no verá ninguna salida.

Si la validación no se supera, verá un mensaje de error que describe por qué no se pueden mover los recursos.

Move

Para mover recursos existentes a otro grupo de recursos o a otra suscripción, use el método ResourceManagementClient.resources.begin_move_resources. El siguiente ejemplo muestra cómo trasladar varios recursos a un nuevo 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
    }
)

Use la API de REST

Validación

La operación de validación del movimiento le permite probar el escenario de movimiento sin mover realmente los recursos. Use esta operación para comprobar si el movimiento se realizará correctamente. La validación se llama automáticamente cuando se envía una solicitud de traslado. Use esta operación solo cuando necesite determinar de antemano los resultados. Para ejecutar esta operación, necesita el:

  • Nombre del grupo de recursos de origen
  • Identificador de recurso del grupo de recursos de destino
  • Identificador de recurso de cada recurso que se va a trasladar
  • Token de acceso de la cuenta

Envíe la solicitud siguiente:

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

Con un cuerpo de la solicitud:

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

Si la solicitud tiene un formato correcto, la operación devuelve:

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

El código de estado 202 indica que se ha aceptado la solicitud de validación, pero aún no se ha determinado si la operación de movimiento se realizará correctamente. El valor location contiene una dirección URL que se usa para comprobar el estado de la operación de ejecución larga.

Para comprobar el estado, envíe la solicitud siguiente:

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

Mientras todavía se esté ejecutando la operación, continuará recibiendo el código de estado 202. Espere el número de segundos que se indica en el valor retry-after antes de intentarlo de nuevo. Si la operación de movimiento se valida correctamente, recibirá el código de estado 204. Si falla la validación de movimiento, recibirá un mensaje de error, como:

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

Move

Para mover recursos existentes a otro grupo de recursos o a otra suscripción, use la operación Mover recursos.

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

En el cuerpo de la solicitud, especifique el grupo de recursos de destino y los recursos a mover.

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

Preguntas más frecuentes

La operación de movimiento de recursos, que normalmente tarda unos minutos, se ha ejecutado durante casi una hora. ¿Hay algo incorrecto?

Mover un recurso es una operación compleja que tiene distintas fases. Pueden existir más implicaciones, además del proveedor de recursos del recurso que intenta mover. Debido a las dependencias entre proveedores de recursos, Azure Resource Manager admite 4 horas para que se complete la operación. Este período de tiempo proporciona a los proveedores de recursos una oportunidad de recuperarse de problemas transitorios. Si la solicitud de movimiento se encuentra dentro del período de 4 horas, la operación continúa intentando completar la ejecución, que puede ser correcta. Los grupos de recursos de origen y de destino se bloquean durante este tiempo para evitar problemas de coherencia.

¿Por qué mi grupo de recursos se bloquea durante cuatro horas mientras se realiza el movimiento de recursos?

Se permite que una solicitud de movimiento tarde hasta 4 horas en completarse. Para evitar que se muevan las modificaciones de los recursos, los grupos de recursos de origen y de destino se bloquean durante el movimiento de recursos.

Hay dos fases en una solicitud de movimiento. En la primera fase, se mueve el recurso. En la segunda fase, se envían notificaciones a otros proveedores de recursos que dependen del recurso que se está moviendo. Un grupo de recursos puede bloquearse durante las 4 horas completas cuando se produce un error en un proveedor de recursos en cualquiera de las fases. Durante el tiempo permitido, Resource Manager reintenta el paso con el error.

Si un recurso no se puede mover durante las 4 horas, Resource Manager desbloquea ambos grupos de recursos. Los recursos que se movieron correctamente se encuentran en el grupo de recursos de destino. Los recursos que no se pudieron mover se dejan en el grupo de recursos de origen.

¿Cuáles son las implicaciones de que los grupos de recursos de origen y de destino se bloqueen durante el movimiento de recursos?

El bloqueo le impide eliminar cualquier grupo de recursos, crear un nuevo recurso en cualquiera de los grupos de recursos o eliminar cualquiera de los recursos implicados en el movimiento.

En la siguiente imagen se muestra un mensaje de error de Azure Portal cuando un usuario intenta eliminar un grupo de recursos que forma parte de un movimiento en curso.

Captura de pantalla de Azure Portal que muestra un mensaje de error al intentar eliminar un grupo de recursos agregado a una operación de movimiento en curso.

¿Qué significa el código de error "MissingMoveDependentResources"?

Al mover un recurso, sus recursos dependientes deben existir en el grupo de recursos o la suscripción de destino, o bien deben incluirse en la solicitud de movimiento. Se recibe el código de error MissingMoveDependentResources cuando un recurso dependiente no cumple este requisito. El mensaje de error contiene detalles sobre el recurso dependiente que debe incluirse en la solicitud de movimiento.

Por ejemplo, mover una máquina virtual podría requerir mover siete tipos de recursos con tres proveedores de recursos diferentes. Estos proveedores y tipos de recursos son:

  • Microsoft.Compute

    • virtualMachines
    • disks
  • Microsoft.Network

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

    • storageAccounts

Otro ejemplo común implica mover una red virtual. Es posible que tenga que mover varios recursos asociados a esa red virtual. La solicitud de movimiento podría requerir mover las direcciones IP públicas, las tablas de rutas, las puertas de enlace de red virtual, los grupos de seguridad de red y más. En general, una puerta de enlace de red virtual siempre debe estar en el mismo grupo de recursos que su red virtual, no se pueden mover por separado.

¿Qué significa el código de error "RequestDisallowedByPolicy"?

Resource Manager valida la solicitud de traslado antes de intentar el traslado. Esta validación incluye la comprobación de las directivas definidas en los recursos implicados en el traslado. Por ejemplo, si intenta mover un almacén de claves pero la organización tiene una directiva para denegar la creación de un almacén de claves en el grupo de recursos de destino, se produce un error en la validación y el traslado se bloquea. El código de error devuelto es RequestDisallowedByPolicy.

Para más información sobre las directivas, consulte ¿Qué es Azure Policy?.

¿Por qué no puedo mover algunos recursos de Azure?

Actualmente, no todos los recursos de Azure se pueden mover. Para una lista de qué recursos son compatibles con el movimiento, consulte Compatibilidad con la operación de traslado para recursos.

¿Cuántos recursos puedo mover en una sola operación?

Cuando sea posible, divida las operaciones de movimiento grandes en varias operaciones de movimiento independientes. Resource Manager inmediatamente devolverá un error si hay más de 800 recursos en una sola operación. No obstante, también se puede producir un error por agotamiento del tiempo de espera al mover menos de 800 recursos.

¿Qué significa el error de que un recurso no está en el estado correcto?

Si recibe un mensaje de error que indica que no se puede mover un recurso porque no se encuentra en un estado correcto, es posible que en realidad sea un recurso dependiente lo que esté bloqueando el movimiento. Normalmente, el código de error es MoveCannotProceedWithResourcesNotInSucceededState.

Si el grupo de recursos de origen o de destino contiene una red virtual, los estados de todos los recursos dependientes de la red virtual se comprueban durante el traslado. La comprobación incluye los recursos directa e indirectamente dependientes de la red virtual. Si alguno de esos recursos se encuentra en un estado de error, el traslado se bloqueará. Por ejemplo, si se produce un error en una máquina virtual que usa la red virtual, el traslado se bloqueará. El traslado se bloqueará incluso cuando la máquina virtual no sea uno de los recursos que se están trasladando y no esté en uno de los grupos de recursos que forma parte del traslado.

Cuando recibe este error, tiene dos opciones: trasladar los recursos a un grupo de recursos que no tenga una red virtual o ponerse en contacto con el departamento de soporte técnico.

¿Puedo mover un grupo de recursos a otra suscripción?

No, no puede mover un grupo de recursos a una nueva suscripción. Pero puede mover todos los recursos del grupo de recursos a un grupo de recursos de otra suscripción. La configuración, como etiquetas, asignaciones de roles y directivas, no se transfiere automáticamente desde el grupo de recursos original al grupo de recursos de destino. Debe volver a aplicar esta configuración al nuevo grupo de recursos. Para obtener más información, consulte Traslado de los recursos a un nuevo grupo de recursos o a una nueva suscripción.

Escenarios no admitidos

La plataforma bloquea un escenario en el que los recursos de la suscripción A se migran a la suscripción B, al mismo tiempo que los recursos de la suscripción B se migran a la suscripción C. Este es un comportamiento predeterminado.

Pasos siguientes

Para una lista de qué recursos son compatibles con el traslado, consulte Compatibilidad con la operación de traslado para recursos.