[素朴な手順]EBSスナップショットからファイル復旧してみます
ベルリンのはんせです 題名のままですが、EBSスナップショットからファイル復旧する方法についてバババっと手順紹介したいと思います。
はじめに
EC2を使う上でもかなり基本的な内容で、当ブログでも何度か紹介されていますが、
最近でも本番インスタンスでファイルを誤削除してしまったという相談を受けることがありました。 急ぎの作業や夜中の対応で「やってしまった」という時に参照されるといいなと思います。
やってみます
作業環境はAmazon Linuxです。windowsはまたいつか。。
下準備:ディレクトリを誤削除します
/home/testというディレクトリでオペミスしたと仮定します。 ディレクトリの中身。4ファイルが格納されています。
[ec2-user@ip-172-xx-xx-xx ~]$ ls -l /home/ 合計 8 drwx------ 3 ec2-user ec2-user 4096 3月 1 18:20 ec2-user drwxr-xr-x 2 ec2-user ec2-user 4096 3月 1 11:45 test [ec2-user@ip-172-xx-xx-xx ~]$ ls -l /home/test/ 合計 16 -rw-rw-r-- 1 ec2-user ec2-user 2 3月 1 11:45 test1.txt -rw-rw-r-- 1 ec2-user ec2-user 3 3月 1 11:45 test2.txt -rw-rw-r-- 1 ec2-user ec2-user 4 3月 1 11:45 test3.txt -rw-rw-r-- 1 ec2-user ec2-user 5 3月 1 11:45 test4.txt [ec2-user@ip-172-xx-xx-xx ~]$ sha256sum /home/test/test* 87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 /home/test/test1.txt a63d8014dba891345b30174df2b2a57efbb65b4f9f09b98f245d1b3192277ece /home/test/test2.txt edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb /home/test/test3.txt fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b801d62c /home/test/test4.txt
で、、、
[ec2-user@ip-172-xx-xx-xx ~]$ sudo rm -rf /home/test [ec2-user@ip-172-xx-xx-xx ~]$ ls -l /home/ 合計 4 drwx------ 3 ec2-user ec2-user 4096 3月 1 18:20 ec2-user [ec2-user@ip-172-xx-xx-xx ~]$ ls -l /home/test ls: /home/test にアクセスできません: そのようなファイルやディレクトリはありません
やってしまいました。
復旧手順:既存のファイルシステムの確認
今回はAMIからまるっと復旧可能なケースではなく、稼働中サービスに影響が無いよう、必要なファイルだけを取り出して再配置したい場合を想定します(サービス復旧の観点から、AMIからインスタンスごと入れ替えることができればそちらの方が早いです)
というわけで、ファイルが存在していたボリュームを確認します。
[ec2-user@ip-172-xx-xx-xx ~]$ df -T ファイルシス タイプ 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs devtmpfs 499580 56 499524 1% /dev tmpfs tmpfs 508544 0 508544 0% /dev/shm /dev/xvda1 ext4 8123812 1062152 6961412 14% /
念のため作業対象のインスタンスIDも確認しておくとオペミス防止になると思います。
[ec2-user@ip-172-xx-xx-xx ~]$ curl http://169.254.169.254/latest/meta-data/instance-id/ && echo i-010d6bxxxxxxxxxxxx [ec2-user@ip-172-xx-xx-xx ~]$ exit ログアウト Connection to xx.xx.xx.xx closed.
復旧手順: 取得済みのAMIを確認する
取得日付などからオペミス前のAMIを確認します。(バックアップを取っていなかったらこの時点で完。
ありました。「Block Devices」の項目からsnapshotのIDも確認できます。
復旧手順: AMIからオペミス前のVolumeを作成
snapshotから作成します。IDから対象のsnapshotを見つけて「Create Volume」を実行
Create Volumeの画面。復旧先のインスタンスにアタッチするため、同じAvailability Zoneを指定する必要があります。他は特に選択をせず「Create Volume」をクリックします。
Volumeはすぐに作成され、availableの状態になっています。
復旧手順: Instanceの停止とボリュームアタッチ
停止中のインスタンスにしかアタッチができませんので、インスタンスを停止します。
インスタンスが停止できたらVolumeをアタッチします
アタッチ先のデバイスは /dev/sdb を指定します。
Instances画面でBlock Devicesに /dev/sdb が入っていることを確認します。
アタッチできていることが確認できましたので、インスタンスを起動
復旧手順: マウントとファイル取り出し
インスタンスにsshログインし、アタッチしたボリュームをマウント
[ec2-user@ip-172-xx-xx-xx ~]$ df ファイルシス 1K-ブロック 使用 使用可 使用% マウント位置 devtmpfs 499580 64 499516 1% /dev tmpfs 508544 0 508544 0% /dev/shm /dev/xvda1 8123812 1062488 6961076 14% / [ec2-user@ip-172-xx-xx-xx ~]$ sudo su - [root@ip-172-xx-xx-xx ~]# curl http://169.254.169.254/latest/meta-data/instance-id/ && echo i-010d6bbfcc1fc4589 [root@ip-172-xx-xx-xx ~]# mkdir /mnt/temp [root@ip-172-xx-xx-xx ~]# mount -t ext4 /dev/sdb1 /mnt/temp [root@ip-172-xx-xx-xx ~]# ls -l /mnt/temp/ total 120 dr-xr-xr-x 2 root root 4096 Jan 15 18:43 bin dr-xr-xr-x 4 root root 4096 Jan 15 18:43 boot drwxr-xr-x 2 root root 4096 Feb 28 2014 cgroup drwxr-xr-x 2 root root 4096 Jan 15 18:43 dev drwxr-xr-x 78 root root 4096 Mar 1 11:38 etc drwxr-xr-x 4 root root 4096 Mar 1 11:43 home dr-xr-xr-x 7 root root 4096 Jan 15 18:42 lib dr-xr-xr-x 10 root root 12288 Jan 15 18:43 lib64 drwxr-xr-x 2 root root 4096 Jan 15 18:42 local drwx------ 2 root root 16384 Jan 15 18:42 lost+found drwxr-xr-x 2 root root 4096 Jan 6 2012 media drwxr-xr-x 2 root root 4096 Mar 2 20:02 mnt drwxr-xr-x 3 root root 4096 Jan 15 18:43 opt drwxr-xr-x 2 root root 4096 Jan 15 18:42 proc dr-xr-x--- 3 root root 4096 Mar 2 20:01 root drwxr-xr-x 3 root root 4096 Mar 1 11:38 run dr-xr-xr-x 2 root root 12288 Jan 15 18:43 sbin drwxr-xr-x 2 root root 4096 Jan 6 2012 selinux drwxr-xr-x 2 root root 4096 Jan 6 2012 srv drwxr-xr-x 2 root root 4096 Jan 15 18:42 sys drwxrwxrwt 3 root root 4096 Mar 2 20:02 tmp drwxr-xr-x 13 root root 4096 Jan 15 18:42 usr drwxr-xr-x 19 root root 4096 Jan 15 18:43 var
良さそうです。削除してしまったファイルを確認します
[root@ip-172-xx-xx-xx ~]# ls -l /mnt/temp/home/test/ total 16 -rw-rw-r-- 1 ec2-user ec2-user 2 Mar 1 11:45 test1.txt -rw-rw-r-- 1 ec2-user ec2-user 3 Mar 1 11:45 test2.txt -rw-rw-r-- 1 ec2-user ec2-user 4 Mar 1 11:45 test3.txt -rw-rw-r-- 1 ec2-user ec2-user 5 Mar 1 11:45 test4.txt [root@ip-172-xx-xx-xx ~]# sha256sum /mnt/temp/home/test/test* 87428fc522803d31065e7bce3cf03fe475096631e5e07bbd7a0fde60c4cf25c7 /mnt/temp/home/test/test1.txt a63d8014dba891345b30174df2b2a57efbb65b4f9f09b98f245d1b3192277ece /mnt/temp/home/test/test2.txt edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb /mnt/temp/home/test/test3.txt fc4b5fd6816f75a7c81fc8eaa9499d6a299bd803397166e8c4cf9280b801d62c /mnt/temp/home/test/test4.txt
問題なさそうです。あとは元にあった場所にcpなりsyncなりをすれば完了です。
後しまつ: アンマウントとインスタンスのデタッチ
作業が完了したら、追加したボリュームの役割は終わりましたので、アンマウントを実行します
[root@ip-172-xx-xx-xx ~]# umount /mnt/temp/ [root@ip-172-xx-xx-xx ~]# mount proc on /proc type proc (rw,relatime) sysfs on /sys type sysfs (rw,relatime) devtmpfs on /dev type devtmpfs (rw,relatime,size=499580k,nr_inodes=124895,mode=755) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000) tmpfs on /dev/shm type tmpfs (rw,relatime) /dev/xvda1 on / type ext4 (rw,noatime,data=ordered) devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620,ptmxmode=000) none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,relatime)
アンマウントしたらボリュームのデタッチをしましょう。デタッチはRunnnigステータスのインスタンスに対しても可能です。また、強制的にデタッチ(Force Dettach)を実行しても問題ないかと思います(復旧用のEBSボリュームは使用しないため) インスタンスからの Amazon EBS ボリュームのデタッチから
ボリュームの状態がdetaching状態のまま変わらない場合は、[Force Detach] を選択して、強制的にアタッチ解除することもできます。障害が発生したインスタンスからボリュームをアタッチ解除するための最後の手段として、またはボリュームを削除するためにデタッチする場合のみ、このオプションを使用してください。インスタンスは、ファイルシステムキャッシュやファイルシステムメタデータをフラッシュする機会を失います。このオプションを使用する場合は、ファイルシステムのチェックと修復の手順を手動で実行する必要があります。
数分間で複数回、ボリュームのdetachingを強制実行しても、デタッチ状態のままの場合、Amazon EC2 forum にヘルプの要請を投稿できます。迅速に解決できるようにするため、ボリューム ID と、これまでに実行した手順を記述してください。
デタッチ済みのEBSボリュームは不要なため、削除しましょう。
最後に
AWSでも様々なデプロイサービスが提供されていますが、 - AWSでデプロイとスケーリングを自動化する方法まとめ | Qiita
一方で、簡素なインフラ構成で運用されているサービスもまだまだあると思います(昔からの運用を続けているなど)。 Ec2のリブートなしでAMI取得は可能ですので、作業前には必ずAMIを取得しましょう。 定期的にAMI取得ができているか・復旧手順があるか、もう一度確認しましょう。
※ 参考: Amazon EBS-Backed Linux AMI の作成 | Amazon Elastic Compute Cloud
それでは〜