Friday, April 22, 2016

logrotateを1時間ごとに実行する

logrotateの最新版をインストールして、logrotateを1時間ごとに実行させます。
たとえば、アクセスが多いサーバだとnginxのアクセスログなどが膨らんで、1日1回のローテートと圧縮では、ディスク容量が足りなくなったりすることが、よくあると思います。また、ログの行数が多いと、生ログを調査するときにgrepするのが辛くなってきたりします。そこで、1時間毎にログをローテートして小分けにする方法として、logrotateの最新版でサポートされている hourly オプションを使ってローテートしてみました。

以下、セットアップ方法です。
環境は、CentOS 6.7です。

現在のlogrotateバージョンを確認。
$ logrotate
logrotate 3.7.8 - Copyright (C) 1995-2001 Red Hat, Inc.
現在の各種ライブラリをインストール。rpmbuildで最新版logrotateのrpmファイルを作ります。
$ sudo yum groupinstall "Development Tools" 
$ sudo yum install popt-devel rpmdevtools
$ rpmdev-setuptree
$ wget https://fedorahosted.org/releases/l/o/logrotate/logrotate-3.9.1.tar.gz
$ cp logrotate-3.9.1.tar.gz rpmbuild/SOURCES/
$ tar -zxvf logrotate-3.9.1.tar.gz
$ cp logrotate-3.9.1/logrotate.spec rpmbuild/SPECS
$ rpmbuild -bb rpmbuild/SPECS/logrotate.spec
logrotate最新版をインストール。
$ cd rpmbuild/RPMS/x86_64/
$ sudo rpm -Uvh logrotate-3.9.1-1.x86_64.rpm
# logrotate --version
logrotate 3.9.1
nginxの設定ファイルを編集。
# emacs /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        hourly
        missingok
        rotate 240
        compress
        delaycompress
        create 644 nginx adm
        dateext
        dateformat -%Y%m%d%H
        sharedscripts
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
        endscript
}
logrotateのcronの設定を、dailyからhourlyに移動。
# mv /etc/cron.daily/logrotate /etc/cron.hourly/
しばらく待って、ログを見てみましょう。
# ls -al /var/log/nginx | grep access.log
-rw-r--r--   1 nginx adm    302091 Apr 22 14:12 access.log
-rw-r--r--   1 nginx adm    114085 Apr 22 12:01 access.log-2016042212.gz
-rw-r--r--   1 nginx adm    149606 Apr 22 13:01 access.log-2016042213.gz
-rw-r--r--   1 nginx adm   1240079 Apr 22 14:01 access.log-2016042214
ちゃんとローテートされていますね。

Top pic from Ralph Arvesen Star trails while watching Perseid meteor shower

Monday, April 18, 2016

Goofysを使ってS3をマウント

Amazon S3のバケツをマウントしてファイル操作できるようにします。
S3をマウントする方法としてメジャーなs3fs-fuseというプロダクトがありますが、パフォーマンスが良くないです。色々調べたところ、よりパフォーマンスを重視した、Goofysというプロダクトがあったので、試してみました。
POSIXの規格を厳密に実装せず、パフォーマンスを重視した実装になっているそうです。

以下、セットアップ方法です。

環境
AMI: Amazon Linux AMI 2016.03.0 (HVM), SSD Volume Type - ami-f80e0596 
Type: c4.large

S3でバケツを作成しておきます。
バケツ名は my-goofys-bucket としました。

Goofysをセットアップ
Goとfuseをインストール。
$ sudo yum install -y golang fuse
Goofysをインストール。
$ sudo wget https://github.com/kahing/goofys/releases/download/v0.0.5/goofys -P /usr/local/bin/
$ sudo chmod 755 /usr/local/bin/goofys
$ /usr/local/bin/goofys -h
AWS CLIを設定。
$ aws configure 
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]:
マウントするディレクトリを作成。
$ mkdir ~/mountpoint
ユーザのidを確認。
$ id
uid=503(yako) gid=503(yako) groups=503(yako),10(wheel)
マウント。ここでは、オプションで、allow_other, uid, gidを付けます。現在のユーザ、rootユーザ以外でもディレクトリのファイルを見ることができるようにします。
$ sudo /usr/local/bin/goofys my-goofys-bucket ~/mountpoint -o allow_other,--uid=503,--gid=503
Goofysプロセスが立っているのがわかります。
$ ps auxf | grep goofys
yako      3624  0.0  0.0 110456  2196 pts/1    S+   05:41   0:00              \_ grep --color=auto goofys
yako      3586  0.0  0.4 223236 15592 ?        Ssl  05:38   0:00 /usr/local/bin/goofys my-goofys-bucket /home/yako/mountpoint
ログを確認。
# grep goofys /var/log/messages
Apr 15 05:38:37 ip-172-31-10-234 /usr/local/bin/goofys[3586]: s3.INFO Switching from region 'us-west-2' to 'ap-northeast-1'
Apr 15 05:38:37 ip-172-31-10-234 /usr/local/bin/goofys[3586]: main.INFO File system has been successfully mounted.
テストファイルを置いてみます。
$ touch mountpoint/test.txt
AWS CLIから確認。
$ aws s3 ls s3://my-goofys-bucket
2016-04-15 05:38:53          0 test.txt
ちゃんとファイルが設置されていますね。

アンマウントするには?
rootユーザでアンマウントを実行します。
ディレクトリを使用していないか確認。
$ sudo lsof | grep mountpoint
アンマウント実行
$ sudo umount /home/yako/mountpoint

リブート後も自動マウントされるようにするには?
fstabに追記します。
$ sudo vi /etc/fstab 
/usr/local/bin/goofys#my-goofys-bucket  /home/yako/mountpoint        fuse     _netdev,allow_other,--uid=503,--gid=503    0       0
rootユーザにAWS CLIを設定
$ sudo su 
# aws configure
リブート。
$ sudo su  reboot
起動したら、ファイルを確認してみます。
$ ls mountpoint/
test.txt
無事、マウントされていました。

Goofysが『やらないこと』
・S3に載せたファイルに任意のContent-Typeを設定しない。すべて、 binary/octet-stream になる。
・S3のアクセスコントロールの設定をしない。
もし、コントロールしたいときは、別のスクリプトや、AWS Lambdaを回して設定しましょう。

まとめ
Goofysを使って、S3をマウントしました。
1ヶ月くらい使っていますが、とくに問題は起きていないです。
S3にファイルを集中して損失リスクの責任を持たせるので、個人的には、自前で分散ファイルシステムのNFSを組むより安心感があります。
AWSでは、Amazon EFSを準備中で、プレビュー版を提供中です。リリースされたら、くらべてみたいですね。


Top photo from mezosurfer Goofy Golf Sign

Monday, April 4, 2016

kernelアップデート時に/bootの容量が足りなかったときの対処方法

対象は、CentOSです。yumを使ってカーネルをアップデートしようとしたら。/bootの空きスペースがなくてエラーとなってしまいました。package-cleanupを実行して古いカーネルを削除したら、うまくいきました。これは、そのときのメモです。
# yum update kernel kernel-devel
~~~
Transaction Check Error:
  installing package kernel-2.6.32-573.22.1.el6.x86_64 needs 20MB on the /boot filesystem

Error Summary
-------------
Disk Requirements:
  At least 20MB more space needed on the /boot filesystem.
-> /bootの容量が足りないのでエラーになった。
# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/vda3       38988720 17003752  20003268  46% /
tmpfs            1961360        0   1961360   0% /dev/shm
/dev/vda1          95425    81342      8944  91% /boot
-> 確かに、空きがほとんどないです。

package-cleanupを使えるようにします。
$ yum install yum-utils
古いカーネルを削除。
# package-cleanup --oldkernels
カーネルをアップデート。
# yum update kernel kernel-devel
リブートして、カーネルの更新完了です。
# reboot

Top image from aimee rivers CLEAN ME!