EBSをmount --bindしている環境でec2-bundle-volコマンドを使う場合の注意事項
最近こっそりAmazon EC2を使ってサーバ構築をしていたりします。
その中で大きくハマったところがあったのでメモしておきます。
参考にしたURL: Amazon EBSのボリュームを自動でattachしてマウントしたい - 旧cyberarchitect
例えば、EC2インスタンス上の /ebs ディレクトリにEBSをマウントしていて、自動起動スクリプト"/etc/rc.d/init.d/aws_ebs_mount"の中で、
#! /bin/sh # /etc/rc.d/init.d/aws_ebs_mount # chkconfig: 2345 30 70 # description: EBS Volume mount # # Some things that run always # Carry out specific functions when asked to by the system case "$1" in start) echo "Mounting Elastic Block Store Volumes." /root/mount_ebs_volume.py mount vol-xxxxxxxx /dev/sdf ext3 /ebs mount --bind /ebs/www /var/www #←部分的にマウント mount --bind /ebs/home/aquarla /home/aquarla #←部分的にマウント ;; stop) echo "Unmounting Elastic Block Store Volumes." /root/mount_ebs_volume.py unmount vol-xxxxxxxx /dev/sdf ext3 /ebs umount /dev/sdf ;; esac exit 0
のように"mount --bind"でディレクトリを部分的にマウントしている場合、ec2-bundle-volコマンドでイメージを作成しようとすると、
Excluding: /var/www # ←コレ! /sys /proc /proc/sys/fs/binfmt_misc /dev/pts /dev /home/aquarla # ←コレも!! /media /mnt /proc /sys /mnt/image /mnt/img-mnt
のように、マウント先のディレクトリ自体がイメージ作成対象から外れてしまい、AMI起動時に「マウント先のディレクトリが見つからない」というエラーになってしまいます。
ec2-bundle-volコマンドを実行する前に、全てのEBSをumountしておくとこういうことは起きないのですが、AMI作成の作業自体そこそこ時間を要するものなので、注意が必要ですね…。
…考えてみると、AMIを作成するのにいちいちEBSをアンマウントする必要があるとすると、運用中のシステムではAMI作成出来ないことになるな…どうしよう…。
EBSマウントしているディレクトリが除外されるのは諦めることにして、マウントエラーが起こらないように、自動起動スクリプト内でいちいちディレクトリを作れば解決?
#! /bin/sh # /etc/rc.d/init.d/aws_ebs_mount # chkconfig: 2345 30 70 # description: EBS Volume mount # # Some things that run always # Carry out specific functions when asked to by the system case "$1" in start) echo "Mounting Elastic Block Store Volumes." /root/mount_ebs_volume.py mount vol-xxxxxxxx /dev/sdf ext3 /ebs mkdir -p /var/www # ←ないかもしれないので作る mkdir -p /home/aquarla # ←ないかもしれないので作る chown aquarla:aquarla /home/aquarla # ←所有者を変更 mount --bind /ebs/www /var/www mount --bind /ebs/home/aquarla /home/aquarla ;; stop) echo "Unmounting Elastic Block Store Volumes." /root/mount_ebs_volume.py unmount vol-xxxxxxxx /dev/sdf ext3 /ebs umount /dev/sdf ;; esac exit 0
…なんかおかしい…。