前回は、EBS からバックアップした EBS Snapshot を使って AMI を作成しました。
今回は、AMI ではなく、直接 EBS Volume を作成し、EC2インスタンスにマウントしてみます。


・コピー元となるEBSを持つEC2インスタンスの確認
まず、コピー元となる EC2インスタンスの instance-id を取得します。
$ curl 'http://169.254.169.254/latest/meta-data/instance-id'; echo -en "\n"
i-3b0b4738

$ ec2-describe-instances i-3b0b4738
RESERVATION     r-83af1c80      354893364746    web
INSTANCE        i-3b0b4738      ami-486cd349    ec2-54-248-161-5.ap-northeast-1.compute.amazonaws.com   ip-10-128-75-156.ap-northeast-1.compute.internal    running default 0               t1.micro        2013-01-29T11:51:35+0000    ap-northeast-1b aki-42992843                    monitoring-disabled     54.248.161.5    10.128.75.156               ebs                                     paravirtual     xen     LvWjn1358508959781      sg-c42c45c5     default false
BLOCKDEVICE     /dev/sda1       vol-765ff554    2013-01-18T11:36:03.000Z        true
TAG     instance        i-3b0b4738      Name    Master AmazonLinux
上記結果から、以下のようになっていることが分かります。
    EC2 instance-id = i-3b0b4738
    EC2 AvailabilityZone = ap-northeast-1b
    EC2 Kernel-ID = aki-42992843  (今回は使わない値ですが)
    EBS Volume = vol-765ff554
    EBS のマウント位置 : /dev/sda1



・EBSスナップショト作成
スナップショットを作成するコマンドは ec2-create-snapshot 、スナップショットの状態を確認するコマンドは ec2-describe-snapshots です。では、実行してみましょう。
$ ec2-create-snapshot \
     --description 'Master AmazonLinux' \
     vol-765ff554

SNAPSHOT         snap-1cfff33c  vol-765ff554    pending 2013-01-29T12:02:38+0000                354893364746    8   Master AmazonLinux

$ ec2-describe-snapshots
SNAPSHOT        snap-1cfff33c   vol-765ff554    completed       2013-01-29T12:02:38+0000        100%    354893364746        8       Master AmazonLinux
今回使用しているEC2インスタンスのEBSは、デフォルトの8GBしか容量が無いので 比較的すぐに pending → completed になりますね。



・スナップショットからEBSボリューム作成
EBSボリュームを作成するのは ec2-create-volume コマンドです。アタッチするEC2インスタンスと同一 AvailavilityZone に作成する方が望ましいので、そのように指定します。
$ ec2-create-volume \
     --snapshot snap-1cfff33c \
     --availability-zone ap-northeast-1b
VOLUME  vol-59ca737b    8       snap-1cfff33c   ap-northeast-1b creating        2013-01-29T13:12:08+0000        standard

$ ec2-describe-volumes
VOLUME  vol-59ca737b    8       snap-1cfff33c   ap-northeast-1b available       2013-01-29T13:12:08+0000        standard
VOLUME  vol-765ff554    8       snap-1ee78f3f   ap-northeast-1b in-use  2013-01-18T11:36:03+0000        standard
ATTACHMENT      vol-765ff554    i-3b0b4738      /dev/sda1       attached        2013-01-18T11:36:03+0000        true
ec2-describe-volume の結果にも、新しく作成されたEBSボリュームが表示されていますね。
ちなみに、下側の vol-765ff554 は もともと存在していた(コピー元の) EBSボリュームです。




・EC2インスタンスへアタッチ
ec2-attach-volume というコマンドでアタッチ(EBSをEC2へ取り付け)するらしいけれど……。デバイス名の指定が必要らしい。空いているデバイス名を探す必要がありますね。
$ mount
/dev/xvda1 on / type ext4 (rw,noatime)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  887M  7.0G  12% /
tmpfs                 301M     0  301M   0% /dev/shm
…わからん。
ec2-describe-instances による情報では「デフォルトのEBS は /dev/sda1 にアタッチされている」ということだったけど……。/dev/xvda1 とは何だ???

とりあえず、ec2-describe-instances の情報通り /dev/sda1 に EBSがアタッチされているのだと信じます。それに倣うのであれば、新しいEBSボリュームは /dev/sdb1 にアタッチすることになります(別に、他のデバイス名でも良いけど……/dev/sda999 とかでもOKなのかな?[謎])。
$ ec2-attach-volume vol-59ca737b --instance i-3b0b4738 --device /dev/sdb1
ATTACHMENT      vol-59ca737b    i-3b0b4738      /dev/sdb1       attaching       2013-01-29T13:33:10+0000

$ ec2-describe-instances i-3b0b4738
RESERVATION     r-83af1c80      354893364746    web
INSTANCE        i-3b0b4738      ami-486cd349    ec2-54-248-161-5.ap-northeast-1.compute.amazonaws.com   ip-10-128-75-156.ap-northeast-1.compute.internal    running default 0               t1.micro        2013-01-29T11:51:35+0000    ap-northeast-1b aki-42992843                    monitoring-disabled     54.248.161.5    10.128.75.156               ebs                                     paravirtual     xen     LvWjn1358508959781      sg-c42c45c5     default false
BLOCKDEVICE     /dev/sda1       vol-765ff554    2013-01-18T11:36:03.000Z        true
BLOCKDEVICE     /dev/sdb1       vol-59ca737b    2013-01-29T13:33:10.000Z        false
TAG     instance        i-3b0b4738      Name    Master AmazonLinux
新しく作成したEBSボリュームをEC2インスタンスにアタッチできたみたい。
次は mount してみます。ここでは /mnt/extra というディレクトリを作成し、ソコをマウントポイントにします。
$ sudo mkdir -p /mnt/extra

$ sudo mount /dev/sdb1 /mnt/extra

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  887M  7.0G  12% /
tmpfs                 301M     0  301M   0% /dev/shm
/dev/xvdb1            7.9G  887M  7.0G  12% /mnt/extra

$ ls -lah /mnt/extra/
total 108K
dr-xr-xr-x 22 root root 4.0K Jan 29 11:52 .
drwxr-xr-x  3 root root 4.0K Jan 29 13:16 ..
-rw-r--r--  1 root root    0 Jan 29 11:52 .autofsck
dr-xr-xr-x  2 root root 4.0K Oct  8 17:10 bin
dr-xr-xr-x  3 root root 4.0K Oct  8 17:10 boot
drwxr-xr-x  2 root root 4.0K Jan  6  2012 dev
drwxr-xr-x 67 root root 4.0K Jan 29 11:52 etc
drwxr-xr-x  3 root root 4.0K Oct  8 18:10 home
dr-xr-xr-x 15 root root  12K Oct  8 18:10 lib
drwxr-xr-x  2 root root 4.0K Oct  8 17:06 local
drwx------  2 root root  16K Oct  8 17:06 lost+found
drwxr-xr-x  2 root root 4.0K Jan  6  2012 media
drwxr-xr-x  2 root root 4.0K Jan  6  2012 mnt
drwxr-xr-x  3 root root 4.0K Oct  8 17:08 opt
drwxr-xr-x  2 root root 4.0K Oct  8 17:06 proc
dr-xr-x---  3 root root 4.0K Jan 18 11:36 root
dr-xr-xr-x  2 root root 4.0K Oct  8 17:10 sbin
drwxr-xr-x  2 root root 4.0K Jan  6  2012 selinux
drwxr-xr-x  2 root root 4.0K Jan  6  2012 srv
drwxr-xr-x  2 root root 4.0K Oct  8 17:06 sys
drwxrwxrwt  5 root root 4.0K Jan 29 11:58 tmp
drwxr-xr-x 12 root root 4.0K Oct  8 17:06 usr
drwxr-xr-x 19 root root 4.0K Oct  8 17:10 var
mount できた。

/dev/sdb1 というデバイス名にしたはずが、なぜか /dev/xvdb1 という名前に変換されていますね…。EBS の仕組みせい? あるいは AmazonLinux は、そういう挙動をするのかしら? 分からない……。

とりあえず、マウント自体は出来ているのでヨシとしておきます。




・後始末
まずは unmount (=umountコマンド)から。
umount するデバイス名は… /dev/xvdb1 と /dev/sdb1 と、どちらで指定しても良いみたい。謎すぎる。ここでは /dev/sdb1 として umount しておきます。
$ sudo umount /dev/sdb1

$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/xvda1            7.9G  887M  7.0G  12% /
tmpfs                 301M     0  301M   0% /dev/shm
次は EBS Volume のデタッチ(切り離し)。
ec2-detach-volume コマンドに EBS Volume ID だけ指定すれば良いみたい。
$ ec2-detach-volume vol-59ca737b
ATTACHMENT      vol-59ca737b    i-3b0b4738      /dev/sdb1       detaching       2013-01-29T13:33:10+0000
あるいは、間違ったVolume をdetachしてしまうトラブルを避けるなら、instance-ID と デバイス名 を両方とも指定する方が良いかも。以下、全部指定する場合の例。指定を間違えるとエラーになっているのが分かります。
$ ec2-detach-volume \
     vol-59ca737b
\
     --instance i-3b0b4738 \
     --device /dev/sdc1
Client.InvalidAttachment.NotFound: The volume 'vol-59ca737b' is not attached to instance 'i-3b0b4738' as device '/dev/sdc1'.
    ⇒ /dev/sdc1 なんて名前のデバイスは無い

$ ec2-detach-volume \
     vol-59ca737b
\
     --instance i-3b0b4738 \
     --device /dev/xvdb1
Client.InvalidAttachment.NotFound: The volume 'vol-59ca737b' is not attached to instance 'i-3b0b4738' as device '/dev/xvdb1'.
    ⇒ umount と違って /dev/xvdb1 というデバイス名では認識されない

$ ec2-detach-volume \
     vol-59ca737b \
     --instance i-3b0b4738 \
     --device /dev/sdb1
ATTACHMENT      vol-59ca737b    i-3b0b4738      /dev/sdb1       detaching       2013-01-29T13:46:10+0000

$ ec2-describe-instances i-3b0b4738
RESERVATION     r-83af1c80      354893364746    web
INSTANCE        i-3b0b4738      ami-486cd349    ec2-54-248-161-5.ap-northeast-1.compute.amazonaws.com   ip-10-128-75-156.ap-northeast-1.compute.internal    running default 0               t1.micro        2013-01-29T11:51:35+0000    ap-northeast-1b aki-42992843                    monitoring-disabled     54.248.161.5    10.128.75.156               ebs                                     paravirtual     xen     LvWjn1358508959781      sg-c42c45c5     default false
BLOCKDEVICE     /dev/sda1       vol-765ff554    2013-01-18T11:36:03.000Z        true
TAG     instance        i-3b0b4738      Name    Master AmazonLinux
これでデタッチ(切り離し)できました。


次は、 EBS Volume の削除。ec2-delete-volume コマンドを使用します。
$ ec2-delete-volume vol-59ca737b
VOLUME  vol-59ca737b

$ ec2-describe-volumes vol-59ca737b
Client.InvalidVolume.NotFound: The volume 'vol-59ca737b' does not exist.

$ ec2-describe-volumes
VOLUME  vol-765ff554    8       snap-1ee78f3f   ap-northeast-1b in-use  2013-01-18T11:36:03+0000        standard
ATTACHMENT      vol-765ff554    i-3b0b4738      /dev/sda1       attached        2013-01-18T11:36:03+0000        true
消えました。
一個残っている EBS Volume は、起動している AamzonLinux 自身が使用しているモノですね。



残っている EBS Snapshot を確認してみます。
$ ec2-describe-snapshots
SNAPSHOT        snap-1cfff33c   vol-765ff554    completed       2013-01-29T12:02:38+0000        100%    354893364746        8       Master AmazonLinux
ところで EBS Snapshot にも VolumeID があるけど、直接 EBS として attach できるのでしょうか??? 試してみます…。
$ ec2-attach-volume vol-765ff554 --instance i-3b0b4738 --device /dev/sdc1
Client.VolumeInUse: vol-765ff554 is already attached to an instance
あら???
この VolumeID が何なのか調べてみましょう。
$ ec2-describe-volumes vol-765ff554
VOLUME  vol-765ff554    8       snap-1ee78f3f   ap-northeast-1b in-use  2013-01-18T11:36:03+0000        standard
ATTACHMENT      vol-765ff554    i-3b0b4738      /dev/sda1       attached        2013-01-18T11:36:03+0000        true
あああぁぁ…。
この VolumeID は、バックアップ取得元の EBS VolumeID ということなのですね...(つまり、最初から存在していたEBS Volume である…と)。



最後に、不要になったスナップショットを ec2-delete-snapshot コマンドで削除します。
$ ec2-delete-snapshot snap-1cfff33c
SNAPSHOT        snap-1cfff33c
$ ec2-describe-snapshots

消えました。





これで、コマンドラインから EBS ボリュームのスナップショット(バックアップ)を作成し、そこから 再度 EC2インスタンスへアタッチ可能な EBS ボリュームを作成することが出来るようになりました。



今回はここまで。