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

181件のシェア(すこし話題の記事)

この記事は公開されてから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ファイルに行われます。

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

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

    静止点ディスクイメージをそのままダウンロードすることも可能ですが、
    このファイルのサイズは仮想ディスクのサイズとなっており、
    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まで縮小されています。
    このようにディスクサイズが小さくなります。

  3. 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ファイルは削除されました。

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

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

    ・ 仮想マシン構成ファイル(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 ← 三つ目
    
  5. ファイル変換

    このままのファイルでは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だけです。

  6. 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. 
    
  7. 動作確認

    環境でも記載しましたが、
    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を試していただければ幸いです。