最近、AWS/Azure/GCP以外の第4の選択肢として、注目を集めているAlibaba Cloud。ほかのクラウドに負けない機能・性能を持っている一方低価格であるため、オンプレミス環境からAlibaba Cloudへの移行を検討する企業が増えています。
しかし、クラウドへの移行には、サーバーの構成やデータの整合性を保つための工夫が必要です。特にベアメタルの場合、仮想マシンのエクスポート・インポートだけで対応できないので手間がかかります。そこで役立つのが、Alibaba CloudのSMC(Server Migration Center)です。この記事では、SMCを活用してベアメタルのサーバーをAlibaba Cloudへ効率的に移行する方法を解説します。
まずは、Alibaba Cloudの公式ドキュメントより、SMCの仕組みに関する図を引用します。

1. テスト用サーバーの準備
今回は、実際のベアメタルサーバーではなく、AWS上のサーバーをベアメタルと見立てて移行します。また、OSはAlmaLinuxを使用します。
AlmaLinuxはAWSの標準AMIで提供されていないため、Marketplaceのものを使用します。公式のAlmaLinux OS Foundationから提供しているものを使いましょう。サブスクリプションが必要ですが、費用はかかりません。また、t2.microなどのFree Tierインスタンスで起動すれば、Free Tierの利用も可能です。

EC2インスタンスほかの設定は適当でいいですが、移行テストのためデータベースをインストールしておきたいので、EBSのサイズを大きめにします(20GB程度で十分)。EC2インスタンス作成後、移行後と比較するためにまずいろいろ現状を調べておきます。
$ hostname
ip-172-31-34-0.ap-northeast-1.compute.internal
$ ip -brief addr
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 172.31.34.0/20 fe80::4a9:70ff:fea7:b60b/64
$ lsblk -pr
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/xvda 202:0 0 20G 0 disk
/dev/xvda1 202:1 0 1M 0 part
/dev/xvda2 202:2 0 200M 0 part /boot/efi
/dev/xvda3 202:3 0 1G 0 part /boot
/dev/xvda4 202:4 0 18.8G 0 part /
$ uname -a
Linux ip-172-31-34-0.ap-northeast-1.compute.internal 4.18.0-553.16.1.el8_10.x86_64 #1 SMP Thu Aug 8 07:11:46 EDT 2024 x86_64 x86_64 x86_64 GNU/Linux
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Memory protection checking: actual (secure)
Max kernel policy version: 33
$ cat /etc/os-release
NAME="AlmaLinux"
VERSION="8.10 (Cerulean Leopard)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
...
SSHでログインしてPostgreSQL 17をインストールします。
$ sudo dnf update -y
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
$ sudo dnf -qy module disable postgresql
$ sudo dnf install -y postgresql17-server
$ sudo /usr/pgsql-17/bin/postgresql-17-setup initdb
$ sudo systemctl enable postgresql-17
$ sudo systemctl start postgresql-17
テスト用のデータを作成します。
$ sudo -i -u postgres
$ createdb migrationtest
$ /usr/pgsql-17/bin/pgbench -i -s 100 migrationtest
dropping old tables...
NOTICE: table "pgbench_accounts" does not exist, skipping
NOTICE: table "pgbench_branches" does not exist, skipping
NOTICE: table "pgbench_history" does not exist, skipping
NOTICE: table "pgbench_tellers" does not exist, skipping
creating tables...
generating data (client-side)...
vacuuming...
creating primary keys...
done in 48.29 s (drop tables 0.00 s, create tables 0.01 s, client-side generate 25.30 s, vacuum 6.35 s, primary keys 16.65 s).
データのサイズを確認してみます。
$ psql -d migrationtest -c "SELECT pg_size_pretty(pg_database_size(current_database()));"
pg_size_pretty
----------------
1503 MB
(1 row)
2. SMCのコンソール側の操作
SMCは、基本的にコンソールから操作することになります。こちらがSMCの「サーバー移行」画面で、ほとんど日本語化されているようです。

また、初めてSMCを利用する場合、権限の設定が求められますので、許可をクリックするだけで自動的に設定してくれます。

SMCのサーバー移行画面で、青いボタンの「移行元をインポートする」をクリックして移行設定を開始します。インポート方法は3つありますが、「コンソールからインポート」も「コマンドラインでインポート」も、一番右側の「クライアントインポート」をスクリプト化、自動化したもので、今回は手動でSMCクライアントを導入して移行することにしました。

「クライアントインポート」を選択したら、まず画面のやや下にスクロールして、アクティベーションコード(トークン)を生成します。これは、移行元のサーバーからAlibaba CloudのSMCにアクセスする際の一時的な認証情報です。この認証情報によって、移行先のAlibaba Cloudアカウントなどが特定されます。

次は、画面上の指示に従いSMCクライアントを移行元のサーバーにダウンロードしますが、AWS上のEC2からAlibaba Cloudのサービスにアクセスできないことがしばしばあるようです。Alibaba CloudのSMCのエンドポイント「https://smc-service.aliyuncs.com/」にアクセスできるかを確認してみます:
$ curl -I -m 5 https://smc-service.aliyuncs.com/
curl: (7) Failed to connect to smc-service.aliyuncs.com port 443: Connection timed out
ほかのWebサイトに接続できるのにSMCのエンドポイントにのみ接続できない場合、アクセスがAlibaba Cloudによってブロックされていることになります。
この問題を回避するにはプロキシサーバーを使用します。プロキシサーバーはどんなものでも構いません。ここでは、「http://8.211.144.85:3128」のプロキシサーバーを利用しているとします。ここで利用したプロキシサーバーの構築方法は、文末に参考までに記載しています。
$ curl -I -x http://8.211.144.85:3128 https://smc-service.aliyuncs.com/
HTTP/1.1 200 Connection established
HTTP/2 404
date: Thu, 03 Apr 2025 15:58:38 GMT
content-type: text/html;charset=ISO-8859-1
content-length: 1267
vary: Accept-Encoding
cache-control: must-revalidate,no-cache,no-store
server: Jetty(7.2.2.v20101205)
プロキシサーバーの動作を確認出来たら、環境変数として設定しておきます。
$ export HTTPS_PROXY="http://8.211.144.85:3128"
3. SMCクライアントの導入
では、SMCクライアントを移行元のEC2インスタンスにダウンロードします。ダウンロードのURLは、Alibaba Cloudの移行画面にもありますので、そちらを利用してください。ダウンロードしたらそのまま解凍します。
$ curl -LO https://p2v-tools.oss-cn-hangzhou.aliyuncs.com/smc/go2aliyun_client_linux_x86_64.tar.gz
$ tar xvzf go2aliyun_client_linux_x86_64.tar.gz
$ ls go2aliyun_client2.8.3_linux_x86_64/ -l
total 5468
drwxr-xr-x. 5 ec2-user ec2-user 4096 Mar 28 07:20 Check
-rw-r--r--. 1 ec2-user ec2-user 2778 Jan 14 06:09 client_data
-rw-r--r--. 1 ec2-user ec2-user 38878 Apr 19 2024 EULA
drwxr-xr-x. 2 ec2-user ec2-user 4096 Apr 19 2024 Excludes
-rw-r--r--. 1 ec2-user ec2-user 5538312 Mar 28 07:19 go2aliyun_client
-rw-r--r--. 1 ec2-user ec2-user 152 Jun 27 2024 user_config.json
SMCクライアントも同様にAlibaba CloudのSMCエンドポイントに接続する必要がありますが、これもまたブロックされます。そのため、SMCクライアントに対してもプロキシサーバーを使わせる必要があります。
しかしSMCクライアントは環境変数のプロキシサーバーをサポートしていないため、解凍したSMCクライアントのディレクトリにあるclient_dataファイルを編集してプロキシを設定します。client_dataファイルはJSON形式になっていて、その中の「net」セクションを見つけて、プロキシサーバー情報を記入します。
{
"config" :
{
...
"net" :
{
"no_libcurl" : false,
"proxy" :
{
"ip_port" : "8.211.144.85:3128",
"user_pwd" : ""
}
},
...
}
“ip_port”のところに、プロキシサーバーのIPアドレスとポート番号を記入して、ファイルを保存します。
4. 移行の実施
準備ができたので、実際の移行を実施します。
注意してほしいのは、本来なら移行する直前にPostgreSQLを含む、データの書き込みを行うアプリケーションを停止する必要があります。今回は、あえてアプリケーションの静止点を取らない場合のSMCクライアントの挙動を確認するために、PostgreSQLをそのままにしています。
$ chmod +x go2aliyun_client2.8.3_linux_x86_64/go2aliyun_client
$ sudo go2aliyun_client2.8.3_linux_x86_64/go2aliyun_client
[2025-04-03 16:11:31] [Info] ========= Goto Aliyun Client 2.8.3. =========
[2025-04-03 16:11:31] [Info] Load Client Data...
[2025-04-03 16:11:31] [Info] Load User Config...
Please Enter Access Token Id Or Access Id:
ここでアクティベーションコード(トークン)が聞かれるので先ほど生成したものをコピペします。
Please Enter Access Token Id Or Access Id: at-bp1i5h6fe2xeayzlwxu9
Please Enter Access Token Code: ********************************
[2025-04-03 16:20:26] [Info] Verify User Account...
[2025-04-03 16:20:27] [Info] Check System Info [AlmaLinux x86_64]...
OS Info: AlmaLinux 8.10 (Cerulean Leopard) (4.18.0-553.16.1.el8_10.x86_64)
CPU Info: Intel(R) Xeon(R) CPU E5-2686 v4 @ 2.30GHz
CPU Usage: 1 Cores (0.00%) Memory Usage: 0.85GB/1.00GB (85.36%)
Hostname: ip-172-31-34-0.ap-northeast-1.compute.internal IP Address: 172.31.34.0 Mac Address: 06A970A7B60B
[2025-04-03 16:20:28] [Info] Snapshot Check, It May Take Several Minutes...
[2025-04-03 16:20:28] [Info] Import Source Server...
[2025-04-03 16:20:29] [Info] Import Source Server [s-bp1i5h6fe2xeb0ytqd9r] Successfully!
Need to disable SELINUX, run 'setenforce 0' to continue? (yes/no):
SELinuxを無効にしなければならないという旨のメッセージが表示されるので、yesを入力して続行します。
[2025-04-03 16:21:35] [Info] ========= Run In BackGround Daemon Mode =========
[2025-04-03 16:21:35] [Info] Goto Aliyun Begin...
[2025-04-03 16:21:35] [Info] Check Source Server Status...
[2025-04-03 16:21:35] [Info] Query Source Server...
Please Goto SMC Console To Create New Job, time: 0s |
ここまでできたら、次はAlibaba Cloudのコンソール画面に戻って操作する必要があります。Alibaba Cloudのコンソール画面には、次のように移行ジョブが生成されています。右側の「Start Migration」をクリックして、移行を開始します。

移行開始画面では、まずターゲットタイプを設定する必要があります。
- ECSイメージ:ECSイメージはAWS AMIのようなひな形です。通常こちらを選択します。
- クラウドサーバーインスタンス:作成済みのECSインスタンスです。こちらを選択すると、既存のECSインスタンスのディスクは抹消されます。
- 軽量アプリケーションサーバー:AWS Lightsailのようなものです。
今回は、ECSイメージを選択します。

ディスクパーティションの構造も調整できそうです。今回はデフォルトのままで進みます。

また、増分同期もありがたい機能です。最小1時間の頻度で自動的に増分同期ができるそうです。今回は、まず初回同期の動作を確認したいので、いったんOFFにします(画面キャプチャではONになっています)。

設定を確認して、問題なければ移行を実際にスタートします。SMCの画面から、次のように進捗を確認できます。

また、Alibaba CloudのECSの画面を覗いてみると、転送用のECSインスタンスが作成されていることがわかります。名前は「No_Delete_SMC_Transition_instance」になっています。

一方、移行元のLinuxのコマンドラインを見てみると、まずは移行元のテストが行われたようです。bcコマンドも使われたようですがこのディストリビューションにbcがインストールされていないためcommand not foundになっています。それでもテストの結果に影響はなかったようです。
[2025-04-03 16:30:10] [Info] Replication Job [j-6weetefzz3zuaod2r1w4] Is TestRunning.
[2025-04-03 16:30:11] [Info] Do Source Test...
/home/ec2-user/go2aliyun_client2.8.3_linux_x86_64/Check/Test/cpu_usage_exceed.sh: line 7: bc: command not found
[2025-04-03 16:30:11] [Info] Do Source Test [Source.CPUUsageExceeded] Passed, Status: normal
/home/ec2-user/go2aliyun_client2.8.3_linux_x86_64/Check/Test/memory_usage_exceed.sh: line 10: bc: command not found
/home/ec2-user/go2aliyun_client2.8.3_linux_x86_64/Check/Test/memory_usage_exceed.sh: line 11: bc: command not found
[2025-04-03 16:30:11] [Info] Do Source Test [Source.MemoryUsageExceeded] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.FirewallEnabled] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.ProxyEnabled] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.AppCheckList] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.InodeUsageExceeded] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.SpaceUsageExceeded] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.BootInitramfsMissing] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.BootVmlinuzMissing] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.FilesystemTypeUnsupport] Passed, Status: normal
[2025-04-03 16:30:11] [Info] Do Source Test [Source.DockerExist] Passed, Status: normal
[2025-04-03 16:30:14] [Info] Do Source Test [Source.GrubMkconfigFailed] Passed, Status: normal
[2025-04-03 16:30:14] [Info] Do Source Test [Source.GrubModulesMissing] Passed, Status: normal
[2025-04-03 16:30:14] [Info] Do Source Test Successfully!
次に同期のためのテストが実行されたようです。
[2025-04-03 16:30:42] [Info] Do Sync Test...
[2025-04-03 16:30:42] [Info] Do Sync Test [Sync.ConnectServerPort]...
[2025-04-03 16:30:42] [Info] Connect to Transition Instance [http://8.211.142.41:8080/p2vcloudserver]...
[2025-04-03 16:30:52] [Info] Do Sync Test [Sync.ConnectServerPort] Passed, Status: normal
[2025-04-03 16:30:54] [Info] Do Sync Test [Sync.GetFSBSKey]...
[2025-04-03 16:30:54] [Info] No Need To Do Sync Test [Sync.GetFSBSKey]
[2025-04-03 16:30:55] [Info] Do Sync Test [Sync.ConnectSyncPort]...
[2025-04-03 16:30:59] [Info] Do Sync Test [Sync.ConnectSyncPort] Passed, Status: normal
[2025-04-03 16:31:01] [Info] Do Sync Test [Sync.DoNetPerf]...
[2025-04-03 16:31:24] [Info] Do Sync Test [Sync.DoNetPerf] Passed, Status: normal
[2025-04-03 16:31:25] [Info] Do Sync Test [Sync.DoDiskPerf]...
[2025-04-03 16:32:02] [Info] Do Sync Test [Sync.DoDiskPerf] Passed, Status: normal
[2025-04-03 16:32:04] [Info] Do Sync Test [Sync.FSBSyncHeader]...
[2025-04-03 16:32:04] [Info] No Need To Do Sync Test [Sync.FSBSyncHeader]
[2025-04-03 16:32:05] [Info] Do Sync Test [Sync.InitDiskPart]...
[2025-04-03 16:32:05] [Info] Do Test Init Transition Disk 0 Part 0...
[2025-04-03 16:32:14] [Info] Do Test Init Transition Disk 0 Part 0 Successfully!
[2025-04-03 16:32:14] [Info] Do Test Init Transition Disk 0 Part 1...
[2025-04-03 16:32:24] [Info] Do Test Init Transition Disk 0 Part 1 Successfully!
[2025-04-03 16:32:24] [Info] Do Sync Test [Sync.InitDiskPart] Passed, Status: normal
[2025-04-03 16:32:25] [Info] Do Sync Test [Sync.RsyncDiskPart]...
[2025-04-03 16:32:25] [Info] Do Test Rsync Disk 0 Part 0...
[2025-04-03 16:32:28] [Info] Do Test Rsync Disk 0 Part 0 Successfully!
[2025-04-03 16:32:28] [Info] Do Sync Test [Sync.RsyncDiskPart] Passed, Status: normal
[2025-04-03 16:32:29] [Info] Do Sync Test [Sync.CreateSnapshot]...
[2025-04-03 16:32:29] [Info] No Need To Do Sync Test [Sync.CreateSnapshot]
[2025-04-03 16:32:30] [Info] Do Sync Test [Sync.FSBSyncDiskPart] Skipped: pre test run [Sync.CreateSnapshot] not passed
[2025-04-03 16:32:30] [Info] Do Sync Test Successfully!
そして、いよいよ実際のレプリケーションです。
[2025-04-03 16:33:47] [Info] Replication Job [j-6weetefzz3zuaod2r1w4] Is Running.
Stage(0/3) Job: Running (Preparing), Progress: 2.00%, time: 0s \
[2025-04-03 16:34:18] [Info] Connect to Transition Instance [http://8.211.143.179:8080/p2vcloudserver]...
Stage(0/3) Connect count: 1, time: 0s
[2025-04-03 16:34:18] [Info] Connect to Transition Instance [http://8.211.143.179:8080/p2vcloudserver] Successfully!
[2025-04-03 16:34:29] [Info] Init Transition Disk 0 Part 0...
Stage(0/3) Wait count: 2, time: 5s
[2025-04-03 16:34:34] [Info] Init Transition Disk 0 Part 0 Successfully!
[2025-04-03 16:34:34] [Info] Init Transition Disk 0 Part 1...
Stage(0/3) Wait count: 2, time: 5s
[2025-04-03 16:34:39] [Info] Init Transition Disk 0 Part 1 Successfully!
[2025-04-03 16:34:39] [Info] Do Sync Disk 0 Part 0...
[2025-04-03 16:34:41] [Info] Sync Test...
Stage(1/3) Sync Test count: 1, time: 1s
[2025-04-03 16:34:42] [Info] Sync Test Successfully!
Stage(1/3) Sync Size: 39.35MB, speed: 0B/s, progress: 100.00%, time: 10s
[2025-04-03 16:34:52] [Info] Do Sync Disk 0 Part 0 Successfully!
[2025-04-03 16:34:52] [Info] Update Disk 0 Part 0...
Stage(1/3) Wait count: 2, time: 4s
[2025-04-03 16:34:56] [Info] Update Disk 0 Part 0 Successfully!
[2025-04-03 16:34:56] [Info] Do Sync Disk 0 Part 1...
[2025-04-03 16:34:59] [Info] Sync Test...
Stage(1/3) Sync Test count: 1, time: 0s
[2025-04-03 16:34:59] [Info] Sync Test Successfully!
Stage(1/3) Sync Size: 4.84GB, speed: 71.85MB/s, progress: 100.00%, time: 3m12s
[2025-04-03 16:38:12] [Info] Do Sync Disk 0 Part 1 Successfully!
[2025-04-03 16:38:12] [Info] Update Disk 0 Part 1...
Stage(1/3) Wait count: 2, time: 4s
[2025-04-03 16:38:16] [Info] Update Disk 0 Part 1 Successfully!
[2025-04-03 16:38:17] [Info] Do Grub...
Stage(1/3) Wait count: 11, time: 47s
[2025-04-03 16:39:05] [Info] Do Grub Successfully!
Stage(1/3) Job: Running (Cleaning), Progress: 97.00%, time: 7m37s -
Stage(3/3) Job: Finished, Progress: 100.00%, time: 8m6s
[2025-04-03 16:41:53] [Done] Replication Job [j-6weetefzz3zuaod2r1w4] Is Finished!
[2025-04-03 16:41:53] [Done] Create Target ECS Image [m-6we4cg6b1f5vr9138sfy] Successfully!
[2025-04-03 16:41:53] [Info] Generate Key Data...
[2025-04-03 16:41:53] [Info] Import Source Server...
[2025-04-03 16:41:54] [Info] Import Source Server [s-bp1i5h6fe2xeb0ytqd9r] Successfully!
これで移行完了です。5GB弱のデータを4分弱で移行できてるので、決して遅くはありません。
5. インスタンスの作成
Alibaba Cloudのコンソール画面に戻るよう、同様に移行完了のステータスが表示されています。また、転送用の一時的なECSインスタンスも削除されています。この状態では、移行元のベアメタルサーバーがECSイメージの形でAlibaba Cloudに保存されています。

では、実際にECSインスタンスを作成して、移行結果を確認してみます。「インスタンスを作成」をクリックして、通常のECSインスタンス作成手順で作成します。作成後、ECSインスタンスは自動的に起動しますが、起動SSHログインできるまでは後数分間かかるようです。
SSHでログインします。ユーザー名はec2-userで、キーペアを使用してログインできるのです。ログイン後、まずシステムの情報を調べてみます。
$ hostname
iZ6we1fizzplquhbay34vcZ
$ ip -brief addr
lo UNKNOWN 127.0.0.1/8 ::1/128
eth0 UP 172.20.157.43/20 fe80::216:3eff:fe16:b3a5/64
$ lsblk -pr
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 252:0 0 40G 0 disk
/dev/vda1 252:1 0 1G 0 part /boot
/dev/vda2 252:2 0 39G 0 part /
$ uname -a
Linux iZ6we1fizzplquhbay34vcZ 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux
$ sestatus
SELinux status: disabled
$ cat /etc/os-release
NAME="AlmaLinux"
VERSION="8.10 (Cerulean Leopard)"
ID="almalinux"
ID_LIKE="rhel centos fedora"
...
ホスト名やIPアドレスが変更されていることを確認できます。また、パーティションもだいぶ変わっています。また、これは移行によって変わってしまったわけではありませんが、移行のためにSELinuxを無効にしていたので、移行されたイメージでももちろん無効のままです。この点は注意が必要かもしれません。
また、肝心なPostgreSQLですが、一見すると何もなかったように普通に動いています。
$ systemctl status postgresql-17
● postgresql-17.service - PostgreSQL 17 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-17.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2025-04-03 17:21:50 UTC; 3min 59s ago
...
$ sudo -i -u postgres
$ psql -d migrationtest -c "SELECT pg_size_pretty(pg_database_size(current_database()));"
pg_size_pretty
----------------
1503 MB
(1 row)
次にPostgreSQLのログを確認します。
$ cat /var/lib/pgsql/17/data/log/postgresql-Thu.log
...
2025-04-03 17:21:45.559 UTC [837] LOG: starting PostgreSQL 17.4 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-23), 64-bit
2025-04-03 17:21:45.559 UTC [837] LOG: listening on IPv6 address "::1", port 5432
2025-04-03 17:21:45.559 UTC [837] LOG: listening on IPv4 address "127.0.0.1", port 5432
2025-04-03 17:21:45.560 UTC [837] LOG: listening on Unix socket "/run/postgresql/.s.PGSQL.5432"
2025-04-03 17:21:45.564 UTC [837] LOG: listening on Unix socket "/tmp/.s.PGSQL.5432"
2025-04-03 17:21:45.714 UTC [859] LOG: database system was interrupted; last known up at 2025-04-03 06:54:17 UTC
2025-04-03 17:21:46.252 UTC [859] LOG: database system was not properly shut down; automatic recovery in progress
2025-04-03 17:21:46.354 UTC [859] LOG: redo starts at 0/4370D788
2025-04-03 17:21:49.980 UTC [859] LOG: invalid record length at 0/4E4BDB00: expected at least 24, got 0
2025-04-03 17:21:49.980 UTC [859] LOG: redo done at 0/4E4BDAC8 system usage: CPU: user: 0.09 s, system: 0.13 s, elapsed: 3.62 s
2025-04-03 17:21:49.982 UTC [857] LOG: checkpoint starting: end-of-recovery immediate wait
2025-04-03 17:21:50.629 UTC [857] LOG: checkpoint complete: wrote 16326 buffers (99.6%); 0 WAL file(s) added, 11 removed, 0 recycled; write=0.177 s, sync=0.452 s, total=0.649 s; sync files=13, longest=0.446 s, average=0.035 s; distance=177856 kB, estimate=177856 kB; lsn=0/4E4BDB00, redo lsn=0/4E4BDB00
2025-04-03 17:21:50.634 UTC [837] LOG: database system is ready to accept connections
ログを確認すると、PostgreSQLが異常終了を認識していることがわかります。WALを使用してリカバリーしますが、そこに無効なレコードがあり、実際の環境であればデータ欠損の可能性もあります。今回はSMCクライアントによる移行の動作を確認するために、あえてPostgreSQLを停止しないで移行しましたが、想定通りSMCクライアントは内部でrsyncを使用しているため、ファイルシステムレベルの整合性まで保証できますが、アプリケーションレベルの整合性を保証できません。
データベースなどのアプリケーションに関しては、静止点を確保するためにSMCクライアントを実行する前に停止する必要があるようです。
Appendix: EC2インスタンス用プロキシサーバの構築
AWSからAlibaba CloudのSMCサービスにアクセスできない場合、Alibaba Cloudの東京リージョンでプロキシサーバーを構築し、EC2インスタンスからプロキシ経由でアクセスすることで問題を回避できます。
プロキシサーバーの構築方法はいろいろありますが、ここでは参考手順を記載します。まずは、Alibaba CloudでECSインスタンスを任意のスペックで立ち上げます。インスタンスにSSH接続し、squidをインストールします。
$ sudo dnf update -y
$ sudo dnf install squid -y
/etc/squid/squid.confを編集し、任意の場所で以下の行を追加します:
acl localnet src <EC2インスタンスのパブリックIPアドレス>
例えば:
acl localnet src 13.231.110.113/32
インストール後、squidを起動します。
$ sudo squid -k parse
$ sudo systemctl start squid
$ sudo systemctl enable squid
これでプロキシサーバーの準備は完了です。EC2インスタンスから、アクセスしてみます。プロキシサーバーのIPアドレスは、ECSインスタンスのパブリックIPで、ポート番号は3128です。
$ curl -I -x http://8.211.144.85:3128 https://smc-service.aliyuncs.com/
HTTP/1.1 200 Connection established
...