※この記事は公開されてから1年半以上経過しています。情報が古い可能性がありますのでご注意ください。
こんにちは、佐藤です。今回のブログでは、人気急上昇中のデータコレクタ fluentdを使って、Apache Web Server(以下、Apache)のアクセスログをIDCフロンティア オブジェクトストレージに書き込む手順を紹介したいと思います。
はじめに
昨今、社内・社外でやり取りされる各種ファイル、写真や動画等のリッチメディア、システムが出力するログファイル、そしてM2M(Machine to Machine)で生成されるデータ等、ストレージに保存するデータが急増しており、システム管理者の悩みの種になっています。従来はデータの増加に伴うアプローチとして、ストレージへのディスク追加、ストレージ筐体の追加が行われてきました。しかし、近年、データ増加が予想をはるかに上回るペースで増えており、従来のアプローチでは対応が難しいケースが発生しています。その問題を解決するのがIDCフロンティアのオブジェクトストレージサービスになります。システム管理者はストレージ筐体を自前で持つ必要がなく、そして容量の増加を気にすることなくデータ保存が可能になります。
今回のブログでは、Webサーバーとして多数採用されているApacheのアクセスログを、IDCフロンティア オブジェクトストレージに保存する手順をご紹介します。
オブジェクトストレージサービスについて
オブジェクトストレージは容量無制限のスケーラビリティと高い耐障害性に加え、リーズナブルな価格で利用できる分散型クラウドストレージサービスです。Amazon S3 APIとの互換性が高く、シンプルに設計されたREST形式のWeb APIを通じて、バケットやオブジェクトに対する各種操作を行うことができます。また、インターネットを経由しないプライベート接続にも対応しており、セキュアに通信を行なうことも可能です。詳細については、オブジェクトストレージのサイトをご参照ください。
fluentdについて
fluentdは2011年にシリコンバレーで起業した米国トレジャーデータ社によって開発、運用されているシンプルで汎用的なデータコレクタになります。データコレクタとして古くから使われてきたsyslogdと比べ、ログの収集方法や保存先を柔軟に変更することが可能になります。また、fluentdではログの入力、出力をプラグインで実装されており、Rubyの知識があれば自身でこのプラグインを実装し、fluentdの機能を拡張することが可能になっています。詳細については、こちらをご参照ください。
今回の構成
今回はIDCフロンティア セルフクラウド上にApache Webサーバーを構築し、そのWebサーバーで発生したaccess.logをfluetndを使って、オブジェクトストレージに書き込んでみたいと思います。
それでは構築を開始していきましょう。
サーバーの準備
セルフクラウド上に仮想マシンを準備します。CentOS 6.5のLATESTのテンプレートからサーバーを起動しましょう。
次にポートフォワーディング、ファイアウォールを設定し、sshでログイン、httpアクセスできるようにします。
fluentdのインストール
今回はfluentdの安定版配布パッケージであるtd-agentを使用します。
仮想マシンにSSHログインし、fluentdをインストールします。
# curl -L http://toolbelt.treasuredata.com/sh/install-redhat.sh | sh
fluent-plugin-s3のインストール
Apacheアクセスログを保存するオブジェクトストレージのAPIはAmazon S3互換です。そのため、fluentdのプライグインであるfluent-plugin-s3を使うことで、fluentd経由でオブジェクトストレージにオブジェクトを書き込むことが可能になります。
次のコマンドで、fluent-plugin-s3をインストールします。
# cd /usr/lib64/fluent/ruby/bin/ # ./fluent-gem install fluent-plugin-s3
s3cmdのインストール
オブジェクトストレージに保存されたオブジェクトをs3cmdコマンド(以下、s3cmd)で操作します。あらかじめ、仮想マシンにs3cmdをインストールしておきます。
# cd /var/tmp <strong>任意のディレクトリへ移動</strong> # wget http://sourceforge.net/projects/s3tools/files/s3cmd/1.5.0-alpha3/s3cmd-1.5.0-alpha3.tar.gz # tar zxvf s3cmd-1.5.0-alpha3.tar.gz # cd s3cmd-1.5.0-alpha3 # python setup.py install
Apacheのインストール
仮想マシンにApacheをインストールします。
# yum install -y httpd
Apacheを起動します。
# service httpd start
オブジェクトストレージのユーザーおよびバケット作成
次に仮想マシンからログを転送するオブジェクトストレージの設定を実施します。オブジェクトストレージを使うにはセルフクラウドのアカウントが必要になります。
1) オブジェクトストレージのコントロールパネルからユーザーを作成
セルフポータルにログインし、画面の右上[オブジェクトストレージ]をクリックすると、オブジェクトストレージのコントロールパネルにログインできます。 初回お申し込み時のみ、案内にしたがって必要事項を入力してください。
ログイン後に表示される画面右下の「作成」をクリックします。
リージョン(EAST)及びAPIユーザー名(メールアドレス形式)を入力し、ユーザーを作成します。
次の通りユーザーが作成できていれば成功です。
2) s3cmdの設定変更
s3cmdでオブジェクトストレージを操作できるように設定します。
さきほどs3cmdをインストールした仮想マシンで次のコマンドを実行します。
# s3cmd --configure Access key and Secret key are your identifiers for Amazon S3 Access Key: 確認方法は下記を参照 Secret Key: 確認方法は下記を参照 Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: 何も入力せずにEnter Path to GPG program [/usr/bin/gpg]:何も入力せずにEnter When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP and can't be used if you're behind a proxy Use HTTPS protocol [No]: 何も入力せずにEnter On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't conect to S3 directly HTTP Proxy server name: 何も入力せずにEnter New settings: Access Key: XXXXXXXXXXXXXXXXXXXX Secret Key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX Encryption password: Path to GPG program: /usr/bin/gpg Use HTTPS protocol: False HTTP Proxy server name: HTTP Proxy server port: 0 Test access with supplied credentials? [Y/n] n Save settings? [y/N] y Configuration saved to '/root/.s3cfg' #
Access Key(アクセスキー)およびSecret Key(シークレットキー)はユーザー作成を行ったコントロールパネルから確認します。
設定アイコンをクリックし、「表示」を選択します。
※コントロールパネルへのログインパスワードを入力します。
Access Key(アクセスキー)およびSecret Key(シークレットキー)が表示されます。
作成された、~/.s3cfgのエンドポイントをAmazon S3からオブジェクトストレージに編集します。
# cd # vi .s3cfg host_baseおよびhost_bucketを次の通り編集します。 host_base = ds.jp-east.idcfcloud.com host_bucket = %(bucket)s.ds.jp-east.idcfcloud.com
s3cmdを使ってオブジェクトをリストしてみます。エラーが出力されなければ設定が正常に完了しています。(この時点ではオブジェクトが存在しないため、何も表示されません。)
# s3cmd ls #
3) バケットの作成
s3cmdを使ってバケットを作成します。
バケット名は、オブジェクトストレージ全体でユニークなものである必要があります。既に使用中、または使用されたことがあるバケット名と同じ名前のバケットは作成できません。バケット名の詳細な命名規則はサービス仕様・機能ページをご参照ください。
# s3cmd mb s3://バケット名/ Bucket 's3://バケット名/' created
fluentd(td-agent)の設定変更
fluentdの設定を変更し、fluentd経由でオブジェクトストレージにオブジェクトを書き込めるようにします。
1) td-agent.confのバックアップ
念のため、編集前のtd-agent.confをバックアップしておきます。
# cd /etc/td-agent # cp td-agent.conf td-agent.conf.org
2) td-agent.confの編集
一旦、td-agent.confの内容をクリアします。
# cat /dev/null > td-agent.conf
td-agent.confを次の内容に書き換え、保存します。
# cd /etc/td-agent # vi td-agent.conf
aws_key_id = オブジェクトストレージ コントロールパネルで確認したアクセスキー
aws_sec_key = オブジェクトストレージ コントロールパネルで確認したシークレットキー
s3_bucket = 作成したバケット名
## File input ## read apache logs continuously and tags td.apache.access <source> type tail format apache path /var/log/httpd/access_log tag apache.access pos_file /tmp/td-agent/apache.pos </source> <match apache.access> type s3 aws_key_id XXXXXXXXXXXXXXXXXXXX aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX s3_bucket バケット名 s3_endpoint ds.jp-east.idcfcloud.com check_apikey_on_start false s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension} path logs/ buffer_path /var/log/fluent/idcf flush_interval 60s time_slice_format %Y%m%d-%H </match>
3) fluentdで使用するディレクトリの作成
次のコマンドで、/var/log/fluentの作成、オーナーの変更を行います。
# mkdir /var/log/fluent # chown td-agent:td-agent /var/log/fluent
次のコマンドで、/tmp/td-agentの作成およびオーナーの作成を行います。
# mkdir /tmp/td-agent # chown td-agent:td-agent /tmp/td-agent/
4) Apacheログディレクトリのグループおよびパーミション変更
次のコマンドで、/var/log/httpdのグループおよびパーミションを変更し、Apacheログをtd-agentユーザーで参照可能にします。
# chown root:td-agent /var/log/httpd # chmod 750 /var/log/httpd/
※Apacheのバージョンアップ、再インストールを実施すると、/var/log/httpdのパーミッションはデフォルトに戻るため注意してください。
5) fluentdの起動
次のコマンドで、fluentdを起動します。
# service td-agent start
ブラウザからWebサーバーへアクセス
ローカルマシンのブラウザからWebサーバーへアクセスし、アクセスログを発生させます。
1) アクセスするグローバルIPを確認
セルフクラウドのポータルへアクセスします。
マイリソース > ネットワーク からグローバルIPを確認します。
2) ブラウザからグローバルIPへアクセス
ブラウザから、上記で確認したグローバルIPにアクセスします。
次の通り、Apacheのデフォルト画面が表示されれば、正常にアクセスできています。
これでオブジェクトストレージにApacheのアクセスログが転送されているはずです。確認してみましょう。
オブジェクトストレージへの出力を確認
s3cmdコマンドでアクセスログがオブジェクトストレージに保存されているかを確認します。
1) オブジェクトのリストを表示
次のコマンドで、オブジェクトストレージに保存されたかを確認します。
下記のように圧縮されたログファイルが出力されていれば成功です。
# s3cmd ls s3://バケット名/logs/ 2013-12-25 04:44 160 s3://バケット名/logs/20131225-04_0.gz
2) アクセスログのリストア
次のコマンドで、オブジェクトストレージに保存されたアクセスログを、仮想マシンにリストアしてみます。
# cd /tmp # s3cmd get s3://バケット名/logs/20131225-04_0.gz # zcat 20131225-04_0.gz
備考)td-agent.conf
今回使用したtd-agent.confのパラメータについてのコメントです。今回の設定以外にもfluentdはさまざまさ設定を柔軟に行うことが可能です。詳細については、こちらをご参照ください。
## File input ## read apache logs continuously and tags td.apache.access <source> type tail >> ログの参照にtailインプットプラグインを使用 format apache >> ログ形式としてapacheテンプレートを使用 path /var/log/httpd/access_log >> Apacheアクセスログの出力ファイル tag apache.access >> ログにapache.accessのタグを添付 pos_file /tmp/td-agent/apache.pos >> ログをどこまで送り終ったかを記録するファイル </source> <match apache.access> >> タグがapache.accessとマッチした場合に、次の処理が実行 type s3 >> s3アウトプットプラグインを使用 aws_key_id XXXXXXXXXXXXXXXXXXXX >> オブジェクトストレージを使用するためのアクセスキー aws_sec_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX >> オブジェクトストレージを使用するためのシークレットキー s3_bucket バケット名 >> ログを保存するバケット名 s3_endpoint ds.jp-east.idcfcloud.com >> オブジェクトストレージのエンドポイント check_apikey_on_start false >> fluentd起動時にアクセスチェックを行う機能を無効化(オブジェクトストレージでは必須) s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension} >> オブジェクトストレージに保存される時のファイルフォーマット path logs/ >> オブジェクトストレージに保存される時のパス buffer_path /var/log/fluent/idcf >> 一時キャッシュ用ファイルのパス flush_interval 60s >> オブジェクトストレージにログを保存する間隔 time_slice_format %Y%m%d-%H >> オブジェクトストレージに保存されるログのタイムスタンプフォーマット </match>
次回はs3cmdを使ったオブジェクトストレージのログ保存方法をご紹介します。ご期待ください。
<関連記事>
- 30分でできる!オブジェクトストレージへのログ保存(fluentd編)
- IDCFオブジェクトストレージサービス × ownCloud
- RiakとRiak CSを使って分散ストレージを構築