話題の記事

VMwareからAWSへのVM無停止移行

2015.07.14

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

はじめに

藤本です。

前職でVMware製品を触っていたこともあり、VMwareの記事をエントリします。

AWSはVM Import機能により外部からマシンイメージを持ち込むことができ、 移行し易い環境を用意してくれています。 VMwareからの移行の場合、 VMのディスクイメージであるVMDKファイルをインポートすることができます。

過去に弊社大瀧がエントリした記事でVMをOVFテンプレートのエクスポート機能を利用すれば、 VMware(ESXi)上で動作する仮想マシンをAWSに移行することができます。 VM ImportでVMwareからAWS EC2へマイグレーションしてみた

ただし、このOVFテンプレートのエクスポート機能を利用する場合、VMを停止している必要があります。 移行したいVMが停止できるものであればいいですが、 中には社内で停止の許可を得るのが難しいものもあれば、 サイズによってはエクスポートに数時間かかり、そんなに長く止められないものもあります。

そこで今回はVMを停止せずにフランクにAWSへ移行する方法をご紹介します。

注意していただきたいこととして、 VMwareのスナップショット機能で静止点を設けるため、 本番移行は大瀧のエントリの方式を利用することをオススメします。

本エントリの対象はAWSをとりあえず試してみたい方とします。

vCenterのクローン機能を利用することでも無停止でのエクスポートは可能です。 VMを作成・削除するハードルが低ければ、クローンしたVMをエクスポートすることで対応可能です。

概要

VMwareのスナップショットを活用してディスクイメージの静止点を取得し、 静止点のディスクイメージをAWS環境に適合するフォーマットへ変換し、 VM ImportでAWS環境へ移行します。

以下が手順の大枠となります。

  1. VMのスナップショット作成
  2. 静止点ディスクイメージのクローン
  3. VMのスナップショット削除(※)
  4. ファイルダウンロード
  5. ファイル変換
  6. AWSへ移行

やってみた

環境

  • HyperVisor : ESXi 6.0
  • 移行対象OS : CentOS 6.6 AWSはコンソールアクセスできないため、Linuxサーバを持ち込む場合、SSHアクセスできるようにしておくことが必須です。
  • クライアント : OSX 10.10.3

今回はスクリプトによる自動化に向けて、全てCLIで実施します。

  1. VMのスナップショット作成

ESXiへSSH接続します。 ESXiはデフォルトSSH接続が無効状態ですので有効にしておいてください。

VMのIDを取得します。

# vim-cmd vmsvc/getallvms
Vmid Name File Guest OS Version Annotation
1 win2k12r2 [local_ssd] win2k12r2/win2k12r2.vmx windows8Server64Guest vmx-11
2 centos7 [local_ssd] centos7/centos7.vmx rhel7_64Guest vmx-11
3 win7-02 [local_ssd] win7-02/win7-02.vmx windows7_64Guest vmx-11
4 win7-01 [local_ssd] win7/win7.vmx windows7_64Guest vmx-11
5 centos6-web [local_ssd] centos6-web/centos6-web.vmx otherGuest vmx-11
7 centos6 [local_ssd] centos6/centos6.vmx rhel6_64Guest vmx-11

今回はcentos6を対象とします。

# vim-cmd vmsvc/snapshot.create 7 `date +%Y%m%d`
Create Snapshot:
# vim-cmd vmsvc/snapshot.get 7
Get Snapshot:
|-ROOT
--Snapshot Name : 20150712
--Snapshot Id : 1
--Snapshot Desciption :
--Snapshot Created On : 7/12/2015 6:31:12
--Snapshot State : powered off
# ls -l /vmfs/volumes/local_ssd/centos6/
total 3382288
-rw------- 1 root root 16797696 Jul 12 09:54 centos6-000001-delta.vmdk
-rw------- 1 root root 317 Jul 12 09:54 centos6-000001.vmdk
-rw------- 1 root root 2147483648 Jul 12 06:29 centos6-32cccaac.vswp
-rw------- 1 root root 19372 Jul 12 09:54 centos6-Snapshot2.vmsn
-rw------- 1 root root 8589934592 Jul 12 09:54 centos6-flat.vmdk
-rw------- 1 root root 8684 Jul 12 09:54 centos6.nvram
-rw------- 1 root root 495 Jul 12 09:29 centos6.vmdk
-rw-r--r-- 1 root root 371 Jul 12 09:54 centos6.vmsd
-rwxr-xr-x 1 root root 2350 Jul 12 09:54 centos6.vmx
-rw------- 1 root root 0 Jul 12 06:29 centos6.vmx.lck
-rwxr-xr-x 1 root root 2343 Jul 12 09:54 centos6.vmx~
-rw-r--r-- 1 root root 197937 Jul 12 06:26 vmware-1.log
-rw-r--r-- 1 root root 167066 Jul 12 09:43 vmware.log
-rw------- 1 root root 199229440 Jul 12 06:29 vmx-centos6-852282028-1.vswp

deltaファイルが作成されます。 以降の書き込みはdeltaファイルに行われます。

  1. 静止点ディスクイメージのクローン

スナップショットを作成すると静止点ディスクイメージはロックが解除され、 操作することが可能となります。

静止点ディスクイメージをそのままダウンロードすることも可能ですが、 このファイルのサイズは仮想ディスクのサイズとなっており、 100GBのディスクサイズで指定した仮想ディスクのflat.vmdkファイルは100GBで作成されます。

一度、monosparseタイプでディスクをクローンすることで、 ディスクイメージを実使用量とまではいきませんが、縮小することができます。 縮小することができるとはいえ、 ディスクイメージですのでクローン先のディスク空き状況に注意してください。 またこの後にダウンロードする必要があるので、 NASが用意できるのであれば、 ESXiにマウントしてそちらをクローン先にすることをオススメします。

# vmkfstools -i /vmfs/volumes/local_ssd/centos6/centos6.vmdk -d monosparse /vmfs/volumes/local_ssd/centos6.vmdk
Destination disk format: monolithic sparse disk
Cloning disk 'centos6/centos6.vmdk'...
Clone: 100% done.
# ls -l centos6/centos6-flat.vmdk
-rw------- 1 root root 8589934592 Jul 12 09:54 centos6/centos6-flat.vmdk
# ls -l centos6-s001.vmdk
-rw------- 1 root root 835715072 Jul 12 08:35 centos6-s001.vmdk

今回のVMは仮想ディスクサイズを8GBで作成し、 OSインストール直後であるため、800MBまで縮小されています。 このようにディスクサイズが小さくなります。

  1. VMのスナップショット削除

こちらはタイミングを考えて実施してください。

考慮するポイントとして、以下が挙げられます。

・ VMwareのスナップショットは読み取り性能がわずかながら低下する ・ スナップショットを削除(ディスクイメージをマージ)する時にディスクIOが高くなる ・ 差分ファイルが大きくなるとスナップショットの削除に時間がかかる

スナップショットは早く削除したいが、 絶賛IO負荷高い時は削除したくないというジレンマに陥ります。

# vim-cmd vmsvc/snapshot.get 7
Get Snapshot:
|-ROOT
--Snapshot Name : 20150712
--Snapshot Id : 1
--Snapshot Desciption :
--Snapshot Created On : 7/12/2015 6:31:12
--Snapshot State : powered off
# vim-cmd vmsvc/snapshot.remove 7 1
Remove Snapshot:
# ls -l /vmfs/volumes/local_ssd/centos6
total 3363856
-rw------- 1 root root 2147483648 Jul 12 06:29 centos6-32cccaac.vswp
-rw------- 1 root root 8589934592 Jul 12 10:40 centos6-flat.vmdk
-rw------- 1 root root 8684 Jul 12 10:40 centos6.nvram
-rw------- 1 root root 495 Jul 12 10:40 centos6.vmdk
-rw-r--r-- 1 root root 43 Jul 12 10:40 centos6.vmsd
-rwxr-xr-x 1 root root 2343 Jul 12 10:40 centos6.vmx
-rw------- 1 root root 0 Jul 12 06:29 centos6.vmx.lck
-rwxr-xr-x 1 root root 2350 Jul 12 10:40 centos6.vmx~
-rw-r--r-- 1 root root 197937 Jul 12 06:26 vmware-1.log
-rw-r--r-- 1 root root 179051 Jul 12 09:55 vmware.log
-rw------- 1 root root 199229440 Jul 12 06:29 vmx-centos6-852282028-1.vswp

deltaファイルは削除されました。

  1. ファイルダウンロード

必要ファイルをダウンロードします。

・ 仮想マシン構成ファイル(vmx) ・ クローンで作成された仮想マシンディスクイメージ(サイズが大きいvmdk) ・ クローンで作成された仮想マシンディスクイメージディスクリプタ(サイズが小さいvmdk)

# ls -l /vmfs/volumes/local_ssd/centos6/
total 3363856
-rw------- 1 root root 2147483648 Jul 12 06:29 centos6-32cccaac.vswp
-rw------- 1 root root 8589934592 Jul 12 10:40 centos6-flat.vmdk
-rw------- 1 root root 8684 Jul 12 10:40 centos6.nvram
-rw------- 1 root root 495 Jul 12 10:40 centos6.vmdk
-rw-r--r-- 1 root root 43 Jul 12 10:40 centos6.vmsd
-rwxr-xr-x 1 root root 2343 Jul 12 10:40 centos6.vmx ← 一つ目
-rw------- 1 root root 0 Jul 12 06:29 centos6.vmx.lck
-rwxr-xr-x 1 root root 2350 Jul 12 10:40 centos6.vmx~
-rw-r--r-- 1 root root 197937 Jul 12 06:26 vmware-1.log
-rw-r--r-- 1 root root 179051 Jul 12 09:55 vmware.log
-rw------- 1 root root 199229440 Jul 12 06:29 vmx-centos6-852282028-1.vswp
# ls -l /vmfs/volumes/local_ssd/
total 9025624
-rw------- 1 root root 835715072 Jul 12 08:35 centos6-s001.vmdk ← 二つ目
-rw------- 1 root root 510 Jul 12 08:35 centos6.vmdk ← 三つ目
  1. ファイル変換

このままのファイルではAWSへインポートできないため、 OVF(仮想機械のイメージフォーマット形式)に則ったフォーマットに変換します。

OVFフォーマットへの変換ツールはVMware社のサイトからダウンロードできます。 以下のURLからダウンロード可能です。

OVF Tool

https://www.vmware.com/support/developer/ovf/

ユーザー登録(無料でOK)をすればダウンロード可能です。

今回はMacOSX用をダウンロード・インストールしました。 Windows用の使い方は分かりません。。。

インストールするとovftoolコマンドが利用できるようになるので、 vmxファイルを読み込んで、vmdkファイルを変換します。

$ /Applications/VMware\ OVF\ Tool/ovftool centos6.vmx centos6.ovf
Opening VMX source: /Users/fujimoto.shinji/centos6.vmx
Opening OVF target: /Users/fujimoto.shinji/centos6.ovf
Writing OVF package: /Users/fujimoto.shinji/centos6.ovf
Transfer Completed
Completed successfully
$ ls -l
-rw-r--r-- 1 fujimoto.shinji staff 311236096 7 12 18:03 centos6-disk1.vmdk
-rw------- 1 fujimoto.shinji staff 835715072 7 12 17:44 centos6-s001.vmdk
-rw-r--r-- 1 fujimoto.shinji staff 127 7 12 18:03 centos6.mf
-rw-r--r-- 1 fujimoto.shinji staff 5873 7 12 18:03 centos6.ovf
-rw------- 1 fujimoto.shinji staff 510 7 12 17:57 centos6.vmdk
-rwxr-xr-x 1 fujimoto.shinji staff 2343 7 12 18:02 centos6.vmx
-rwxr-xr-x 1 fujimoto.shinji staff 2350 7 12 17:58 centos6.vmx.bak

以下のファイルが作成されました。 ・ centos6-disk1.vmdk ・ centos6.mf ・ centos6.ovf

AWSへの移行に利用するファイルはcentos6-disk1.vmdkだけです。

  1. AWSへVMインポート

AWSへのインポートはVM ImportでVMwareからAWS EC2へマイグレーションしてみたをご参照ください。

$ ./ec2-import-instance ~/centos6-disk1.vmdk -t t2.micro -f VMDK -a x86_64 -b ***** -o ************* -w *********************** --region ap-northeast-1 -p Linux
Requesting volume size: 8 GB
TaskType IMPORTINSTANCE TaskId import-i-fgns3ixv ExpirationTime 2015-07-19T09:30:35Z Status active StatusMessage Pending InstanceID i-297e0adc
DISKIMAGE DiskImageFormat VMDK DiskImageSize 311236096 VolumeSize 8 AvailabilityZone ap-northeast-1c ApproximateBytesConverted 0 Status active StatusMessage Pending : Downloaded 0
Creating new manifest at fujimoto-test/ed660f54-4830-44c0-8b7f-7eccefd86d07/centos6-disk1.vmdkmanifest.xml
Uploading the manifest file
Uploading 311236096 bytes across 30 parts
Upload progress Estimated time Estimated speed
/ 100% [====================>] 5.634 MBps
********************* All 311236096 Bytes uploaded in 55s *********************
Done uploading.
Average speed was 5.634 MBps
The disk image for import-i-fgns3ixv 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.
  1. 動作確認

環境でも記載しましたが、 AWSはコンソール接続ができないため、Linuxを持ち込む場合、SSH接続できるようにしておくことが必須です。 私の環境ではインポートしたEC2インスタンスはパブリックIPアドレスを持っていなかったため、 EIPを関連付けることでパブリックIPアドレスを設定出来ました。 またセキュリティグループがdefaultで設定されたため、 SSH接続可能なセキュリティグループに変更しました。

$ ssh root@52.69.***.***
The authenticity of host '52.69.***.*** (52.69.***.***)' can't be established.
RSA key fingerprint is ea:1a:fd:cf:59:05:1c:bd:9b:0b:9a:64:22:3e:54:68.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '52.69.***.***' (RSA) to the list of known hosts.
root@52.69.***.***'s password:
[root@ip-172-31-25-30 ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)

接続できました。 証明できる情報を移行元に仕込んでおくのを忘れていました。。。

まとめ

いかがでしたでしょうか? 今までAWSをちょっと試してみたいけど移行のハードルの高さに手を出せない方もいらっしゃるのではないでしょうか? そういった方がこの方式を活用して、是非一度AWSを試していただければ幸いです。