ちょっと話題の記事

VM ImportでVMwareからAWS EC2へマイグレーションしてみた

2013.04.03

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

VMware vSphereの仮想マシン(VMDK形式)をAmazon EC2にマイグレする、VM Import機能を試してみました。

むかしむかし...

数年前、「サーバー仮想化」なんてキーワードが流行った時期がありました。
x86サーバーでゴリゴリ動いているシステムをVMware環境にサクッとマイグレして、花の仮想化生活!!なんてのがもてはやされていましたね。その仮想マシンを、今度はクラウドに預ける時が来たようです。

必要なもの/検証環境

  • インポート元ハイパーバイザ : VMware vSphere (ESXi) 5.1
  • 仮想マシン : Windows Server 2008R2 Standard
  • vSphere CLientを実行するPC : Windows 7
  • EC2 API Toolを実行するPC *1 : Mac OS X Mountain Lion

AWSのVM Import/Exportの紹介では、EC2 API Tool(CUI)とAmazon EC2 VM Import Connector(GUI)の2通りが紹介されていますが、Import ConnectorはvSphereの対応バージョンが5.0まで *2のため、今回はEC2 API Toolでやります。Import ConnecterのGUIにはめっちゃ興味あるので、vSphere 5.0環境が用意できれば試してみたいと思います。

手順

1. 仮想マシンをOVF形式でエクスポート

vSphere Clientで、仮想マシンをエクスポートします。仮想マシンを選択し、vSphere Clientのメニューから[ファイル] - [エクスポート] - [OVFテンプレートのエクスポート]を選択します。

vmimport01

ウィザードでは、PCの任意のフォルダを選択し、フォーマットはVMDKファイルが含まれるOVF形式を選択してください *3。[OK]ボタンでエクスポートが開始します。

vmimport02

進捗は、最初のうちは進みが遅く、残り時間に「300分」なんて表示されてびっくりしますが、後半は一気に進みます。

vmimport03

終わったら、ウィザードで指定したフォルダ以下に、仮想マシン名と同名のフォルダが作成されます。OVFには、本来のVMware環境間でやり取りするためのデータ(mfファイル、ovfファイル)が含まれますが、今回はvmdkファイル(仮想ディスク)のみを使用します。逆に言うと、仮想マシンの構成情報(CPU数や搭載メモリなど)はマイグレーションできません。

vmimport04

検証環境では、このファイルをEC2 API Toolsを実行するPCにコピーしました。

2. EC2 API Toolの実行

VM Importは、EC2 API Toolのec2-import-instanceコマンドを使用します。EC2 API Toolのセットアップは割愛しますが、X509鍵が必要なことに注意してください。IAMアカウントだと、結構面倒です(参考:雑記帳 - IAMアカウントでX.509証明書が使えるようにする)。

コマンドのオプションがそれなりにあるので、まずは-hオプションでヘルプを確認するのがお奨めです。手入力は大変なので、今回はシェルスクリプトで実行しました。たいしたものではないですが、Gistに上げておいたので参考になれば。

vmimport.bash

#!/bin/bash

VMDK=<YOUR-VMDK-FILENAME>.vmdk
S3_OWNER_ACCESS_KEY=<YOUR_ACCESS_KEY>
S3_OWNER_SECRET_KEY=<YOUR_ACCESS_SECRET_KEY>
S3_BUCKET_NAME=<YOUR_BUCKET_NAME>

ec2-import-instance \
	$VMDK \
	-t m1.small \
	-f VMDK \
	-a x86_64 \
	--bucket $S3_BUCKET_NAME \
	-o $S3_OWNER_ACCESS_KEY \
	-w $S3_OWNER_SECRET_KEY

で、実行します。

$ ./vmimport.bash
Requesting volume size: 20 GB
TaskType	IMPORTINSTANCE	TaskId	import-i-fh5nex9z ExpirationTime	2013-04-10T07:29:14Z	Status	active StatusMessage	Pending	InstanceID	i-XXXXXXXX
DISKIMAGE	DiskImageFormat	VMDK	DiskImageSize 3433390592	VolumeSize	20	AvailabilityZone	ap-southeast-1a	ApproximateBytesConverted	0	Status	active StatusMessage	Pending
Creating new manifest at otaki-vmimport-tmp/c971f379-cdf9-4bea-9b1c-f3e72f0d2709/Win2008R2-01-disk1.vmdkmanifest.xml
Uploading the manifest file
Uploading 3433390592 bytes across 328 parts
0% |--------------------------------------------------| 100%
   |===

最後のインジケータが100%になるまで待っている間に、S3バケットを確認しておきましょう。
アップロード先に指定したS3バケットの下にランダム名のフォルダが作成され、10MBごとにスライスされたディスクイメージファイルが作成されていきます。

vmimport05

アップロードが完了すると、以下のように、転送レートのレポートと、S3からEC2 EBSへのデータ変換の確認に関するメッセージが表示されます。

0% |--------------------------------------------------| 100%
   |==================================================|
Done
Average speed was 1.837 MBps
The disk image for import-i-fh5nex9z has been uploaded to Amazon S3
where it is being converted into an EC2 instance.  You may monitor the
progress of this task by running ec2-describe-conversion-tasks.  When
the task is completed, you may use ec2-delete-disk-image to remove the
image from S3.

今回の仮想マシンはOSをクリーンインストールした状態のものだったため、ディスク使用量は3GB程度で10分〜20分程度で転送できました。この辺りはESXiのI/O性能、上りのネットワークの帯域などいろんな要因から制約を受けると思いますが、それなりの速度で行ってくれそうな感じがします。

3. EC2インスタンスを確認

先ほどのメッセージにもあったように、S3バケットへのアップロード後、EC2 EBSへのディスクデータの変換がAWS側で進みます。進捗は、ec2-describe-conversion-tasksコマンドで確認できます。今回は、ちょっと離席しているうちに終わってしまったので、変換にかかる時間はわかりませんでした。変換完了後ですが、実行例を以下に示します(実際のコマンド出力は整形されておらず、ダバダバと出力されます)。あと、出力結果のTaskId(import-i-XXXXXXXX)をメモしておきましょう。後始末で使います。

$ ec2-describe-conversion-tasks
TaskType	IMPORTINSTANCE
TaskId	import-i-XXXXXXXX
ExpirationTime	2013-04-10T07:29:14Z
Status	completed
InstanceID	i-XXXXXXXX DISKIMAGE
DiskImageFormat	VMDK
DiskImageSize	3433390592
VolumeId	vol-XXXXXXXX
VolumeSize	20
AvailabilityZone	ap-southeast-1a ApproximateBytesConverted	3433386784
Status	completed

作成されたインスタンスはStop状態なので、StartしてあげればRDPなどで接続できるようになります。

vmimport06

4. 後始末

マイグレーションが終わったら、S3バケットのイメージデータは不要になります。ec2-delete-disk-imageコマンドでまるっと削除しましょう。

ec2-delete-disk-image -o <YOUR_ACCESS_KEY> -w <YOUR_ACCESS_SECRET_KEY> -t import-i-XXXXXXXX
0% |--------------------------------------------------| 100%
   |==================================================|
Done

これで、S3バケットもすっきりしました。

vmimport07

はまったところ

vSphere Clientには、VMDKファイルを直接ダウンロードするデータストアブラウザという機能がありますが、データストアブラウザ経由でダウンロードしたVMDKファイルは以下のエラーでインポートできませんでした。

ERROR: This does not appear to be a Stream Optimized VMDK. It contains invalid magic number 1766072355

参考 : AWS Developer Forums: VMWare to EC2 import fails with "ERROR: ...

あと、ec2-import-instanceコマンド実行時に-gオプション(セキュリティグループの指定)を省略すると、defaultグループになるのにも注意。defaultグループでまずい場合は、RDPのポートを開けたセキュリティグループを別途指定しましょう。非VPCだとインスタンス作成後はセキュリティグループの変更ができないので、詰みます。今回はdefaultグループを直接いじってしまいました。反省。

まとめ

今回は、VM Importのうち、EC2 API Toolを使用した仮想マシンのマイグレーションを試してみました。実際のマイグレーションにかかる時間は、データ量などケースごとに異なりますが、手順自体はシンプルに行うことができるようになっています。 VM Importは、既存のVMware環境からAWSへ移行する実用的な選択肢として使えると思います。

次回は、せっかくなのでインポートしたWindowsの構成などの様子を、もう少し細かくレポートしてみます。

脚注

  1. vSphere Clientを実行するPCと同じでも全然OKです。
  2. 2013/04/03現在
  3. OVA形式の場合は、OVAファイルのみ作成され、VMDKファイルが作成されません。