Compartir vía


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 mover recursos de Azure entre grupos de recursos dentro de la misma suscripción o entre distintas suscripciones. Si el traslado implica suscripciones diferentes, ambas suscripciones deben formar parte del mismo inquilino de Microsoft Entra ID. Puede usar herramientas como Azure Portal, Azure PowerShell, CLI de Azure, la API de REST o Python para mover los recursos.

Durante la operación de traslado, los grupos de recursos de origen y de destino están bloqueados. No puede crear, eliminar ni actualizar recursos dentro de estos grupos de recursos mientras el traslado está en curso. Sin embargo, los recursos existentes permanecen totalmente operativos. Por ejemplo, si mueve una máquina virtual de un grupo de recursos a otro, no puede eliminarla ni modificar sus propiedades (por ejemplo, su tamaño) durante el traslado. A pesar da restricción, la máquina virtual sigue funcionando normalmente y los servicios que dependen de ella no experimentan ningún tiempo de inactividad. El bloqueo puede durar hasta cuatro horas. La mayoría de los movimientos se completan más rápido y el bloqueo se quita en consecuencia.

Solo se deben especificar recursos de nivel superior (primario) en la solicitud de traslado. Los recursos secundarios se mueven automáticamente con su elemento primario, pero no se pueden mover de forma independiente. Por ejemplo, puede mover un recurso primario, como Microsoft.Compute/virtualMachines, y su recurso secundario, como Microsoft.Compute/virtualMachines/extensions, se mueve con él. Sin embargo, no puede mover el recurso secundario por sí solo.

Al mover un recurso conserva sus dependencias con recursos secundarios, las dependencias con otros recursos pueden interrumpirse y es posible que deban configurarse de nuevo. Mover un recurso solo cambia su grupo de recursos asociado y no modifica la región física del recurso.

Nota:

Los recursos de Azure no se pueden mover si existe un bloqueo de solo lectura en el origen, el grupo de recursos de destino o la suscripción.

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, cambie ese valor. Por ejemplo, si tiene un panel personalizado en el portal que hace referencia a un identificador de recurso, actualice ese valor. Busque scripts o plantillas que deban actualizarse para el nuevo identificador de recurso.

Lista de comprobación antes de mover recursos

Algunos pasos importantes preceden al traslado de un recurso. Puede evitar errores si comprueba estas condiciones.

  1. Las suscripciones de origen y de destino deben estar activas. Si tiene problemas para habilitar una cuenta que se ha deshabilitado, crea 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. Use la CLI de Azure o PowerShell para comprobar que ambas suscripciones tienen el mismo identificador de inquilino.

    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 de destino no coinciden, use los métodos siguientes para conciliarlos:

  3. Para mover recursos a un asociado del Proveedor de soluciones en la nube (CSP) o desde este, 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 obtener una lista de los recursos que admiten las operaciones de traslado, consulte Tipos de recursos de Azure para las operaciones de movimiento.

  5. Algunos servicios tienen limitaciones o requisitos específicos al trasladar recursos. Compruebe las siguientes instrucciones de traslado antes de mover recursos dentro de estos servicios:

  1. La suscripción de destino debe estar registrada para el proveedor de recursos del recurso que va a mover. Si no es así, recibirá un error en el que se indicará que la suscripción no está registrada para un tipo de recurso. Es posible que vea este error al mover un recurso a una nueva suscripción si no usó previamente el tipo de recurso en la suscripción.

    Para obtener el estado del 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:

    az provider register --namespace Microsoft.Batch
    
  2. Compruebe la cuota de suscripción de la suscripción a la que va a mover los recursos antes de iniciar una operación de traslado. Compruebe si puede solicitar un aumento en una cuota que provocaría que una suscripción de destino supere su límite. Consulte Límites, cuotas y restricciones de la suscripción y servicios de Azure para obtener instrucciones detalladas acerca de los límites y cómo solicitar un aumento.

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

    • En el grupo de recursos de origen: Microsoft.Resources/subscriptions/resourceGroups/moveResources/action
    • En el grupo de recursos de destino: Microsoft.Resources/subscriptions/resourceGroups/write
  4. Si mueve un recurso con una asignación de roles de Azure activa (o su recurso secundario con esta misma asignación), la asignación de roles no se mueve y se vuelve huérfana. Debe volver a crear la asignación de roles después del traslado. Aunque el sistema quita automáticamente la asignación de roles huérfana, se recomienda quitarla antes del traslado.

    Consulte Enumeración de asignaciones de roles de Azure y Asignación de roles de Azure para obtener más información acerca de cómo administrar las asignaciones de roles.

  5. 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 requiere mover la máquina virtual, los discos administrados y otros recursos dependientes en conjunto.

    Si va a mover un recurso a una nueva suscripción, compruebe si el recurso tiene recursos dependientes y si se encuentran en el mismo grupo de recursos. Si los recursos no están en el mismo grupo de recursos, compruebe si puede combinarlos en el mismo grupo de recursos. Si es así, use una operación de traslado entre los grupos de recursos para consolidar todos los recursos en el mismo grupo de recursos.

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

Escenario para el traslado entre suscripciones

Mover recursos de una suscripción a otra es un proceso de tres pasos. Para ilustrar estos pasos, en el diagrama siguiente se muestra solo un recurso dependiente:

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

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

Traslado de recursos

Uso de Azure Portal

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

  2. Seleccionar los recursos que quiere mover. 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.

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

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

  2. El grupo de recursos de origen se establece automáticamente. Especifique el grupo de recursos de destino. Si va a mover a una nueva suscripción, especifique esto tambié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.

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

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

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

  1. Azure Portal le notifica cuando se ha completado el traslado.

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

Uso de la CLI de Azure

Validación

Para probar el escenario de movimiento sin mover realmente los recursos en tiempo real, use el comando az resource invoke-action. Use este comando solo cuando necesite modelar los resultados sin seguir los pasos. Para ejecutar esta operación, necesita el identificador de recurso del grupo de recursos de origen, el grupo de recursos de destino y cada recurso que se mueve.

Use \" para escapar las comillas dobles en el cuerpo de la solicitud.

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 se produce un error en la validación, verá un mensaje de error que explica por qué no se pueden mover los recursos.

Move

Para trasladar recursos existentes a otro grupo de recursos o a una 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.

Los comandos siguientes muestran cómo mover varios recursos a un nuevo grupo de recursos. Funcionan con la CLI de Azure en un terminal de Bash o en una consola de Azure PowerShell. Proporcione el parámetro --destination-subscription-id para mover recursos a una nueva suscripción.

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

Uso de Azure PowerShell

Validación

Para probar el escenario de movimiento sin mover realmente los recursos en tiempo real, use el Invoke-AzResourceAction comando en Azure PowerShell. Use este comando solo cuando necesite modelar los resultados sin seguir los pasos.

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

Una salida no se mostrará si la validación se realiza correctamente. Sin embargo, si se produce un error en la validación, un mensaje de error explica 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 Python

Validación

Para probar el escenario de movimiento sin mover realmente los recursos en tiempo real, use el método ResourceManagementClient.resources.begin_validate_move_resources. Use este método solo cuando necesite modelar los resultados sin seguir los pasos.

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

No se muestra una salida si la validación se realiza correctamente. Sin embargo, si se produce un error en la validación, un mensaje de error explica por qué no se pueden mover los recursos.

Move

Para mover los recursos existentes a otro grupo de recursos o suscripción, use el método ResourceManagementClient.resources.begin_move_resources en Python. 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 validate move operation prueba el escenario de movimiento sin mover realmente los recursos. Use esta operación para comprobar si el traslado puede realizarse correctamente. La validación se llama automáticamente cuando se envía una solicitud de traslado. Use esta operación solo cuando necesite modelar los resultados sin seguir los pasos. 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
...

Un 202 código de estado indica que se aceptó la solicitud de validación, pero aún no ha determinado si la operación de traslado 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>

Seguirá recibiendo un código de estado 202 mientras se ejecuta la operación. Espere el número de segundos que se indica en el valor retry-after antes de intentarlo de nuevo. Recibirá un código de estado 204 si la validación de movimiento tiene éxito. Si se produce un error en la validación de movimiento, recibirá un mensaje de error similar al siguiente:

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

Move

Para mover los recursos existentes a otro grupo de recursos o suscripción, use la operación Move resources.

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

Especifique el grupo de recursos de destino y los recursos que se moverán en el cuerpo de la solicitud.

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

Preguntas más frecuentes

Mi operación de movimiento de recursos que normalmente tarda unos minutos se ha estado ejecutando durante casi una hora. ¿Hay algo incorrecto?

Mover un recurso es una operación compleja con distintas fases. Pueden existir más implicaciones, además del proveedor de recursos del recurso que intenta mover. Azure Resource Manager permite que finalice una operación de traslado cuatro horas debido a las dependencias entre proveedores de recursos. Esta duración les da tiempo para recuperarse de problemas transitorios. Si la solicitud de traslado está dentro del período de cuatro horas, la operación sigue intentando completarse y podría realizarse correctamente. La operación bloquea los grupos de recursos de origen y de destino 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?

  • Las operaciones de movimiento pueden completarse cuatro horas. La operación bloquea los grupos de recursos de origen y destino durante este tiempo para evitar que se modifiquen.

  • Hay dos fases en una solicitud de movimiento. Los recursos se mueven durante la primera fase y los proveedores de recursos que dependen de los recursos que se mueven se notifican durante la segunda fase. Un grupo de recursos se puede bloquear durante las cuatro horas cuando un proveedor de recursos produce un error en cualquiera de las fases. Resource Manager inicia los pasos con errores durante el intervalo de la operación de traslado.

  • Resource Manager desbloquea ambos grupos de recursos si un recurso no se mueve en un plazo de cuatro horas. Los recursos que se mueven correctamente se encuentran en el grupo de recursos de destino. Los recursos que no se pueden mover permanecen 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 impide eliminar cualquiera de los grupos de recursos. El bloqueo también impide crear un nuevo recurso, eliminar un recurso o actualizar las propiedades de un recurso dentro de cada grupo de recursos (por ejemplo, cambiar el tamaño de una máquina virtual).

En la imagen siguiente se muestra un mensaje de error de Azure Portal cuando 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.

En la imagen siguiente, el recurso de máquina virtual pertenece a un grupo de recursos ("TestB") que está formando parte actualmente de una operación de traslado. Cuando intenta actualizar una propiedad de una máquina virtual (por ejemplo, su tamaño), Azure Portal devuelve un mensaje de error. Este error ocurre porque el grupo de recursos se bloquea durante el traslado, lo que protege a los recursos de la modificación.

Captura de pantalla de Azure Portal que muestra un mensaje de error cuando un usuario intenta actualizar una propiedad (tamaño de máquina virtual) de la máquina virtual.

Además, los grupos de recursos de origen y de destino no pueden participar en otras operaciones de movimiento simultáneamente durante un traslado de recursos. Por ejemplo, si va a mover recursos del grupo de recursos A al grupo de recursos B, tanto el grupo de recursos A como el grupo de recursos B no pueden participar en otra operación de traslado al mismo tiempo. No se pueden mover recursos simultáneamente al grupo de recursos C ni desde este. Esta restricción impide que varias operaciones en conflicto bloqueen grupos de recursos durante el proceso de movimiento.

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

Al mover un recurso, sus recursos dependientes deben existir en el grupo de recursos de destino o en la suscripción, o incluirse en la solicitud de traslado. Obtiene el código de error MissingMoveDependentResource s cuando un recurso dependiente no cumple este requisito. El mensaje de error proporciona detalles sobre el recurso dependiente que debe incluir en la solicitud de traslado.

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 en la que es posible que tenga que mover otros recursos asociados a esa red virtual. La solicitud de traslado podría requerir mover direcciones IP públicas, tablas de rutas, puertas de enlace de red virtual, grupos de seguridad de red y otros recursos. Una puerta de enlace de red virtual debe estar en el mismo grupo de recursos que su red virtual, ya que no se pueden mover por separado.

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

Resource Manager valida la solicitud de traslado antes de intentar realizar un traslado. Esta validación incluye la comprobación de directivas definidas para los recursos implicados en el traslado. Por ejemplo, se produce un error en la validación al intentar 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. 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?

No todos los recursos de Azure permiten operaciones de movimiento.

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

Separa los movimientos grandes en diferentes operaciones de movimiento siempre que sea posible. Resource Manager inmediatamente devolverá un error si hay más de 800 recursos en una sola operación. Sin embargo, mover menos de 800 recursos también puede producir un error al agotar el tiempo de espera.

¿Cuál es el significado del error que un recurso no está en un estado "correcto"?

Cuando recibe un mensaje de error que indica que no puede mover un recurso porque no está en un estado Correcto, puede deberse a que un recurso dependiente 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 que dependen de esa red virtual se comprueban durante el traslado. Esta comprobación incluye recursos que dependen directa e indirectamente de la red. El traslado se bloquea si algún recurso no tiene un estado correcto. Por ejemplo, si una máquina virtual usa una red virtual que no informa de un estado correcto, el traslado se bloquea. El traslado se bloquea incluso cuando la máquina virtual no es uno de los recursos que se mueven. El traslado también se bloquea incluso cuando la máquina virtual no está en el grupo de recursos de origen o destino.

Para resolver este problema, traslade los recursos a un grupo de recursos que no tenga una red virtual o póngase en contacto con 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. Sin embargo, puede mover todos los recursos de un 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 aplicar esta configuración manualmente al nuevo grupo de recursos.

Pasos siguientes

Consulte Soporte técnico para la operación de traslado de recursos para comprobar qué recursos de Azure admiten las operaciones de movimiento.