Todos os produtos
Search
Central de documentação

Alibaba Cloud CLI:Migrate ECS instances across regions by using Alibaba Cloud CLI

Última atualização: Jul 03, 2026

Migre uma instância do Elastic Compute Service (ECS) entre regiões usando a Alibaba Cloud CLI. Crie uma imagem personalizada da instância de origem, copie-a para a região de destino e inicie uma nova instância a partir da imagem copiada.

Como funciona

A migração entre regiões utiliza uma imagem personalizada para replicar os discos da sua instância ECS em uma nova região.

  1. Crie uma imagem personalizada da instância de origem. Esse processo captura o sistema operacional, as aplicações e os dados de todos os discos.

  2. Copie a imagem personalizada para a região de destino.

  3. Crie uma nova instância na região de destino usando a imagem copiada.

  4. Verifique a nova instância para garantir que todas as aplicações e serviços funcionem conforme o esperado.

  5. Libere os recursos de origem para evitar custos desnecessários.

Diagram showing the migration workflow: Create Image - / /> Copy Image -> Create Instance -> Verify -> Release.

Antes de começar

Limitações

  • Instâncias com discos locais não são suportadas, pois não é possível criar snapshots para elas.

  • Este método não permite criar imagens que contenham snapshots de discos de sistema e discos de dados de instâncias com SSDs locais. Para mais informações, consulte Famílias de instâncias com SSDs locais (série i).

  • A instância de origem pode estar em uma rede clássica ou em uma VPC. A instância de destino deve estar obrigatoriamente em uma VPC.

  • O tipo de instância precisa estar disponível na zona de destino.

Faturamento

  • Os snapshots gerados durante a criação da imagem personalizada incorrem em cobranças. Para mais detalhes, veja Faturamento de snapshots.

Considerações de planejamento

  • Crie uma VPC, um vSwitch e um grupo de segurança na região de destino.

  • A nova instância terá metadados diferentes (ID da instância, endereço IP privado, endereço MAC). Atualize as aplicações ou scripts que dependem desses metadados, como licenças vinculadas ao MAC ou configurações de IP de cluster. Para mais informações, consulte Metadados da instância.

Pré-requisitos

  • Instale e configure a Alibaba Cloud CLI. Para mais informações, consulte o Guia de instalação e Configurar e gerenciar credenciais.

  • Certifique-se de ter permissões para as operações necessárias da API do ECS (CreateImage, CopyImage, RunInstances e DeleteInstance).

Etapa 1: Criar uma imagem personalizada da instância de origem

Chame a operação CreateImage para gerar uma imagem personalizada da sua instância de origem. Para mais detalhes, veja Criar uma imagem personalizada a partir de uma instância.

Nota

Se a instância de origem estiver em execução, esta operação a interromperá por alguns minutos para garantir a consistência dos dados do snapshot.

aliyun ecs CreateImage \
  --RegionId 'cn-hangzhou' \
  --ImageName 'source-image-for-migration' \
  --InstanceId 'i-bp1g6zv0ce8oghu7****'

A resposta retorna o ID da nova imagem.

{
  "ImageId": "m-bp146shijn7hujku****",
  "RequestId": "C8B26B44-0189-443E-9816-*******"
}

Salve o ImageId para usar na próxima etapa.

Etapa 2: Copiar a imagem para a região de destino

Aguarde até que o status da imagem seja Available antes de iniciar a cópia. Verifique o status chamando a operação DescribeImages.

Utilize a operação CopyImage para copiar a imagem para a região de destino. Este exemplo copia uma imagem de China (Hangzhou) para China (Pequim).

aliyun ecs CopyImage \
  --RegionId 'cn-hangzhou' \
  --ImageId 'm-bp146shijn7hujku****' \
  --DestinationRegionId 'cn-beijing' \
  --DestinationImageName 'migrated-image-beijing'

A resposta retorna um novo ImageId referente à imagem copiada na região de destino.

{
  "ImageId": "m-bp1h46wfpjsjastd****",
  "RequestId": "473469C7-AA6F-4DC5-B3DB-A3DC0DE3C83E"
}

Guarde este novo ImageId para a próxima etapa.

Etapa 3: Criar a instância de destino

Execute a operação RunInstances para provisionar uma nova instância a partir da imagem copiada na região de destino. Para mais informações, consulte Criar uma instância com Custom Launch.

aliyun ecs RunInstances \
  --RegionId 'cn-beijing' \
  --ImageId 'm-bp1h46wfpjsjastd****' \
  --InstanceType 'ecs.g6.large' \
  --SecurityGroupId 'sg-2zea9dbddva****' \
  --VSwitchId 'vsw-2zep7vc25mjc1****' \
  --InstanceName 'migrated-instance-beijing' \
  --PasswordInherit true \
  --InternetChargeType 'PayByTraffic' \
  --SystemDisk.Size '40' \
  --SystemDisk.Category 'cloud_essd' \
  --InstanceChargeType 'PostPaid' \
  --InternetMaxBandwidthOut '10'

Como PasswordInherit está definido como true, a nova instância utilizará a mesma senha da instância de origem.

A resposta retorna o ID da nova instância.

{
  "RequestId": "473469C7-AA6F-4DC5-B3DB-A3DC0DE3****",
  "InstanceIdSets": {
    "InstanceIdSet": [
      "i-bp67acfmxazb4pd2****"
    ]
  }
}

Etapa 4: Verificar a instância de destino

Após a inicialização da nova instância, conecte-se a ela e valide os seguintes pontos:

  • O sistema de arquivos e os dados nos discos de sistema e de dados correspondem aos da instância de origem.

  • As aplicações e serviços iniciam e operam corretamente.

  • As associações de recursos dependentes de metadados da instância (endereços IP, endereços MAC) foram atualizadas.

Etapa 5: Liberar os recursos de origem

Depois de confirmar que a nova instância funciona adequadamente, libere os recursos originais para evitar cobranças desnecessárias.

Aviso

A liberação de instâncias e a exclusão de imagens e snapshots são ações irreversíveis. Valide a migração dos seus dados antes de prosseguir.

  1. Libere a instância de origem: Chame a operação DeleteInstance. Para mais detalhes, consulte Liberar uma instância.

    aliyun ecs DeleteInstance --InstanceId 'i-bp1g6zv0ce8oghu7****' --Force true
  2. Exclua as imagens personalizadas: Utilize a operação DeleteImage tanto para a imagem de origem quanto para a imagem copiada. Para mais informações, veja Excluir uma imagem personalizada.

    # Delete the source region image
    aliyun ecs DeleteImage --RegionId 'cn-hangzhou' --ImageId 'm-bp146shijn7hujku****'
    
    # Delete the destination region image
    aliyun ecs DeleteImage --RegionId 'cn-beijing' --ImageId 'm-bp1h46wfpjsjastd****'
  3. Exclua os snapshots relacionados: Invoque a operação DeleteSnapshot para cada snapshot criado durante o processo de geração da imagem.

    aliyun ecs DeleteSnapshot --SnapshotId 's-bp1c0doj0taqyzzl****'

Automatizar a migração com scripts

Os scripts abaixo oferecem uma estrutura básica que você pode adaptar para sua migração.

Exemplos de script:

Bash

Para executar este script, é necessário ter a ferramenta jq instalada.

#!/usr/bin/env bash
 
# Source instance ID
SRC_INSTANCE_ID="i-bp1g6zv0ce8oghu7****"
# Source instance region ID
SRC_REGION_ID="cn-hangzhou"
# Destination region ID
DST_REGION_ID="cn-beijing"
# Destination instance zone ID
DST_ZONE_ID="cn-beijing-h"
# Source instance type
SRC_INSTANCE_TYPE="ecs.e-c1m1.large"
# Source instance system disk category
SRC_SYSTEM_DISK_CATEGORY="cloud_auto"
# Source instance system disk size
SRC_SYSTEM_DISK_SIZE=40
 
# Output log
function log {
  local level="$1"
  local message="$2"
  echo "$(date +'%Y-%m-%d %H:%M:%S') [$level] $message"
}
 
# Wrap Alibaba Cloud CLI
function invoke_aliyun_command() {
  local service="$1"
  local action="$2"
  shift 2
  local -a params=("$@")
  response=$(aliyun "$service" "$action" "${params[@]}")
  exit_code=$?
  if [ $exit_code -eq 0 ]; then return 0; fi
  log "ERROR" "Failed to invoke aliyun command: aliyun $service $action ${params[*]}"
  exit 1
}
 
# Wait for resource to be available
function wait_resource_available() {
  local service="$1"
  local action="$2"
  local region_id="$3"
  local resource_type="$4"
  local resource_id="$5"
 
  local -a params=(
    "--region" "$region_id"
    "--RegionId" "$region_id"
    "--${resource_type}Id" "$resource_id"
  )
 
  if [ "$resource_type" == "Image" ]; then
    params+=("--Status" "Creating,Waiting,Available")
  fi
 
  local current_status
  local current_progress
 
  local timeout=1200
  local interval=20
  local end_time=$(( $(date +%s) + timeout ))
 
  while (( $(date +%s) < end_time )); do
    invoke_aliyun_command "$service" "$action" "${params[@]}"
    current_status=$(echo "$response" | jq -r '.. | .Status? // empty' | head -n1)
    current_progress=$(echo "$response" | jq -r '.. | .Progress? // empty' | head -n1)
 
    log "INFO" "${resource_type} status: $current_status"
    if [[ -n "$current_progress" ]]; then
        log "INFO" "Creation progress: $current_progress"
    fi
    if [[ "$current_status" == "Available" ]]; then return 0; fi
    sleep "$interval"
  done
}
 
# Create image
log "INFO" "Creating source image from instance '$SRC_INSTANCE_ID'"
src_img_params=(
  "--region" "$SRC_REGION_ID"
  "--RegionId" "$SRC_REGION_ID"
  "--InstanceId" "$SRC_INSTANCE_ID"
  "--ImageName" "cli-src-img"
)
invoke_aliyun_command ecs CreateImage "${src_img_params[@]}"
src_img_id=$(echo "$response" | jq -r .ImageId)
wait_resource_available ecs DescribeImages "$SRC_REGION_ID" "Image" "$src_img_id"
log "INFO" "Source image created: '$src_img_id'"
 
# Copy image to destination region
log "INFO" "Copying image to region: '$DST_REGION_ID'"
dst_img_params=(
  "--region" "$SRC_REGION_ID"
  "--RegionId" "$SRC_REGION_ID"
  "--DestinationRegionId" "$DST_REGION_ID"
  "--ImageId" "$src_img_id"
  "--DestinationImageName" "cli-dst-img"
)
invoke_aliyun_command ecs CopyImage "${dst_img_params[@]}"
dst_img_id=$(echo "$response" | jq -r .ImageId)
wait_resource_available ecs DescribeImages "$DST_REGION_ID" "Image" "$dst_img_id"
log "INFO" "Destination image copied: '$dst_img_id'"
 
# Create VPC
log "INFO" "Creating VPC"
dst_vpc_params=(
  "--region" "$DST_REGION_ID"
  "--RegionId" "$DST_REGION_ID"
  "--CidrBlock" "10.0.0.0/8"
  "--VpcName" "cli-dst-vpc"
)
invoke_aliyun_command ecs CreateVpc "${dst_vpc_params[@]}"
dst_vpc_id=$(echo "$response" | jq -r .VpcId)
wait_resource_available "Vpc" "DescribeVpcAttribute" "$DST_REGION_ID" "Vpc" "$dst_vpc_id"
log "INFO" "VPC created: '$dst_vpc_id'"
 
# Create a vSwitch
log "INFO" "Creating VSwitch"
dst_vsw_params=(
  "--region" "$DST_REGION_ID"
  "--RegionId" "$DST_REGION_ID"
  "--ZoneId" "$DST_ZONE_ID"
  "--VpcId" "$dst_vpc_id"
  "--CidrBlock" "10.1.1.0/24"
)
invoke_aliyun_command vpc CreateVSwitch "${dst_vsw_params[@]}"
dst_vsw_id=$(echo "$response" | jq -r .VSwitchId)
wait_resource_available "vpc" "DescribeVSwitchAttributes" "$DST_REGION_ID" "VSwitch" "$dst_vsw_id"
log "INFO" "VSwitch created: '$dst_vsw_id'"
 
# Create security group
log "INFO" "Creating security group"
dst_sg_params=(
  "--region" "$DST_REGION_ID"
  "--RegionId" "$DST_REGION_ID"
  "--SecurityGroupName" "cli-dst-sg"
  "--VpcId" "$dst_vpc_id"
  "--SecurityGroupType" "normal"
)
invoke_aliyun_command ecs CreateSecurityGroup "${dst_sg_params[@]}"
dst_sg_id=$(echo "$response" | jq -r .SecurityGroupId)
log "INFO" "Security group created: '$dst_sg_id'"
 
# Create a pay-as-you-go ECS instance in the destination region
log "INFO" "Creating ECS instance in zone: '$DST_ZONE_ID'"
dst_instance_params=(
  "--region" "$DST_REGION_ID"
  "--RegionId" "$DST_REGION_ID"
  "--ImageId" "$dst_img_id"
  "--SecurityGroupId" "$dst_sg_id"
  "--VSwitchId" "$dst_vsw_id"
  "--InstanceType" "$SRC_INSTANCE_TYPE"
  "--InstanceName" "cli-dst-ecs"
  "--PasswordInherit" "true"
  "--SystemDisk.Category" "$SRC_SYSTEM_DISK_CATEGORY"
  "--SystemDisk.Size" "$SRC_SYSTEM_DISK_SIZE"
  "--InstanceChargeType" "PostPaid"
)
invoke_aliyun_command ecs RunInstances "${dst_instance_params[@]}"
dst_instance_id=$(echo "$response" | jq -r '.InstanceIdSets.InstanceIdSet[0]')
log "INFO" "ECS instance created: '$dst_instance_id'"

Powershell

# Set error exit policy
$ErrorActionPreference = "Stop"
 
# Set character encoding
chcp 65001 | Out-Null
[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8
 
# Source instance ID
$SRC_INSTANCE_ID = "i-bp1g6zv0ce8oghu7****"
# Source instance region ID
$SRC_REGION_ID = "cn-hangzhou"
# Destination region ID
$DST_REGION_ID = "cn-beijing"
# Destination instance zone ID
$DST_ZONE_ID = "cn-beijing-h"
# Source instance type
$SRC_INSTANCE_TYPE = "ecs.e-c1m1.large"
# Source instance system disk category
$SRC_SYSTEM_DISK_CATEGORY = "cloud_auto"
# Source instance system disk size
$SRC_SYSTEM_DISK_SIZE = 40
 
# Output log
function Log {
    param ([string]$Level, [string]$Message)
    Write-Host "$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss') [$Level] $Message"
}
 
# Wrap Alibaba Cloud CLI
function Invoke-AliyunCommand {
    param ([string]$Service, [string]$Action, [array]$Params)
    $response = aliyun $Service $Action $Params
    if ($LASTEXITCODE -eq 0) { return $response | ConvertFrom-Json }
    Log "ERROR" "Failed to call aliyun command: aliyun $Service $Action $Params"
    exit 1
}
 
# Get nested property value
function Get-NestedPropertyValue {
    param (
        [object]$Object,
        [string]$PropertyPath
    )
    $parts = $PropertyPath -split '\.'
    $value = $Object
 
    foreach ($part in $parts) {
        $value = $value.$part
    }
    return $value
}
 
# Wait for resource to be available
function Wait-ResourceAvailable {
    param (
        [string]$Service,
        [string]$Action,
        [object]$Params,
        [string]$StatusPath,
        [string]$ProgressPath
    )
    $timeout = 1200
    $interval = 20
    $endTime = (Get-Date).AddSeconds($timeout)
    while ((Get-Date) -lt $endTime) {
        $response = Invoke-AliyunCommand $Service $Action $Params
        $currentStatus = Get-NestedPropertyValue $response $StatusPath
        Log "INFO" "Resource status: $currentStatus"
        if ($ProgressPath) {
            $currentProgress = Get-NestedPropertyValue $response $ProgressPath
            Log "INFO" "Creation progress: $currentProgress"
        }
        if ("Available" -eq $currentStatus) { return }
        Start-Sleep -Seconds $interval
    }
}
 
# Create image
Log "INFO" "Creating source image from instance '$SRC_INSTANCE_ID'"
$srcImgId = (Invoke-AliyunCommand -Service "ecs" -Action "CreateImage" -Params @(
    "--region", $SRC_REGION_ID,
    "--RegionId", $SRC_REGION_ID,
    "--InstanceId", $SRC_INSTANCE_ID,
    "--ImageName", "cli-src-img"
)).ImageId
Wait-ResourceAvailable -Service "ecs" -Action "DescribeImages" -Params @(
    "--region", $SRC_REGION_ID,
    "--RegionId", $SRC_REGION_ID,
    "--ImageId", $srcImgId,
    "--Status", "Creating,Waiting,Available"
) -StatusPath "Images.Image.Status" -ProgressPath "Images.Image.Progress"
Log "INFO" "Source image created: '$srcImgId'"
 
# Copy image to destination region
Log "INFO" "Copying image to region: '$DST_REGION_ID'"
$dstImgId = (Invoke-AliyunCommand -Service "ecs" -Action "CopyImage" -Params @(
    "--region", $SRC_REGION_ID,
    "--RegionId", $SRC_REGION_ID,
    "--DestinationRegionId", $DST_REGION_ID,
    "--ImageId", $srcImgId,
    "--DestinationImageName", "cli-dst-img"
)).ImageId
Wait-ResourceAvailable -Service "ecs" -Action "DescribeImages" -Params @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--ImageId", $dstImgId,
    "--Status", "Creating,Waiting,Available"
) -StatusPath "Images.Image.Status" -ProgressPath "Images.Image.Progress"
Log "INFO" "Destination image copied: '$dstImgId'"
 
# Create VPC
Log "INFO" "Creating VPC"
$dstVpcId = (Invoke-AliyunCommand -Service "vpc" -Action "CreateVpc" -Params @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--CidrBlock", "10.0.0.0/8",
    "--VpcName", "cli-dst-vpc"
)).VpcId
Wait-ResourceAvailable -Service "Vpc" -Action "DescribeVpcAttribute" -Params @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--VpcId", $dstVpcId
) -StatusPath "Status"
Log "INFO" "VPC created: '$dstVpcId'"
 
# Create a vSwitch
Log "INFO" "Creating VSwitch"
$dstVSwitchId = (Invoke-AliyunCommand vpc CreateVSwitch @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--ZoneId", $DST_ZONE_ID,
    "--VpcId", $dstVpcId,
    "--CidrBlock", "10.1.1.0/24"
)).VSwitchId
Wait-ResourceAvailable -Service "Vpc" -Action "DescribeVSwitchAttributes" -Parameters @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--VSwitch", $dstVSwitchId
) -StatusPath "Status"
Log "INFO" "VSwitch created: '$dstVSwitchId'"
 
# Create security group
Log "INFO" "Creating security group"
$dstSecurityGroupId = (Invoke-AliyunCommand ecs CreateSecurityGroup @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--SecurityGroupName", "cli-dst-sg",
    "--VpcId", $dstVpcId,
    "--SecurityGroupType", "normal"
)).SecurityGroupId
Log "INFO" "Security group created: '$dstSecurityGroupId'"
 
# Create a pay-as-you-go ECS instance in the destination region
Log "INFO" "Creating ECS instance in zone: '$DST_ZONE_ID'"
$dstInstanceId = (Invoke-AliyunCommand ecs RunInstances @(
    "--region", $DST_REGION_ID,
    "--RegionId", $DST_REGION_ID,
    "--ImageId", $dstImgId,
    "--SecurityGroupId", $dstSecurityGroupId,
    "--VSwitchId", $dstVSwitchId,
    "--InstanceType", $SRC_INSTANCE_TYPE,
    "--InstanceName", "cli-dst-ecs",
    "--PasswordInherit", "true",
    "--SystemDisk.Category", $SRC_SYSTEM_DISK_CATEGORY,
    "--SystemDisk.Size", $SRC_SYSTEM_DISK_SIZE,
    "--InstanceChargeType", "PostPaid"
)).InstanceIdSets.InstanceIdSet[0]
Log "INFO" "ECS instance created: '$dstInstanceId'"
Log "INFO" "Script execution completed successfully."

Referências

Replicar instância entre regiões com imagem personalizada (método via console)