【未解決問題】AWSのEC2インスタンスをt1.microからt2.microにしたい話

# なぜインスタンスを変更したいか
2012年からAndroidアプリの[相談電話](https://play.google.com/store/apps/details?id=foo.bar.soudan)というサービスを個人で運営しています。

![soudan.JPG](https://qiita-image-store.s3.amazonaws.com/0/272753/89048c83-38aa-ae62-8844-0aab3d09dfbe.jpeg)


このアプリは「相談したい人」と「相談されたい人」をマッチングして、無料で電話ができるアプリです。
SkypeやLINEのように、パケット通信を使って音声通話を行うため通話料もかかりません。
サービス開始から数年はそれなりに活況でダウンロード数は5万超え、1日の通話件数も2000件くらいありました。
しかし、それから放置したせいでユーザーは離れていき今は20～30件くらいしか使われてません。

サーバサイドはEC2のCentOS 5.4のt1.microインスタンスで提供していて、これが月3000円くらいかかっています。
同じサーバにAsterisk1.8.5、Apache2.2.3、PHP5.1.6、MySQL5.0.77を入れて動かしてます。
アプリに広告つけてるけど、ほとんどユーザーがいない今となっては赤字。でもサービス停止したくはないし。
で、インスタンスタイプをt2.microにすれば月1200円、t2.nanoにすれば実に月600円くらいに抑えられる試算です。

# インスタンスタイプ変更の壁
AWSのインスタンスタイプ変更なんてクリック1つじゃん。と思いきやそうではないのです。
どうやら古いEC2インスタンスであるt1世代はPV（paravirtual、準仮想化）という仮想化方式で、今のt2世代はHVM（Hardware-assited VM、ハードウェア仮想化）という方式なんだと。
下記に詳しく書いてありました。

- [仮想化方式(HVM と PV)についてまとめ](https://kanny.hateblo.jp/entry/2014/01/19/182759)

# どうするか？
自分でゼロから解決できるはずがないのでググったところ、ほぼやりたいことができそうな手順が載っていました。

- [EC2のt1.microをt2.microへ移行する](https://www.agilegroup.co.jp/technote/t1micro-to-t2micro-migration.html)

詳しくは上記リンクに図＆コマンド付きで書いてあるとおりですが、
1. 移行元サーバにgrubをインストールしてスナップショットから移行元ボリュームを作成
2. 作業用インスタンスを起動して、移行元ボリューム、移行先ボリュームの両方をマウント
3. ddで移行元から移行先にボリュームコピーして、HVM起動用の設定を入れ込む
4. HVMインスタンスで起動完了

と手数は多いがなんとかできそう。ということでやってみました。

# 作業用インスタンスでのgrubインストールでハマる
作業用インスタンスはAmazon Linuxを使います。
ec2-userでログイン後、rootになって前半は手順どおりうまくいっていました。
が、後半のchrootを利用したgrubインストールがうまくいきません

```shell-session

# mount /dev/xvdo1 /mnt
# cp -a /dev/xvdo /dev/xvdo1 /mnt/dev/
# rm -f /mnt/boot/grub/*stage*
# cp /mnt/usr/*/grub/*/*stage* /mnt/boot/grub/
# rm -f /mnt/boot/grub/device.map
# cat <<EOF | chroot /mnt grub --batch
> device (hd0) /dev/xvdo
> root (hd0,0)
> setup (hd0)
> EOF
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> device (hd0) /dev/xvdo
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no

Error 2: Bad file or directory type
```

/boot/grub/stage1" exists... noと出ているのだが、ファイルシステム上でみるとちゃんと存在してる。なぜだろう・・・

```shell-session
# cd /boot/grub
# ls -la | grep stage1
-rw-r--r-- 1 root root    512 Jul 18 07:53 stage1
```

# 別の方法を探す
諦めて他の手順を探そうとググったところ、AWSの日本語公式ページがひっかかりました。公開は2018年2月とわりと最近です。

- [Amazon Linux 準仮想化 AMI からハードウェア仮想マシン AMI にデータとアプリケーションを移行する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/migrate-linux-pv-hvm/)

やっぱり推奨はHVMインスタンスで作り直したあと、データをコピーしてソフトウェアをインストールしなおせとのこと。
ちなみに[相談電話](https://play.google.com/store/apps/details?id=foo.bar.soudan)のサーバはLinux、Apache、MySQL、PHPといういわゆるLAMP構成に、[Asterisk](https://www.asterisk.org/)というオープンIP-PBXで構築しています。
なにしろ作ったのは6年も前だから手順もうろ覚えだし、ソフトウェアもバージョン古いから手に入らないかもしれないし、最新バージョンだと動かないかもしれないし・・・
ということで、やっぱりなんとかしてPV→HVMの移行をしたいのです。

# 結局同じところでハマる
手順は大筋「[EC2のt1.microをt2.microへ移行する](https://www.agilegroup.co.jp/technote/t1micro-to-t2micro-migration.html)」と一緒っぽい。が、後半がちょっと違うようです。
手順15のgrubの再インストールでまたもハマってしまいました。

```shell-session

# chroot /mnt/
# yum reinstall grub -y
Loaded plugins: fastestmirror
Setting up Reinstall Process
Loading mirror speeds from cached hostfile
 * epel: ftp.iij.ad.jp
http://vault.centos.org/5.11/os/x86_64/repodata/repomd.xml: [Errno 4] IOError: <urlopen error (-3, 'Temporary failure in name resolution')>
Trying other mirror.
http://vault.centos.org/5.11/os/x86_64/repodata/repomd.xml: [Errno 4] IOError: <urlopen error (-3, 'Temporary failure in name resolution')>
・
・
（以下省略）
・
・
```
なぜか名前解決ができないようです。ここで小1時間調べたところ、chrootかそうでないかでresolv.confのDNSサーバの指定が異なることが判明。これを変更したら解決しました。
が、結局手順17の同じところで同じエラーorz

```shell-session

# cat <<EOF | chroot /mnt grub --batch
> device (hd0) /dev/xvdo
> root (hd0,0)
> setup (hd0)
> EOF
Probing devices to guess BIOS drives. This may take a long time.


    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> device (hd0) /dev/xvdo
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... no

Error 2: Bad file or directory type
```

# クロージング
Qiita初投稿なので、ハマリながらも最後には解決して載せようと思ったのですが解決できず。。
思い返せば3年ほど前にも移行を試みて断念した記憶が。。
ということでもう少し頑張ってみて、解決できたら追記しようと思います！

# 【追記】やっぱダメ
上記の後、以下のフォーラムでの議論も読みながらいろいろ試してみましたがやっぱりダメです。
https://forums.aws.amazon.com/thread.jspa?messageID=553638

- 移行元ボリューム15GB、移行先ボリューム20GBと大きくしていたので、両方15GBにそろえてみる
    - 変わらず
- 作業用インスタンスをAmazon Linux(64bit)から、移行元サーバと同じCentOS 5系(32bit)にしてみる
    - コマンドが通らず途中で挫折
- grubの再インストールをyumではなくrpmからインストールしてみる
    - インストールはできたがその後は同じところでハマる
- chrootでのgrubインストールを諦め、そのままルートボリュームを付け替えてインスタンス起動
    - ステータスチェックがOKにならずSSHできない
- grubの代わりにgrub2のインストールを試してみる（フォーラムのasimamiの方法）
    - 途中で挫折
- CentOSのHVMのAMIを起動して、/boot以外をrsyncする（フォーラムのAndy999Xの方法）
    - CentOSの同バージョンが見つからず挫折

ということでPV→HVMの移行は諦めて、サーバを1から再構築して、データベースを移行し、ElasticIPを付け替える方法にしようかと思います。

続きはこちら

- [【ハンズオン】AWS上にAsterisk13をインストールして電話してみる](https://qiita.com/hamham/items/9c15ae2fa5c025dc402d)