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.
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.
Copie a imagem personalizada para a região de destino.
Crie uma nova instância na região de destino usando a imagem copiada.
Verifique a nova instância para garantir que todas as aplicações e serviços funcionem conforme o esperado.
Libere os recursos de origem para evitar custos desnecessários.
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,RunInstanceseDeleteInstance).
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.
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.
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.
-
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 -
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****' -
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)