VMWareの仮想環境をVM Import/ExportでEC2に移行する


稼働中のサービスをAWSに移行することがあったので、その時のメモです。

環境

  • CentOS6.4

参考にさせていただいたサイト

http://edu.jtp.co.jp/column/89
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/CommandLineReference/set-up-ec2-cli-linux.html
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/CommandLineReference/ApiReference-cmd-ImportInstance.html
http://hacknote.jp/archives/13234/

手順

  1. S3 Bucketを用意する。
  2. EC2 API Toolsをインストールする。
  3. OVFToolをインストールする。
  4. OVFToolでディスクイメージを書き出す。
  5. EC2 API ToolsでVM Import/Exportを実施してEC2に移行する。
  6. 動作確認とAMI化をする。

1. S3 Bucketを用意する。

移行に際して、ローカル環境のイメージはS3にアップロードされてから変換される流れになります。従ってS3 Bucketを用意しましょう。

(作り方は割愛します。)

2. EC2 API Toolsをインストールする。

インポート自体はコマンドラインツールによって行いますので、インストールします。インストール方法は 公式ドキュメント に従って行えばよいです。

2-1. コマンドをダウンロードする。

wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip

2-2. ファイルを解凍する。

mkdir /usr/local/ec2
sudo unzip ec2-api-tools.zip -d /usr/local/ec2

2-3. 環境変数を用意する。

which java
#=> /usr/bin/java

file $(which java)
#=> /usr/bin/java: symbolic link to `/etc/alternatives/java'

file /etc/alternatives/java
#=> /etc/alternatives/java: symbolic link to `/usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java'

file /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java
#=> /usr/lib/jvm/jre-1.6.0-openjdk.x86_64/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

export JAVA_HOME=/usr/lib/jvm/jre-1.6.0-openjdk.x86_64
export EC2_HOME=/usr/local/ec2/ec2-api-tools-1.7.5.1

下から3行分の export.bashrc なりに書いておくと良いでしょう。
上の方の whichfile コマンドではjavaの置き場所を探しています。これも公式ドキュメントに書かれてある手順の通りですので、そちらも見てください。結果的に出てきている $JAVA_HOME はあくまでも僕の環境での値です。

2-4. PATHを通す。

export PATH=$PATH:$EC2_HOME/bin

こちらも .bashrc に書いておくと良いです。

2-5. 動作を確認する。

ec2-describe-regions -O FOOACCESSKEYID -W foosecretaccesskey
#=> REGION      ap-south-1      ec2.ap-south-1.amazonaws.com
#=> REGION      eu-west-1       ec2.eu-west-1.amazonaws.com
#=> REGION      ap-southeast-1  ec2.ap-southeast-1.amazonaws.com
#=> REGION      ap-southeast-2  ec2.ap-southeast-2.amazonaws.com
#=> REGION      eu-central-1    ec2.eu-central-1.amazonaws.com
#=> REGION      ap-northeast-2  ec2.ap-northeast-2.amazonaws.com
#=> REGION      ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
#=> REGION      us-east-1       ec2.us-east-1.amazonaws.com
#=> REGION      sa-east-1       ec2.sa-east-1.amazonaws.com
#=> REGION      us-west-1       ec2.us-west-1.amazonaws.com
#=> REGION      us-west-2       ec2.us-west-2.amazonaws.com

上記はリージョンを一覧表示するコマンドです。これが動けばインストール完了です。 -O オプションと -W オプションにはそれぞれ access_key_idsecret_access_key を入れてください。環境変数としてセットしておくことも可能です。今回はこの環境を後で壊すので直接コマンドに書いています。

これでEC2 API Toolsはインストール完了です。

Tips: ec2-describe-regions に失敗する場合は?

僕の環境ではこのコマンドは最初は 401 エラーが出て失敗しました。他の環境ではいつも普通に使えるのに何故・・・。調べた所、 OSの時刻がズレているとエラーが出る とのこと。 ntpdate コマンドで時刻を直しましょう。

date
#=> 2016年  8月  8日 月曜日 12:20:12 JST

ntpdate -b ntp.nict.jp
#=> 8 Aug 12:07:36 ntpdate[31721]: step time server 133.243.238.244 offset -765.667802 sec

date
#=> 2016年  8月  8日 月曜日 12:07:38 JST # ズレ杉ぃ!

3. OVFToolをインストールする。

VMWareのイメージをOVF形式で書き出すには、VMWare謹製の OVFTool が必要になります。インストールしましょう。

ダウンロードするにはMy VMWareへのアカウント登録が必要ですので、先に登録してください。

対応OSにはWindowsとMacとLinuxがあります。今回はLinuxを使います。ダウンロードした .bundle ファイルを実行すればインストールされます。実行権限を与えるのを忘れないで下さい。

chmod gu+x VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle

./VMware-ovftool-3.5.0-1274719-lin.x86_64.bundle

4. OVFToolでマシンイメージを書き出す。

マシンイメージを書き出します。マシンイメージ自体は .vmx というファイルを使用しますので、見つけてください。

ovftool /var/vmware/images/foo/foo.vmx /usr/local/etc/foo/foo.ovf

上記コマンドで書き出されます。ちょっと時間がかかります。(サイズによる。)保存場所は、僕の場合は /usr/local/etc/ にしましたがどこでも良いでしょう。どうせ後で消すし。

ls /usr/local/etc/foo

foo-disk1.vmdk  foo.mf  foo.ovf

上記のようにディスクイメージが作成されます。この後でインポートに使用するのは .vmdk です。

5. EC2 API ToolsでVM Import/Exportを実施してEC2に移行する。

全ての準備が整いました。ここまで来たらインポートするコマンドを実行すればほぼ完了です。コマンドのオプションについては 公式ドキュメント を参照してください。

ec2-import-instance \
  foo-disk1.vmdk \            # ディスクイメージ
    -f VMDK \                 # イメージのフォーマット
    -a x86_64 \               # アーキテクチャ
    -p Linux \                # プラットフォーム (Windows|Linux)
    -t t2.micro \             # インスタンスタイプ
    -s 30 \                   # インスタンスボリューム
    -g FooProdWeb \           # セキュリティグループ
    -z ap-northeast-1c \      # Availability Zone
    --subnet subnet-foo \     # サブネット
    -b s3-foo \               # 中継するS3 Bucket
    -o FOOACCESSKEYID \       # access key id
    -w foosecretaccesskey \   # secret access key
    --region ap-northeast-1 \ # リージョン
    - O FOOACCESSKEYID \      # access key id
    - W foosecretaccesskey    # secret access key

アクセスキーの指定が2回出てきますが( -o-w-O-W )インポートのための認証と、S3中継時の認証で2つ必要とのことです。

Tips: イメージ変換中の状況確認をするには?

インポートはまずS3へのディスクイメージのアップロードから始まります。10MBずつに分割されてアップロードされていくのがS3のGUIコンソールからでも確認できるでしょう。

アップロードが完了するとインスタンス立ち上げの前にディスクイメージの変換処理に入ります。この進捗状況は下記のコマンドで確認するということができます。

ec2-describe-regions -O FOOACCESSKEYID -W foosecretkeyid

TaskType    IMPORTINSTANCE  TaskId  import-i-foo    ExpirationTime  2016-08-15T04:43:26Z    Status  completed   InstanceID  i-foo
DISKIMAGE   DiskImageFormat VMDK    DiskImageSize   6331476480  VolumeId    vol-foo VolumeSize  30  AvailabilityZone    ap-northeast-1c ApproximateBytesConverted   6331466240  Status  completed

6. 動作確認とAMI化をする。

イメージの変換が終わると、stop状態のEC2インスタンスとして用意されます。

これを起動して動作を確認した後に、AMIを保存すればいつでも使えるようになりますね。

出来上がったインスタンスにSSHログインする際は、(当然ですが)仮想マシンの中での設定がそのまま反映されています。(僕は何故か母艦の設定でログインしようとして少し焦りました笑)