プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

s3fsが予期せずアンマウントされた場合への対策

[s3] s3 をファイルシステムとしてマウントする で書いたように、s3fs を利用し始めたのですが、@kazuyuki さんから突然マウントが切れることがあるよ、との情報を頂きました。

今のところ、手元の環境ではこのような現象は発生していないのですが、マウントが切れると困るので簡単な対策をしておきます。やりたいことは、マウントが切れた際にメールで教えてくれるのと、自動で再マウントをするというものです。

環境は次のとおりです。

OS:Ubuntu 14.04.1 LTS, 64bit (EC2)

s3fs-fuse:v1.78

 

メール送信のための準備

今回s3fsを試しているサーバー(EC2上)には、メール送信環境がないので、まずはこれを作っておきます。

ローカル環境の状態についての通知を出すだけなので、sendmail/postfixなどのMTA(Mail Transfer Agent)を使うのではなく、メール送信だけに使えるsSMTPを使います(MSP, Mail Submission Program)。MTAやMSPについては下記の参考サイトなどをご覧ください。

 

(参考)

Ubuntu 12.04 でメールサーバを立てずに sSMTP で CRON メールを送信するには

sendmail 8.12とMILTER (FreeBSD PRESS No.8) この『2. 8.12のインストールと設定』にある図が、MTA,MSP等の関係を分かりやすく示してくれています。

 

まず、必要なプログラムをインストールします。

ubuntu@ip-172-31-9-233:~$ sudo apt-get install ssmtp
ubuntu@ip-172-31-9-233:~$ sudo apt-get install mailutils

mailutils はメール送受信用のクライアントプログラムですね。

設定は下記の参考サイトなどを参照して、次のようにしておきます。なお、ここで利用している既存のSMTPサーバーは自分が契約しているさくらインターネットのサーバーになります。

/etc/ssmtp/ssmtp.conf

#
# Config file for sSMTP sendmail
#
# The person who gets all mail for userids < 1000
# Make this empty to disable rewriting.
root=postmaster

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=さくらインターネットのSMTPサーバー:587

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
#hostname=ip-172-31-9-233.ap-northeast-1.compute.internal
hostname=ホスト名

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
#FromLineOverride=YES

# added for SMTP auth
AuthUser=ユーザー名
AuthPass=パスワード
AuthMethod=cram-md5

(参考)

sSMTP でメールを送信できるようにする

 

なお、上記の設定では、サブミッションポート(587番)の設定とSMTP認証を行っています。

 

設定が終わったら、メールの送信テストを行います。

ubuntu@ip-172-31-9-233:~$ echo test mail | mail test@domainname

設定に問題がなければ、メールが届いていると思います。ちなみに、Ubuntuの場合、mailコマンドで送信する場合は、.(ピリオド)で本文の入力が終わるのではなく、Ctrl+Dで終了となるそうです。

https://forums.ubuntulinux.jp/viewtopic.php?id=12176

 

なお、最初設定したとき、hostname にEC2のプライベートIPに対するホスト名が設定されていました。このままでメールの送信を行うと、送信者のアドレスのドメイン名が不明だといわれて、送信に失敗してしまいます。なので、ホスト名にはDNSで解決できる名前にするか、パブリックIPアドレスにする必要がありそうです。

 

マウントの確認

こちらのStackOverFlow記事を参考に、s3のバケット内に空ファイルを作成しておき、これをlsで確認して、確認できなかったら、マウントが切れたと判断します。

チェック用のスクリプト(/etc/s3fs/check_mounts3)はこんな感じです。

#!/bin/sh
#
# check mount s3 via s3fs and remount if mount is broken
#
# Junichi MORI, 2015/6/16

# need for english error message
LANG=C

MOUNT=/etc/s3fs/mounts3
#target file
MOUNT_PT=/mnt/s3fs
TARGET=${MOUNT_PT}/s3fs_exist

# check, whether a target file is exist or not
ls ${TARGET} > /dev/null 2>&1
if [ 0 = $? ]
then
  echo `date --rfc-2822` ": keeping mount s3 via s3fs"
  return 0
else
  echo `date --rfc-2822` ": unexpected umount s3" 1>&2

  # try re-mount
  echo "try re-mount s3fs..." 1>&2
  umount ${MOUNT_PT}
  ${MOUNT}
  if [ 0 = $? ]
  then
    echo "success re-mount s3fs" 1>&2
  else
    echo "failed re-mount s3fs" 1>&2
  fi
  return 1
fi

ここで、s3fs_existというファイルがマウントチェック用のダミーの空ファイルです。

やってることは、s3fs_existファイルをlsで呼び出し、正常終了ならそれまで、異常終了なら、マウントが外れていると判断し再マウントを行う、というだけのものです。なお、マウントが外れた場合はメールで知りたいので、すべて標準エラー出力へ出すようにしています。

チェック用のスクリプト内で呼び出している /etc/s3fs/mounts3 というコマンドは、[s3] s3 をファイルシステムとしてマウントする で書いたrc.localの内容を独立させたもので、s3fsを使ってマウントを実行する内容になっています。こちらも一応載せておきます。

#!/bin/sh
#
# mount s3 via s3fs
#
# Junichi MORI, 2015/6/16

BUCKET=バケット名
FOLDER=フォルダ名
MOUNT_PT=/mnt/s3fs
CACHE_DIR=/tmp

S3FS_OPTION="-o allow_other -o use_cache=${CACHE_DIR}"

#umount /mnt/s3fs
/usr/bin/s3fs ${BUCKET}:${FOLDER} ${MOUNT_PT} ${S3FS_OPTION}

これらのスクリプトが正しく動作しているかコマンドラインから起動して確認しておきます。 

cronからの呼び出し

ここまでくれば、これらをcronから呼び出せば、OKです。

Ubuntuの場合、/etc/cron.dに呼び出すコマンドをcrontab形式で書けばOKです。

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

MAILTO=メールアドレス
# m h dom mon dow user  command
4 *     * * *   root    /etc/s3fs/check_mounts3 1> /dev/null
#

マウントが切れた場合は、標準エラー出力に何かしら出力されるので、その出力内容がメールで飛ばされるという次第です。マウントが切れていない場合は何も出力されないのでメールは飛びません。

コマンドラインからマウントを切って、cronが実行される時間になると、マウントエラーが発生した旨のメールが飛んできて、再マウントもされていました。いい感じです。

当面、これで監視しながら様子を伺うことにします。

 

参考

このほかに使えそうな対策としては、autofs を使いリクエストがあった場合に自動的にマウントするという方法がありました(下記、参考記事の目的はちょっと異なりますが)。場合によってはこの方法のほうが好都合がかもしれません。マウントが切れるという不具合が頻発するようになったら考えてみようと思います。

(参考)

autofsでs3fsを利用する

 

履歴

 2015/9/13 ssmtp と mailutils のインストールの順番を間違えていたので、修正した