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 a partir da instância de origem. Esse processo captura o sistema operacional, os aplicativos 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 com base na imagem copiada.
Verifique a nova instância para garantir que todos os aplicativos 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 Instance families with local SSDs (i series).
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 Snapshot billing.
Considerações de planejamento
Prepare a infraestrutura na região de destino criando uma VPC, um vSwitch e um grupo de segurança.
A nova instância terá metadados diferentes (ID da instância, endereço IP privado, endereço MAC). Atualize aplicativos ou scripts que dependam dessas informações, como licenças vinculadas ao MAC ou configurações de IP de cluster. Para mais informações, consulte Instance metadata.
Pré-requisitos
Instale e configure a Alibaba Cloud CLI. Para instruções detalhadas, consulte o Guia de instalação e Configure and manage credentials.
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 Create a custom image from an instance.
Se a instância de origem estiver em execução, esta operação irá pará-la 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 mude para 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 demonstra a cópia de uma imagem de China (Hangzhou) para China (Beijing).
aliyun ecs CopyImage \
--RegionId 'cn-hangzhou' \
--ImageId 'm-bp146shijn7hujku****' \
--DestinationRegionId 'cn-beijing' \
--DestinationImageName 'migrated-image-beijing'
A resposta fornece 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 na região de destino usando a imagem copiada. Consulte Custom Launch para mais informações.
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 herdará a mesma senha da instância de origem.
A resposta contém 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:
Confirme se o sistema de arquivos e os dados nos discos de sistema e de dados correspondem aos da instância original.
Teste se os aplicativos e serviços iniciam e operam corretamente.
Verifique se 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 indevidas.
A liberação de instâncias e a exclusão de imagens e snapshots são ações irreversíveis. Certifique-se de que a migração de dados foi concluída com sucesso antes de prosseguir.
-
Libere a instância de origem: Chame a operação DeleteInstance. Para mais detalhes, veja Release an instance.
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 cópia. Consulte Delete a custom image para mais informações.
# 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****' -
Remova os snapshots associados: 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 scripts:
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
Replicate instance across regions with custom image (método via console)