- 仮想サーバーとオブジェクトストレージの準備
Ⅰ-ⅰ.仮想サーバーの作成
Ⅰ-ⅱ.オブジェクトストレージの利用を開始 - Webサーバーとfluentdのセットアップ
Ⅱ-ⅰ.fluentdのインストール
Ⅱ-ⅱ.fluent-plugin-s3プラグインのバージョン変更
Ⅱ-ⅲ.Nginx のインストールとBasic認証の設定
Ⅱ-ⅳ.s3cmdのインストールとログ保存用のバケット作成
Ⅱ-ⅴ.fluentdの設定変更
Ⅱ-ⅵ.fluentdを使うためのWebサーバーのセットアップとfluentdの起動 - 動作確認
- 最後に
- 参考情報
- 連載『オブジェクトストレージお手軽活用!』のほかの記事はこちら
第1回:この記事 - 第2回:CloudBerry BackupでWindowsサーバーのバックアップ
ALTUSオブジェクトストレージ(※現在提供終了)は非常に廉価で簡単に使えます。しかし、オブジェクトストレージと聞くと従来のファイルストレージと比較して使い方が難しそう、写真や動画を入れるにはいいけど業務での使いどころがなかなか見いだせないと思われている方がいるかもしれません。確かにリレーショナルデータベースサーバーのデータストアの用途であるとか、大規模で高度な計算を必要とするサーバーのメインストレージで使うような頻繁に更新が起こるシステムにはあまり向いていませんが、一定期間大量のデータを保存して後から分析に利用するであるとか、半永久的にバックアップを保存するなどの二次ストレージとして利用する用途として非常に便利なストレージです。
ALTUS オブジェクトストレージ
ALTUS オブジェクトストレージはAmazon S3がベースになっていますので、インターネットのテクノロジーを使ってWebサーバーにアクセスするかのようにストレージシステムを使うことができます。Amazon S3に接続できるサードパーティーのアプリケーションやミドルウェア、またインターネットで公開されているオープンソースが数多くあり、これらを活用して様々な用途で利用できます。
さて、今回はオブジェクトストレージをWebサーバーのログ保存用ストレージとして使う方法を紹介いたします。ここでは、WebサーバーにNginxを使いサーバーのアクセスログを定期的にオブジェクトストレージに保存します。fluentdと呼ばれる便利なログ収集用ミドルウェアがありますので、このソフトウェアを使って環境を構築していきます。
Ⅰ.仮想サーバーとオブジェクトストレージの準備
今回はALTUS Basicシリーズに仮想サーバーを作成し、Webサーバーとfluentdをセットアップします。
下記の資料を参照して仮想サーバーを作成しました。
コンソールから仮想サーバーを作成する場合:
仮想サーバーの作成
Ⅰ-ⅰ.仮想サーバーの作成
今回用意した仮想サーバーは、次の設定で作成しました。
・ホスト名: nginxServer
・テンプレート: CentOS 6.4 64bit_20140926
・サーバープラン: Custom Server (CPU 2 コア、メモリ 2048 MB)
・rootディスク サイズ: 20.00 GB
・アフィニティグループ: 指定なし
・ファイアーウォール通信許可設定(セキュリティーグループ): 受信規則にてTCP 21番ポート(*SSH)、80番ポート(HTTP)を開放
・仮想サーバーに静的NATでグローバル IP アドレスを割り当て
*SSHのポート番号は21番を使用しました。
Ⅰ-ⅱ.オブジェクトストレージの利用を開始
ALTUSオブジェクトストレージを利用するために、ポータルの「コンソール」画面からオブジェクトストレージ用のアカウントを有効にします。
オブジェクトストレージのエンドポイントはオブジェクトストレージにアクセスするためのFQDNです。アクセスキー、シークレットキーは認証で使います。この後の、fluentdやs3cmdの設定でこれらの値を使いますのでメモ帳などに控えておいてください。
以下の順番で、Webサーバーとfluentdをセットアップしていきます。
- 1.fluentdをインストールします
- 2.fluent-plugin-s3のバージョンを変更します
- 3.Nginxをインストールし、ベーシック認証を有効にします
- 4.s3cmdをインストールし、オブジェクトストレージにログ保存用のバケットを作成します
- 5.fluentdをオブジェクトストレージに接続するための設定をします
6.fluentdを使うためのWebサーバーのセットアップをします
この手順を実施する前に、万一に備えて仮想サーバーのスナップショットを作成することをお勧めします。
1).仮想サーバーに接続
ローカルマシンのターミナルで、作成した仮想サーバーに割り当てたグローバルIPアドレスを使い、rootユーザーでSSH接続します。
2).パッケージの更新
以下のコマンドを実行して、現在のCentOSのバージョンとカーネルのバージョンを確認します。
CentOS release 6.4 (Final)
# uname -r
2.6.32-431.29.2.el6.x86_64
ここでは、カーネルのバージョンを変更せずにパッケージを更新します。
そのため、/etc/sysconfig/kernelファイルを下記のように編集します。
------------------------------------------
#UPDATEDEFAULT=yes
UPDATEDEFAULT=no
------------------------------------------
以下のコマンドを実行して、パッケージを最新の状態にします。
以下のコマンドを実行して、アップデート後のCentOSのバージョンとカーネルのバージョンを確認します。
CentOS release 6.7 (Final)
# uname -r
2.6.32-431.29.2.el6.x86_64
3).fluentdのインストール
以下のコマンドを実行して、td-agentをインストールします。
以下のコマンドを実行して、インストールされたtd-agentのバージョンを確認します。
td-agent 0.10.55
以下のコマンドを実行して、fluentdのバージョンを確認することができます。
fluentd 0.10.55
両方ともバージョン0.10.55がインストールされていることが分かります。
Ⅱ-ⅱ.fluent-plugin-s3プラグインのバージョン変更
1).現在のバージョンの確認
fluentdでオブジェクトストレージにログをアップロードするために、fluent-plugin-s3プラグインを使います。
以下のコマンドを実行して、現在インストールされているプラグインのバージョンを確認します。
fluent-plugin-s3 (0.4.1)
上記の例ではバージョン0.4.1がインストールされていることが分かります。このバージョンのプラグインで使われるオブジェクトストレージの認証方式(Amazon S3の署名バージョン)をALTUSオブジェクトストレージでは使えないため、プラグインのバージョンを変更します。
2).プラグインのバージョン変更
ここでは、動作確認済みの0.3.4を使います。以下のコマンドを実行して、現在のプラグインを削除します。
Successfully uninstalled fluent-plugin-s3-0.4.1
Successfully uninstalled...と出力されれば削除に成功しています。
以下のコマンドを実行して、プラグインが削除されたことを確認します。
#
今度は何も表示されずにコマンドプロンプトに戻ります。
次に、以下のコマンドを実行して、fluent-plugin-s3バージョン0.3.4をインストールします。
# /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-s3 --version "= 0.3.4" --no-rdoc --no-ri
Fetching: aws-sdk-1.8.5.gem (100%)
Fetching: fluent-plugin-s3-0.3.4.gem (100%)
~ 途中省略 ~
Successfully installed tzinfo-data-1.2015.7
Successfully installed mini_portile2-2.0.0.rc2
6 gems installed
以下のコマンドを実行して、プラグインのバージョン0.3.4 がインストールされたことを確認します。
fluent-plugin-s3 (0.3.4)
1).Nginxのインストール
Nginxをmainline からインストールします。
以下のコマンドを実行して、Nginxリポジトリ―をインストールします。
2).リポジトリ―ファイルの編集
/etc/yum.repos.d/nginx.repo を下記のように書き換えます。
# baseurl=http://nginx.org/packages/centos/6/$basearch/
baseurl=http://nginx.org/packages/mainline/centos/6/$basearch/
3).Nginxのインストール
以下のコマンドを実行して、Nginxをインストールします。
4). httpd-toolsのインストール
NginxでBasic認証を使うため、以下のコマンドを実行してhttpd-toolsをインストールします。
5).Nginxのユーザー作成
以下のコマンドを実行して、Basic認証のユーザー・パスワードを設定します。
ここでは、nginxtestユーザーを作成します。
# htpasswd -c .htpasswd nginxtest
New password: nginxtestユーザーのパスワード(任意)
Re-type new password: もう一度入力します
Adding password for user nginxtest
Adding password...が表示されればユーザーの作成に成功しています。
6). Basic認証の設定
Nginxの設定ファイルに以下の行を追加して、Basic認証を有効にします。
server {
listen 80;
server_name localhost;location / {
…
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
・auth_basic_user_fileには5)で作成したBasic認証用ファイル(.htpasswd)のパスを指定します。
- ・特定のパスにBasic認証を適用したいときは、"location / "を適宜変更します。
- 7). Nginxサービスの起動
以下のコマンドを実行して、Nginxを起動します。
以下のコマンドを実行して、Nginxのサービスが正常に起動していることを確認します。
8). Webサーバーの動作確認
グローバルIPアドレスを使ってNginxにブラウザでアクセスして、Basic認証が有効になっていることを確認します。ローカルマシンのブラウザから、Webサーバーに割り当てられているグローバルIP にアクセスします。
http://グローバルIP/
Nginxにログインするためのユーザー名とパスワードを入力して、Nginxのデフォルト画面が表示されれば、正常にアクセスできています。
-
Ⅱ-ⅳ.s3cmdのインストールとログ保存用のバケット作成
Nginxサーバーにs3cmdをインストールします。インストールと設定方法は下記 URLを参照しました。
s3cmdのご利用方法
今回ALTUS環境以外からのアクセスを行わないため、s3cmdの設定のエンドポイントはIDC内の「inter-st.gmocloud.com」を指定します。
s3cmdのインストールおよび設定が完了しましたら、仮想サーバーからオブジェクトストレージへのストレージアクセスを確認するため、以下のコマンド(バケット一覧表示コマンド)を実行し、エラーがないことを確認します。
※まだ、バケットを作成していないため何も表示されません。
以下のコマンドを実行して、ログ保存用のバケットを作成します。
今回はnginxlogバケットを作成します。
Bucket 's3://nginxlog/' created
バケットが作成されたことを確認するため、もう一度バケット一覧を表示します。
2016-01-04 06:44 s3://nginxlog
※nginxlogバケットを作成できない場合、すでに同じ名前のバケットが存在していることが考えられます(この執筆後にも私が引き続き使っているかもしれません)。この場合、別の名前のバケットを作成してください。
以下のコマンドを実行して、編集前のtd-agent.confのバックアップを作成します。
# cp -p td-agent.conf td-agent.conf.bak
2). td-agent.confの修正
以下のコマンドを実行して、td-agent.confファイルを一旦空にします。
# cat /dev/null > td-agent.conf
td-agent.confを以下の内容に書き換え、保存します。
type tail
path /var/log/nginx/access.log
pos_file /var/td-agent/nginx.pos
tag nginx.access
format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
time_format %d/%b/%Y:%H:%M:%S %z
</source><match nginx.access>
type s3
aws_key_id XXXXXXXXXXXXXXXXXXXX
aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
s3_bucket nginxlog
s3_endpoint inter-st.gmocloud.com
check_apikey_on_start false
s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
path logs/
buffer_path /var/log/fluent
flush_interval 10s
time_slice_format %Y%m%d-%H
</match>
aws_key_id オブジェクトストレージのアクセスキーを入力します。
aws_sec_key オブジェクトストレージのシークレットキーを入力します。
s3_bucket ログ保存用に作成したバケット名を入力します。
s3_endpoint IDC内のエンドポイントを入力します。
※NginxのログフォーマットはApacheと異なり、上記のように設定すると「pattern not match」エラーを回避できます。
Ⅱ-ⅵ.fluentdを使うためのWebサーバーのセットアップとfluentdの起動
1). fluentdが利用するディレクトリの作成
以下のコマンドを実行して、/var/log/fluentディレクトリと/var/td-agentディレクトリを作成し、それぞれのディレクトリのオーナーの変更を下記のように行います。
# chown td-agent:td-agent /var/log/fluent
# chown td-agent:td-agent /var/td-agent/
2). fluentdの起動
以下のコマンドを実行して、fluentdを起動します。
以下のコマンドを実行して、fluentdが正常に起動していることを確認します。
td-agent (pid 19136) is running...
td-agent (pid XXX) is running... と表示されれば正常に起動しています。
-
以下のコマンドを実行して、サーバー再起動後に自動でtd-agentを起動するようにします。
-
# chkconfig td-agent on
-
以下のコマンドを実行して、設定が有効になっていることを確認します。
1)ブラウザからグローバルIPへアクセス
もう一度ローカルマシンのブラウザから、Webサーバーに割り当てられているグローバルIP にアクセスします。
http://グローバルIP/
Nginxのデフォルト画面が表示されれば、正常にアクセスできています。
今度は、ブラウザで複数回アクセスしてみてください。CNTL+F5ボタンを押下するとブラウザをリフレッシュできます。
2) オブジェクトストレージにログが保存されていることの確認
s3cmdコマンドでアクセスログがオブジェクトストレージに保存されていることを確認します。ログファイルは前項で作成したバケットの下のlogsというディレクトリに保存されます。
以下のコマンドを実行して、オブジェクトストレージにログが保存されていることを確認します。
2016-01-04 10:14 348 s3://nginxlog/logs/20160104-19_0.gz
2016-01-05 02:22 321 s3://nginxlog/logs/20160105-11_0.gz
2016-01-05 02:22 317 s3://nginxlog/logs/20160105-11_1.gz
※ログファイルは圧縮した状態で保存されます。
※logsディレクトリの後にスラッシュ(/)を入れるとディレクトリの下にあるファイル名 (、ディレクトリ名)の一覧を確認できます。
3) アクセスログの解凍
確認のため、以下のコマンドを実行して、オブジェクトストレージに保存されたアクセスログをNginxサーバーのローカルマシン上にダウンロードして解凍します。
# s3cmd get s3://nginxlog/logs/20160105-11_1.gz
# gunzip 20160105-11_1.gz
ログファイルを解凍したらアクセスログの中を確認します。
2016-01-05T11:22:29+09:00 nginx.access {"remote":"xxx.xxx.xxx.xxx","host":"-","user":"nginxtest","method":"GET","path":"/","code":"200","size":"612","referer":"-","agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36","forwarder":"-"}~ 途中省略 ~
nginxtestユーザーからのアクセスが記録されていることが分かります。
※xxx.xxx.xxx.xxx には送信元のIPアドレスが入ります。
ALTUS オブジェクトストレージは、ここで紹介しましたログストレージ以外にも様々な用途で安価に利用できます。ストレージにはHTTPベースのシンプルなAPIでアクセスできますので複雑な設定なしにすぐに利用できます。オブジェクトストレージはURIをキーとして、ファイル(オブジェクト)そのものをバリューとした一種のキーバリューストアに例えることができますので、このような特徴があることを知っていると、特にプログラマーの方にとってはより理解が深まるかもしれません。
本記事が今後の業務にお役に立てば幸いです。